domingo, 6 de maio de 2012

Mysql, comando via console, a saga continua! parte 3

Quando eu administrava os servidores de uma empresa que eu trabalhava, 
certo dia uma parte do site parou de funcionar, quando vi foi uma tabela 
que corrompeu (não me pergunte como!), depois de uma busca na 
internet consegui montar o seguinte material:
 
comando para reparar uma tabela: 
 
# mysqlcheck -h localhost -p database tabela --auto-repair
 


Usei o mysqlcheck pra ver o status das tabelas, e também reparar. Nesse documento tem detalhados os procedimentos:
Resumindo o conteúdo do link acima, normalmente o mysqlcheck -c nomedobanco já faz o check. e o mysqlcheck -r nomedobanco repara.
Tem casos onde o root não tem acesso ao banco, aí tem que usar a seguinte sintaxe:

# mysqlcheck -c -u nomedousuario -p –databases nomedobanco

O parametro -p é pra solicitar a senha.
Caso tenha algum banco que não está ok, o resultado desse comando já vai informar o banco, e a tabela com problema. Depois é só executar o mesmo comando alterando -c por -r de repair

mysqlcheck -r -u nomedousuario -p –databases nomedobanco



Abaixo segue um artigo semelhante:

 http://portugalcode.com/index.php?topic=326.0
Autor: @Scroll

Já se tornou um hábito: DBF corrompe. O que muitos não sabem é que os DBF do Visual Fox Pro sobre DBC são muito mais seguros que os DBF em clipper, ainda mais se usando buferização e transações. Mas mesmo assim, os DBF trafegam pela rede, e uma rede mal projetada conseqüentemente fará com que os problemas aconteçam.

Um dia o programador resolve migrar para a arquitetura client/servidor e escolhe por motivos diversos o MySql. Um ótimo banco, mas com o passar do tempo verifica que servidores resetados, problemas no HD e muitas outras coisas fazem com que os arquivos do MySql também corrompam.

O problema é que normalmente você terá que acessar algum font-end do Mysql e rodar uma rotina de reparação do banco de dados. É um processo simples, mas que muitas vezes torna-se complicado porque quem esta na outra ponta é um usuário básico, e acaba-se tomando um grande tempo do suporte para resolver.

O que alguns programadores não sabem é que esse reparo do banco é na verdade um comando nativo do MySql que pode ser dado diretamente pela linguagem de programação, fazendo com que a manutenção no banco MySql possa ser quase transparente para o usuário.

A sintaxe do comando é simples:

Repair table

Mas como saber qual a tabela que esta com problema, e também como saber se ela esta com problemas?

Se uma tabela não esta funcionando corretamente o comando SQL retorna erro e na captura desse erro sempre terá a inscrição MYI (comigo sempre), com isso em mãos podemos fazer na nossa rotina de tratamento dos comandos SQL que ao verificar este erro faça uma manutenção em todo o banco para repará-lo no momento que ocorre o erro. Veja o seguinte processo:
Código:
Function executa_sql

Parameters m.lcsql As String

Local m.lnSucesso As Integer

m.lnSucesso=SQLExec(m.IDSQL,m.lcsql)

If m.lnSucesso=-1

      =Aerror(laErroSQL)

      If "MYI" $ Upper(m.laErroSQL(1,3))

            =Messagebox("O banco necessita de manutenção neste momento, 
aguarde até o final do processamento.")

            SQLExec(m.IDSQL,"show tables from ","cReparar")

            Select cReparar

            Scan All

                  Wait Window At 0,0 "Verificando tabela "+Padl(Recno("cReparar"),4,"0")+" 
de "+Padl(Reccount("cReparar"),4,"0") Nowait Noclear

                  SQLExec(This.Id,"REPAIR TABLE "+Alltrim(cReparar.tables_in_))

            Endscan

            Wait Clear

            =Messagebox("Verificação completa.")

            executa_sql(m.lcExec)

      Endif

Endif

Endfunc


Agora quando a mensagem de erro de tabelas do MySql for detectada o processo repara automaticamente o banco. Note que chamamos a função de forma recursiva para que o comando que falhou agora possa ser executado com sucesso.

Mysql, administração via console parte 4

Fazendo Backup de Tabelas Mysql



Ensino aqui como fazer um backup de segurança de suas tabelas mySQL.

É muito simples, entre no shell do Mysql e digite o comando SQL: 

MYSQL> BACKUP TABLE tabela TO '/diretorio/de/destino'

No diretório escolhido será criado um arquivo chamado tabela.myd.





























É muito simples, mas antes note que:
  • esse comando só funciona com tabelas do tipo MyISAM.
  • o MySQL não sobrescreverá uma tabela existente.
Mas vamos lá.

O comando é:

MYSQL> RESTORE TABLE tabela FROM 'diretorio_onde_esta_copia'

Espero que isso complete as necessidades de backup de todos vocês.

sábado, 16 de janeiro de 2010

Perdeu a senha do administrador do Mysql?

       
         Não se desespere, não quebre nada! e não se descabele, seus problemas acabaram! chegou o revolucionário Recuperator de Senhas Perdeitor Tabajara... ops!!! não é isso, vamos ao que interessa, digita isso no prompt do shell:


        # mysqladmin -u root password 'minhanovasenha'


        Senão der certo siga o procedimento abaixo:


      Pare o MySQL e edite o arquivo my.cnf, pode se encontrar em /etc/my.cnf. Insira a linha:

skip-grant-tables

Dentro da seção [mysqld].

Reinicie o servidor e execute, no Shell:

$ mysql

Então:

mysql> UPDATE mysql.user SET password=PASSWORD('nova_senha') WHERE user='root' AND host='localhost';
mysql> FLUSH PRIVILEGES;

Saia do Mysql e edite o arquivo de configuração my.cnf, removendo a opção skip-grant-tables.  Dica retirado do VivaoLinux

Até a próxima, que a força esteja conosco!

terça-feira, 27 de outubro de 2009

Instalando o PostgreSql 8.4 sem compilação no Slackware

Introdução

Que todos sabemos que o PostgreSql recebe o apelido de "Oracle do Software Livre" não é nenhum segredo, esse nome dispensa comentários, vamos ao que interessa.

Pacotes:

PostgreSql 8.4

Instalação

# cd /pasta/onde/está/o/pacote
# installpkg postgresql-8.4.0-i486-1sl.tgz
# mkdir /var/lib/pgsql/data
# chown -R pgsql:pgsql /var/lib/pgsql
# su - pgsql
$ initdb -D /var/lib/pgsql/data

Feito isso o Postgresql tá instalado, agora para fazer ele incializar, entre no /etc/rc.d e edite o rc.pgsql e troque o valor da variavel $DBCLUSTER para $DBCLUSTER=/var/lib/pgsql/data e ./rc.pgsql start para inicializar e PRONTO!

sexta-feira, 25 de setembro de 2009

Entendendo o comando SCP

O scp é um comando muito util para transferencia de arquivos via console de micro para micro, além de útil é muito facil de usar, veja só:

Transferir um arquivo dentro do micro1 para micro2(192.168.1.5), você pode estando dentro do diretorio do arquivo, ou fora do diretório:
1º Dentro do diretório:

# scp arquivo usuario@192.168.1.5:/diretorio/de/destino/no/micro2

2º Fora do diretório:

# scp /home/usuario/arquivo usuario@192.168.1.5:/diretorio/de/destino/no/micro2

Agora como transferir arquivos do arquivo do micro2 para o micro1(192.168.1.4), porem, estando logado no micro1, para se fazer é preciso saber em qual diretório está o arquivo.

1º Copiar para o diretório atual:

# scp usuario@192.168.1.4:/home/usuario/arquivo .

2º Copiar para outro diretório:

# scp usuario@192.168.1.4:/etc/rc.d/rc.firewall /etc/rc.d

Lembrando que será solicitado a senha do usuário do micro remoto, no exemplo eu utizei os ip's dos micros, se você tiver um dns resolvendo nome de rede, pode utilizar os nomes dos micros.

segunda-feira, 21 de setembro de 2009

Dica: Trocar senha do Webmin

Se esqueceu a senha de administrador do webmin é simples, é só seguir os passos abaixo:

Primeiro entre no diretorio do Webmin, o caminho pode variar de distro para distro eu instalei meu no caminho abaixo, uso o Slackware.

# cd /usr/local/webmin
# perl changepass.pl /etc/webmin administrador senha

No nome do administrador coloque o nome que você utilizou na instalação.


Até a proxima e que a força esteja convosco!

Recurso de Views no Bind

Introdução

Aplicando o sistema de Views no Servidor Dns, ajuda a proporcionar mais segurança e performance, dividindo o sistema de resolução de nomes do sistema de autoridade sobre domínio, permitindo o controle maior sobre os serviços do mesmo, evitando que ip's não autorizados utilizem seu Servidor Dns sem autorização, as Views podem ser usadas sem problemas tanto internamente quanto externamente, oque ocorre aqui é, seu uso interno para resoluções de nomes na rede e na internet (também conhecido como resolução de cache e recursividade), seu uso externo como Dns autoritativo sobre algum domínio ou também liberar para algumas faixas de ip externo para resolução de cache.
Oque estou apresentando aqui é o cenário testado por mim, usado na empresa onde trabalho, porem, o domínio e ip's são fictícios. Por ter 2 placas de rede o Servidor Dns não tem NAT, nenhuma liberação de transporte autorizado pelas placas de rede dele, sendo assim, não é necessário a habilitação do ip_forward, coloquei um script com regras com iptables para aumentar a segurança do mesmo, pois ainda não terminei de montar a DMZ da empresa ;)
Não será abordado o processo de instalação do Bind, pois isso varia de distro para distro e preferencia de cada um, no decorrer do mesmo é considerado que já tenha o Bind instalado


Cenário:

A descrição abaixo é do Servidor Dns primário (Máster).

Distro:
Slackware 12.1

2 Placas-de-rede:
eth0 - 200.200.200.1
eth1 - 192.168.1.2

Dns secundário:
ip externo: 200.200.200.2
ip interno: 192.168.1.3

Bind:
Bind 9.4.3-p1 *

Domínio interno e externo:

adrianobalani.com.br **



Notas:
* Não esquecer de atualizar a sua versão para essa ou maior quem tiver versão do Bind inferior a que está disposta nesse artigo, pois foi descoberta uma vulnerabilidade grave na versão anterior, a falha é acontece quando o servidor recebe repetidamente mensagens de atualização dinâmica, gerando um ataque do tipo negação de serviço.

** No meu caso tenho um controlador de domínio interno com Active Directory com o mesmo nome do site.

Configurando


Seguindo o padrão do Slackware, acho que a maioria das distros tambem, o arquivo named.conf fica dentro de /etc/, é nesse arquivo que faremos a alteração, abaixo segue um exemplo do named.conf, suas diretrizes serão comentadas.

# vim /etc/named.conf

/* PRIMEIRO CRIAMOS AS ACL'S ONDE SERÃO DEFINIDOS OS VALORES COMO REDE INTERNA E DNS'S SECUNDARIOS
*/
// AQUI SEGUE O ENDEREÇO DA REDE INTERNA, SE POSSUIR MAIS QUE UM COLOQUE AQUI
acl "internos" {
192.168.1.0/24;
127.0.0.1;
};

// COLOQUE AQUI OS IP'S DE SEUS DNS'S SECUNDARIOS SE POSSUIR MAIS QUE UM, COLOQUE AQUI ASSIM AJUDA A MANTE-LOS ATUALIZADOS COM O DNS PRIMARIO
acl "dns_interno" {
192.168.1.3;
192.168.1.4;
};
acl "dns_externo" {
200.200.200.2;
200.200.200.3;
};
options {
directory "/var/named";
// AJUDA DIFICULTAR O TRABALHO DE IDENTIFICAR QUAL A VERSÃO DO BIND
version "Microsoft/DNS 7.0b";
// query-source address * port 53;
// NECESSARIO PARA O NOSSO REVERSO FUNCIONAR DE ACORDO COM OS DNS'S DA OPERADORA QUE FORNECEU OS IP'S E LIBERAMOS A OPÇÃO DE ATUALIZAR AS ZONAS DOS SECUNDARIOS
Allow-transfer {201.201.201.1; 201.201.201.2; 200.200.200.2; 200.200.200.3; };
// LIBERA OS IP'S ONDE SERÃO ENTREGUES AS CONSULTAS
listen-on { 200.200.200.1; 192.168.1.2;127.0.0.1; };
// DESABILITA O PROTOCOLO IPV6
listen-on-v6 { none; };
// UM POUCO DE SEGURANÇA NÃO FAZ MAU
dnssec-enable yes;
};

// VAMOS AS VIEWS
view "interna" {
// AQUI DEFINIMOS QUAIS OS CLIENTES QUE FAZEM PARTE DESSA VIEW, QUE FORAM DEFINIDOS NAS ACL'S ACIMA
match-clients { internos; };
// AQUI ESTÁ HABILITADO A OPÇÃO DE RECURSÃO (A BUSCA DE SITES NA NET)
recursion yes;

//AQUI COMEÇA A CONFIGURAÇÃO DE DNS CACHE E RECURSIVO
zone "." IN {
type hint;
file "caching-example/named.root";
};

zone "localhost" IN {
type master;
file "caching-example/localhost.zone";
allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
type master;
file "caching-example/named.local";
allow-update { none; };
};
// AQUI TERMINA A OPÇÃO ANTERIOR E COMEÇA A CONFIGURAÇÃO DO MEU DOMINIO INTERNO AS ZONAS DIRETAS E REVERSA
zone "adrianobalani.com.br" IN {
type master;
file "interno/adrianobalani.int.zone";
allow-update { dns_interno; };
};
zone "1.168.192.in-addr.arpa" IN {
type master;
file "interno/adrianobalani.int.rev";
allow-update { dns_interno; };
};

};
// AQUI COMEÇA A VIEW EXTERNA SEGUE A MESMA SISTEMATICA DA VIEW ANTERIOR, POREM COM ALGUMAS DIFERENÇAS
view "externa" {
// TIPO DE CLIENTE QUE TERÁ ACESSO, NESSE CASO QUALQUER UM
match-clients { any; };
// SEM RECURSÃO, OU MELHOR RESOLUÇÃO DE NOMES
recursion no;
zone "adrianobalani.com.br" IN {
type master;
file "adrianobalani/adriano.zone";
allow-update { 200.200.200.2; 200.200.200.3; };
};
zone "8-1.200.200.200.in-addr.arpa" IN {
type master;
file "adrianobalani/adriano.rev";
allow-update { 200.200.200.2; 200.200.200.3; };
};
};
Pronto, está criado as Views, para uma melhor organização foi criado dentro do diretorio dos arquivos de zona dois subdiretorios /var/named/interno e /var/named/adrianobalani, sendo um responsavel por armazenar os arquivos de zona interno e outro as externas.
Essa foi uma das maneiras em que eu consegui diminuir o uso externo dos Dns's da empresa, sendo assim tivemos um excelente ganho de desempenho, diminuindo quase a zero as respostas negativas e ganhando muita velocidade, porem, abaixo seguem algumas regras do iptables para diminuir as tentativas de DOS e Envenenamento de Cache.

1.iptables -A INPUT -p udp -i eth0 -m state --state NEW --dport 53 -m recent --update --seconds 10 --hitcount 3 -j DROP
2.iptables -A INPUT -p udp -i eth0 -m state --state NEW --dport 53 -m recent --set -j ACCEPT
fonte: http://petryx.blogrs.com.br/2009/03/05/bloqueando-ataque-dns-query-cache-nsin-denied/
Essas regras exigem um tempo minimo de conexão de 10 as conexões que não respeitaram seram bloqueadas.

Espero poder contribuir, estou trabalhando uma maneira de integra-lo com dhcpd e Active Directory, para fazer buscas mais conclusivas na rede interna, e com o dhcpd para adicionar os micros direto na zona direta e reversa.

Mysql, comando via console, a saga continua! parte 3

Quando eu administrava os servidores de uma empresa que eu trabalhava,  certo dia uma parte do site parou de funcionar, quando vi foi uma t...