Vous êtes sur la page 1sur 9

4.9.

6 Usando mysqlcheck para Manuteno de Tabelas e Recuperao em Caso de Falhas


Desde o MySQL verso 3.23.38 voc estar apto a usar a nova ferramenta de reparos e verificao de tabelas MyISAM. A diferena para o myisamchk que o mysqlcheck deve ser usado quando o servidor mysqld estiver em funcionamento, enquanto o myisamchk deve ser usado quando ele no estiver. O benefcio que voc no precisar mais desligar o servidor mysqld para verificar ou reparar suas tabelas. O mysqlcheck utiliza os comandos do servidor MySQL CHECK, REPAIR, ANALYZE e OPTIMIZE de um modo conveniente para o usurio. Existem trs modos alternativos de chamar o mysqlcheck:
shell> mysqlcheck [OPES] database [tabelas] shell> mysqlcheck [OPES] --databases DB1 [DB2 DB3...] shell> mysqlcheck [OPES] --all-databases

Pode ser usado de uma maneira muito similar ao mysqldump quando o assunto for quais bancos de dados e tabelas devem ser escolhidas. O mysqlcheck tem um recurso especial comparado comparado aos outros clientes; o comportamento padro, verificando as tabelas (-c), pode ser alterado renomeando o binrio. Se voc deseja ter uma ferramenta que repare as tabelas como o procedimento padro, voc deve copiar o mysqlcheck para o disco com um outro nome, mysqlrepair, ou crie um link simblico com o nome mysqlrepair. Se voc chamar mysqlrepair agora, ele ir reparar as tabelas como seu procedimento padro. Os nomes que podem ser utilizados para alterar o comportamento padro do mysqlcheck so:
mysqlrepair: A opo padro ser -r mysqlanalyze: A opo padro ser -a mysqloptimize: A opo padro ser -o

As opes disponveis para o mysqlcheck esto listadas aqui, por favor verifique o que a sua verso suporta com o mysqlcheck --help.
-A, --all-databases

Verifica todos os bancos de dados. Isto o mesmo que --databases com todos os bancos de dados selecionados.
-1, --all-in-1

-a, --analyze --auto-repair

Em vez de fazer uma consulta para cada tabela, execute todas as consultas separadamente para cada banco de dados. Nomes de tabelas estaro em uma lista separada por vrgula. Anlise as tabelas fornecidas.

-#, --debug=...

Se uma tabela checada est corrompida, ela corrigida automaticamente. O reparo ser feito depois que todas as tabelas tiverem sido checadas e forem detectadas tabelas corrompidas. Log de sada de depurao. Normalmente 'd:t:o,filename'

--character-sets-dir=... -c, --check

Diretrio onde esto os conjuntos de caracteres. Verifca erros em tabelas

-C, --check-only-changed

--compress -?, --help

Verifica somente tabelas que foram alteradas desde a ltima conferncia ou que no foram fechada corretamente. Utilize compresso no protocolo server/cliente.

-B, --databases

Exibe esta mensagem de ajuda e sai. Para verificar diversos bancos de dados. Perceba a diferena no uso; Neste caso nenhuma tabela ser fornecida. Todos os argumentos so tratados como nomes de bancos de dados.

--default-character-set=... -F, --fast

Configura o conjunto de caracteres padro. Verifica somente as tabelas que no foram fechadas corretamente

-f, --force -e, --extended

Continue mesmo se ns obtermos um erro de sql. Se voc estiver utilizando esta opo com CHECK TABLE, ir garantir que a tabela est 100 por cento consistente, mas leva bastante tempo. Se voc utilizar esta opo com REPAIR TABLE, ele ir executar um comando de reparos na tabela, que no s ir demorar muito tempo para executar, mas tambm pode produzir muitas linhas de lixo.

-h, --host=... -m, --medium-check

Conecta mquina. Mais rpido que verificao extendida, mas encontra somente 99.99 de todos os erros. Deve resolver a maioria dos casos.

-o, --optimize -p, --password[=...]

Otimizador de tabelas Senha para usar ao conectar ao servidor. Se a senha no for fornecida ser solicitada no terminal.

-P, --port=... -q, --quick

Nmero de porta para usar para conexo. Se esta opo for utilizada com CHECK TABLE, evita a busca de registros verificando links errados. Esta a conferncia mais rpida. Se voc estiver utilizando esta opo com REPAIR TABLE, ela tentar reparar somente a rvore de ndices. Este o mtodo de reparo mais rpido para uma tabela.

-r, --repair

-s, --silent

Pode corrigir quase tudo exceto chaves nicas que no so nicas. Exibe somente mensagens de erro.

-S, --socket=... --tables

Arquivo socket para usar na conexo. Sobrepe a opo --databases (-B).

-u, --user=# -v, --verbose -V, --version

Usurio para o login, se no for o usurio atual. Exibe informao sobre os vrios estgios. Exibe informao sobre a verso e sai.

4.5.6.7 Uso do myisamchk para Recuperao em Caso de Falhas


Se voc executa o mysqld com a opo --skip-external-locking (que o padro em alguns sistemas, como o Linux), voc no pode utilizar com segurana o myisamchk para conferir uma tabela se o mysqld estiver utilizando a mesma tabela. Se voc pode ter certeza que ningum est acessando as tabelas atravs do mysqld enquanto voc executa o myisamchk, voc s tem que executar o mysqladmin flush-tables antes de iniciar a verificao das tabelas. Se voc no tem certeza, ento voc deve desligar o mysqld enquanto verifica as tabelas. Se voc executa o myisamchk enquanto o mysqld estiver atualizando as tabelas, voc pode obter um altera que a tabela est corrompida mesmo se no estiver. Se voc no estiver utilizando --skip-external-locking, pode usar o myisamchk para conferir as tabelas a qualquer hora. Enquanto voc faz isto, todos os clientes que tentarem atualizar a tabela iro esperar at que o myisamchk esteja pronto, antes de continuar. Se voc utilizar o myisamchk para reparar ou otimizar tabelas, voc DEVE sempre assegurar que o servidor mysqld no esteja utilizando a tabela (Isto tambm aplica se voc utiliza --skip-external-locking). Se voc no desligar o mysql, voc deve, pelo menos, fazer um mysqladmin flush-tables antes de executar o myisamchk. Suas tabelas podem estar corrompidos se o servidor e o myisamchk acessarem a tabela simultaneamente. Este captulo descreve como checar e lidar com dados corrompidos nos bancos de dados MySQL. Se suas tabelas corromperem com frequncia deve ser encontrada a razo para isto! See section A.4.1 O Que Fazer Se o MySQL Continua Falhando. A seo de tabelas MyISAM contm motivos do porque uma tabela pode estar corrompida. See section 7.1.3 Problemas com Tabelas MyISAM. Quando se realizar recuperao devido a falhas, importante entender que cada tabela nome_tabela em um banco de dados corresponde a tres arquivos no diretrio do banco de dados:

Arquivo
`nome_tabela.frm' `nome_tabela.MYD' `nome_tabela.MYI'

Propsito Arquivo com definies da tabela (form) Arquivo de dados Arquivo de ndices

Cada um destes trs tipos de arquivos est sujeito a corrupo de vrias formas, mas problemas ocorrem mais frequentemente em arquivos de dados e ndices. O myisamchk trabalha criando uma cpia do arquivo de dados `.MYD' linha a linha. Ele termina o estgio de reparos removendo o antigo arquivo `.MYD' e renomeando o novo arquivo com nome original. Se for utilizada a opo --quick, myisamchk no cria um arquivo `.MYD' temporrio, mas assume que o arquivo `.MYD' est correto e somente gera um novo arquivo ndice sem mexer no arquivo de dados. Isto seguro, pois o myisamchk detecta automaticamente se o arquivo `.MYD' est corrompido e aborda o reparo neste caso. Voc pode tambm fornecer duas opes --quick para o myisamchk. Neste caso, o myisamchk no aborta em alguns erros (como chaves duplicadas) mas tenta resolv-los modificando o arquivo `.MYD'. Normalmente o uso de duas opes --quick til somente se voc tiver muito pouco espao em disco para realizer um reparo normal. Neste caso voc deve pelo menos fazer um backup antes de executar o myisamchk.

4.5.6.8 Como Verificar Erros em Tabelas


Para conferir uma tabela MyISAM, utilize os seguintes comandos:
myisamchk nome_tabela

Encontra 99.99% de todos os erros. O que ele no pode encontrar corrompimento que envolva SOMENTE o arquivo de dados (que no comum). Se voc desejar conferir uma tabela, voc deve executar normalmente o myisamchk sem opes ou com as opes -s ou --silent.
myisamchk -m nome_tabela

myisamchk -e nome_tabela

Encontra 99.999% de todos os erros. Ele verifica primeiramente erros em todas as entradas do ndice e ento le todos os registros. Ele calcula um checksum para todas as chaves nos registros e verifica se o checksum o mesmo que o checksum das chaves na rvore de ndices. Realiza a verificao completa de todos os dados (-e significa ``conferncia extendida''). Ele faz uma conferncia lendo todas as chaves de cada registro para verificar se eles realmente apontam para o registro correto. Isto pode demorar MUITO tempo em uma tabela grande com vrias chaves. myisamchk normalmente ir parar depois do primeiro erro que encontrar. Se voc deseja obter mais informaes, pode adicionar a opo --verbose (-v). Isto faz o myisamchk continuar a percorrer a tabela at um mximo de 20 erros. Em utilizao normal, um simples myisamchk (sem argumentos alm do nome da tabela) suficiente.

myisamchk -e -i nome_tabela

Como o comando anterior, mas a opo -i diz ao myisamchk para exibir algumas informaes estatsticas tambm.

4.5.6.9 Como Reparar Tabelas


Na seo seguinte ns s falaremos do uso do myiasmchk em tabelas MyISAM (extenses .MYI e .MYD). Se voc estiver usando tabelas ISAM (extenses .ISM e .ISD), voc deve usar a ferramenta isamchk. A partir do MySQL verso 3.23.14, voc pode reparar tabelas MyISAM com o comando REPAIR TABLE. See section 4.5.5 Sintaxe do REPAIR TABLE. Os sintomas de uma tabela corrompida incluem pesquisas que abortam inesperadamente e erros como estes:
`nome_tabela.frm' is locked against change Can't find file `nome_tabela.MYI' (Errcode: ###)

Unexpected end of file Record file is crashed Got error ### from table handler Para obter mais informaes sobre o erro voc pode executar perror ###. Aqui esto os erros mais comuns que indicam um problema com a tabela:
shell> perror 126 127 132 134 135 136 141 144 145 126 = Index file is crashed / Wrong file format 127 = Record-file is crashed 132 = Old database file 134 = Record was already deleted (or record file crashed) 135 = No more room in record file 136 = No more room in index file 141 = Duplicate unique key or constraint on write or update 144 = Table is crashed and last repair failed 145 = Table was marked as crashed and should be repaired

Note que o erro 135 (no mais no arquivo de registro), no um erro que pode ser corrigido por um simples reparo. Neste caso voc deve fazer:
ALTER TABLE tabela MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;

Voc tambm pode usar esta tcnica para o erro 136 (no mais no arquivo de ndice). Em outros casos, voc deve reparar suas tabelas. myisamchk pode normalmente detectar a maioria das coisas que estiverem erradas. O processo de reparo involve at quatro estgios, descritos abaixo. Antes de comear, voc deve mudar para o diretrio do banco de dados e conferir as permisses dos arquivos de tabelas. Tenha certeza que eles possam ser lidos pelo usurio do Unix com o qual mysqld executado (e para voc, porque voc precisa acessar os arquivos que est conferindo). Se no

estiverem, voc precisa alterar os arquivos, eles tambm devem ter a permisso de escrita para voc. Se voc estiver utilizando o MySQL verso 3.23.16 e superior, voc pode (e deve) usar os comandos CHECK e REPAIR para conferir e corrigir tabelas MyISAM. See section 4.5.4 Sintaxe de CHECK TABLE. See section 4.5.5 Sintaxe do REPAIR TABLE. A seo do manual sobre manuteno de tabelas inclui as opes para isamchk/myisamchk. See section 4.5.6 Utilizando myisamchk para Manuteno de Tabelas e Recuperao em Caso de Falhas. A seguinte seo so para os casos onde o comando acima falhar ou se voc desejar usar os recursos extendidos que o isamchk e myisamchk fornecem. Se voc for reparar uma tabela da linha de comandos, deve primeiro desligar o servidor mysqld. Perceba que quando voc executa mysqladmin shutdown em um servidor remoto, o servidor mysqld ir continuar funcionando por um tempo depois do mysqladmin retornar, at que todas as queries parem e todas as chaves sejam descarregadas no disco. Estgio 1: Verificando suas tabelas Execute myisamchk *.MYI ou myisamchk -e *.MYI se voc tiver tempo disponvel. Utilize a opo -s (silencioso) para suprimir informaes desnecessrias. Se o servidor mysqld parar, deve ser utilizada a opo --update para dizer ao myisamchk marcar a tabela como 'checada'. Voc deve reparar somente as tabelas em que o myisamchk indicar um erro. Para tais tabelas, v para o estgio 2. Se voc obter erros estranhos na verficao (como nos erros out of memory), ou se o myisamchk quebrar, v para o estgio 3. Estgio 2: Reparo simples e seguro NOTA: Se voc deseja que os reparos sejam mais rpidos, devem ser usadas as opes: -O sorf_buffer=# -O key_buffer=# (onde # seria 1/4 da memria disponvel) para todos comandos isamchk/myisamchk. Primeiro, tente usar myisamchk -r -q nome_tabela (-r -q significa ``modo de recuperao rpida''). Ele tentar reparar o arquivo de ndice sem mexer no arquivo de dados. Se o arquivo de dados estiver normal e os links apagados apontam nas localizaes corretas dentro do arquivo de dados, isto deve funcionar e a tabela ser corrigida. Inicie o reparo da prxima tabela. Outra maneira seria utilizar os seguintes procedimentos: 1. Faa um backup do arquivo de dados antes de continuar.

2. Utilize myisamchk -r nome_tabela (-r significa modo de ``recuperao''). Isto remover registros incorretos e deletados do arquivo de dados e reconstroi o arquivo de ndices. 3. Se o passo anterior falhar, utilize myisamchk --safe-recover nome_tabela. O modo de recuperao segura utiliza um metdo de recuperao antiga que trata de alguns casos que o modo de recuperao comum no consegue (porm mais lento). Se voc obter erros estranhos no reparo (como em erros out of memory), ou se o myisamchk falhar, v para o estgio 3. Estgio 3: Reparo difcil Voc s deve atingir este estgio se o primeiro bloco de 16K do arquivo de ndice estiver destrudo ou conter informaes incorretas, ou se o arquivo de ndice no existir. Neste caso, necessrio criar um novo arquivo de ndice. Faa como a seguir: 1. Mova o arquivo de dados para algum lugar seguro. 2. Use o arquivo de descrio de tabelas para criar novos arquivos (vazios) de dados e ndices:
3. 4. 5. 6. shell> mysql> mysql> mysql> mysql nome_bd SET AUTOCOMMIT=1; TRUNCATE TABLE nome_tabela; quit

Se sua verso do MySQL no possuir TRUNCATE TABLE, utilize DELETE FROM nome_tabela. 7. Copie o antigo arquivo de dados de volta para o novo arquivo de dados criado. (No s mova o antigo arquivo de volta para o novo arquivo; voc deve uma cpia no caso de algo der errado.) Volte ao estgio 2. myisamchk -r -q deve funcionar agora. (Isto no deve ser um loop eterno.) No MySQL 4.0.2 voc tambm pode utilizar REPAIR ... USE_FRM o qual realiza todo o procedimento automaticamente. Estgio 4: Reparo muito difcil Voc deve atingir este estgio somente se o arquivo de descrio tambm falhar. Isto nunca deve acontecer, porque o arquivo de descrio no alterado depois da tabela ser criada: 1. Restaure o arquivo de descrio de um backup e volte ao estgio 3. Voc pode tambm restaurar o arquivo de ndice e voltar ao estgio 2. No ltimo caso, voc deve iniciar com myisamchk -r. 2. Se voc no tem um backup mas sabe exatamente como a tabela foi criada, crie uma cpia da tabela em outro banco de dados. Remova o novo arquivo de dados, e ento

mova a descrio e arquivos de ndice do outro banco de dados para o banco de dados com problemas. Isto lhe fornece um novo arquivos ndice e descrio, mas mantm o arquivo de dados da mesma forma. Volte ao estgio 2 e tente reconstruir o arquivo de ndices.

4.5.6.10 Otimizao de Tabelas


Para agrupar registros fragmentados e eliminar perda de espao resultante de remoes ou atualizaes de registros, execute myisamchk no modo de recuperao:
shell> myisamchk -r nome_tabela

Voc pode otimizar uma tabela da mesma forma utilizando a instruo SQL OPTIMIZE TABLE. OPTIMIZE TABLE faz o reparo de tabelas, analisa chaves e tambm ordena a rvore de ndices para fazer pesquisas por chave mais rpidas. Tambm no existem possibilidade de interao no desejvel entre o utilitrio e o servidor, porque o servidor faz todo o trabalho quando voc utiliza OPTIMIZE TABLE. See section 4.6.1 Sintaxe de OPTIMIZE TABLE.
myisamchk tambm tem um nmero de outras opo que podem ser

usadas para melhorar a

performance de uma tabela:


-S, --sort-index -R index_num, --sort-records=index_num -a, --analyze

Para uma descrio completa da opo. See section 4.5.6.1 Sintaxe do myisamchk.

4.5.7 Configurando um Regime de Manuteno das Tabelas


A partir do MySQL Verso 3.23.13, voc pode conferir tabelas MyISAM com o comando CHECK TABLE. See section 4.5.4 Sintaxe de CHECK TABLE. Voc pode reparar tabelas com o comando REPAIR TABLE. See section 4.5.5 Sintaxe do REPAIR TABLE. uma boa idia verificar as tabelas regularmente em vez de esperar que ocorram problemas. Para propsitos de manuteno voc pode utilizar o myisamchk -s para verificar as tabelas. A opo -s (abreviao de --silent) faz com que o myisamchk execute em modo silencioso, exibindo mensagens somente quando ocorrem erros. tambm uma boa idia verificar as tabelas quando o servidor inicia. Por exemplo, sempre que a mquina reinicia no meio de uma atualizao, voc normalmente precisar conferir todas as tabelas que podem ter sido afetadas. (Isto uma``tabela com falhas esperadas''.) Voc pode adicionar um teste ao mysqld_safe que executa myisamchk para conferir todas tabelas que foram modificadas durante as ltimas 24 horas se existir um arquivo `.pid' (process ID) antigo depois do ltimo reboot. (O arquivo `.pid' criado pelo mysqld quando ele inicia e removido quando ele termina normalmente. A presena de um arquivo `.pid' durante a inicializao do sistema indica que o mysqld terminou de forma anormal.)

Um teste ainda melhor seria verificar qualquer tabela cuja a data da ltima modificao mais recente que a do arquivo `.pid'. Voc tambm deve verificar suas tabelas regularmente durante a operao normal do sistema. Na MySQL AB, ns executamos uma tarefa agendada cron para conferir todas nossas tabelas importantes uma vez por semana utilizando uma linha com esta no arquivo `crontab':
35 0 * * 0 /diretrio/do/myisamchk --fast --silent /diretrio/de/dados/*/*.MYI

Isto exibe informaes sobre tabelas com falhas para que possamos examin-las e repar-las quando necessrio. Como ns no estamos tendo tabelas com falhas inesperadas (tabelas corrompidas por razes diferentes de problemas de hardware) por vrios anos (isto realmente verdade), uma vez por semana mais que suficiente para ns. Ns recomendamos que para iniciar, voc execute myisamchk -s a cada noite em todas as tabelas que foram atualizadas durantes as ltimas 24 horas, at que voc confie no MySQL como ns confiamos. Normalmente voc no precisar de tanta manuteno em suas tabelas MySQL. Se voc estiver alterando tabelas com registros de tamanho dinmico (tabelas com colunas VARCHAR, BLOB ou TEXT) ou tem tabelas com vrios registros apagados voc pode desejar de tempos em tempos (uma vez ao ms?) desfragmentar/recuperar espao das tabelas. Voc pode fazer isto utilizando OPTIMIZE TABLE nas tabelas em questo ou se voc puder desligar o servidor mysqld por um tempo faa:
isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM myisamchk -r --silent --sort-index -O sort_buffer_size=16M */*.MYI