Mysql, comando via console, a saga continua! parte 3
Autor: Balani | Publicado: 2012-05-06T12:50:00-03:00

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



Usei o mysqlcheck pra ver o status das tabelas,&nbsp;e também reparar. Nesse documento tem detalhados os procedimentos:

http://dev.mysql.com/doc/refman/4.1/pt/using-mysqlcheck.html

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&nbsp;-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&nbsp;-p –databases nomedobanco









Abaixo segue um artigo semelhante:



&nbsp;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

&nbsp; &nbsp; &nbsp; =Aerror(laErroSQL)

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

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =Messagebox("O banco necessita de manutenção neste momento,&nbsp;


aguarde até o final do processamento.")

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

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Select cReparar

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Scan All

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Wait Window At 0,0 "Verificando tabela "+Padl(Recno("cReparar"),4,"0")+"&nbsp;


de "+Padl(Reccount("cReparar"),4,"0") Nowait Noclear

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

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Endscan

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Wait Clear

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =Messagebox("Verificação completa.")

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; executa_sql(m.lcExec)

&nbsp; &nbsp; &nbsp; 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.