domingo, 24 de junho de 2012

Como consertar tabelas no mysql?

Hoje estava verificando alguns logs do mysql e no log de erros encontrei várias linhas assim:
Table './um_dos_bds/nome_da_tabela' is marked as crashed and should be repaired

O que isso significa?
Significa que a tabela foi corrompida e requer manutenção. Simples assim.

Como realizar essa manutenção?
Neste site encontrei algumas opções e optei pelo comando mysqlcheck.

Essa manutenção é algo bem tranquilo de se fazer com o mysqlcheck:
mysqlcheck -uuser -ppassword --auto-repair meu_bancodedados;

Normalmente, esse comando só faz uma verificação das tabelas do banco de dados e informa a situação delas. Mas com o parâmetro --auto-repair ele já faz o que pode para corrigir.
Por questão de facilidade, fiz um shell script, baseado
neste daqui, para consertar todos os bancos de dados do mysql local:
### login e senha (de preferencia root para ter privilegios em todos os bancos de dados) ###
MYUSER="root"
MYPASS="password"

### faz um laco passando por todos os bancos de dados do mysql local ###
DBS="$(mysql -u$MYUSER -p$MYPASS -Bse 'SHOW DATABASES')"
for db in $DBS
do
 #verifica e conserta todas as tabelas do db $db
 mysqlcheck -u$MYUSER  -p$MYPASS --auto-repair $db;
 
 #otimiza tabela por tabela de todos os bancos de dados do mysql local
 for i in `echo "SHOW TABLES" | mysql -u $MYUSER -p$MYPASS $db | grep -v Tables_in_`;
 do
  mysql -u$MYUSER -p$MYPASS -Bse "OPTIMIZE TABLE ${db}.${i}";
 done
done
Já que estou trabalhando sobre todas as tabelas, já rodo uma otimização sobre cada uma. Isso reduz espaço em disco consumido por elas, além de otimizar seus índices e organização. Similar a uma desfragmentação de disco.

Algo que ajudaria bastante seria colocar no cron uma tarefa para dar um trato nos bancos de dados periodicamente. Mas como, principalmente a otimização, pode ser uma tarefa extremamente pesada para o sistema, é melhor que seja realizada em períodos de meses conforme o nível de atividade do seu banco de dados, assim como numa desfragmentação de disco.

É isso. Espero que seja útil para alguém!




Nenhum comentário: