Fui trabalhar à tarde e fiquei chocado ao saber que havia um problema com meu site dedecms. Quando o visitei, encontrei um erro de tela cheia. Verifiquei o log do mysql e a mensagem de erro era:
Tabela '.. dedecmsv4dede_archives' está marcado como travado e deve ser reparado.
Diz cms A tabela de artigos dede_archives está marcada como problemática e precisa ser reparada. Então, restaurei rapidamente os dados históricos e entrei na Internet para descobrir a causa. O problema acabará por ser resolvido. A solução é a seguinte:
Encontre a ferramenta bin/myisamchk no diretório de instalação do mysql e digite na linha de comando:
myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
Então a ferramenta myisamchk irá ajudá-lo a restaurar o índice da tabela de dados. Reinicie o mysql e o problema estará resolvido.
Análise do problema:
1. A causa do erro. Alguns internautas disseram que foi um erro de índice causado por consultas e atualizações frequentes da tabela dede_archives. Como minha página não foi gerada estaticamente, mas sim uma página dinâmica, concordo plenamente com esta afirmação. . Também é dito que o banco de dados MYSQL foi danificado por algum motivo. Por exemplo, uma queda repentina de energia no servidor de banco de dados, alguma operação no arquivo original da tabela ao fornecer serviços à tabela do banco de dados pode fazer com que o banco de dados MYSQL seja danificado. danificado A tabela está corrompida e os dados não podem ser lidos. Resumindo, o relógio está danificado devido a alguns problemas insondáveis.
O número do problema é 145
2. Solução para o problema.
Ao tentar reparar um problema de tabela corrompida, existem três tipos de reparos. Se você receber uma mensagem de erro informando que um arquivo temporário não pode ser criado, exclua o arquivo indicado pela mensagem e tente novamente - geralmente é um resquício de uma operação de reparo anterior.
As três correções são as seguintes:
% myisamchk --recover --quick /caminho/para/tblName
% myisamchk --recover /caminho/para/nometbl
% myisamchk --safe-recover /caminho/para/tblName
O primeiro é o mais rápido e serve para resolver os problemas mais comuns; o último é o mais lento e serve para resolver problemas que não podem ser resolvidos por outros métodos;
Verificando e reparando arquivos de dados MySQL Se os métodos acima não conseguirem reparar uma tabela danificada, antes de desistir, você também pode tentar estas duas dicas:
Se você suspeitar que ocorreu um erro irreparável no arquivo de índice (*.MYI) da tabela, ou mesmo que o arquivo foi perdido, você pode usar o arquivo de dados (*.MYD) e o arquivo de formato de dados (*.frm) para regenerá-lo. Primeiro faça uma cópia do arquivo de dados (tblName.MYD). Reinicie seu serviço MySQL e conecte-se a ele Use o seguinte comando para excluir o conteúdo da tabela:
mysql> DELETE FROM nometabela;
Ao excluir o conteúdo da tabela, um novo arquivo de índice será criado. Efetue logout e feche o serviço novamente e, em seguida, substitua o novo arquivo de dados (vazio) pelo arquivo de dados que você acabou de salvar (tblName.MYD). Finalmente, use myisamchk para realizar um reparo padrão (o segundo método acima) para regenerar os dados do índice com base no conteúdo dos dados da tabela e no arquivo de formato da tabela.
Se o arquivo de formato da sua tabela (tblName.frm) estiver faltando ou tiver um erro irreparável, mas você souber como usar a instrução CREATE TABLE correspondente para regenerar a tabela, poderá gerar novamente um novo arquivo .frm e usá-lo com seus arquivos de dados. e arquivos de índice (se houver um problema com o arquivo de índice, use o método acima para reconstruir um novo). Primeiro faça uma cópia dos arquivos de dados e índice e, em seguida, exclua os arquivos originais (exclua todos os registros relacionados a esta tabela no diretório de dados).
Inicie o serviço MySQL e crie uma nova tabela usando o arquivo CREATE TABLE original. O novo arquivo .frm deve funcionar bem, mas é melhor executar um reparo padrão (o segundo método acima).
3. Introdução à ferramenta myisamchk (consulte o manual oficial do mysql
Você pode usar o utilitário myisamchk para obter informações sobre tabelas de banco de dados ou para verificá-las, repará-las e otimizá-las). myisamchk se aplica a tabelas MyISAM (tabelas correspondentes a arquivos .MYI e .MYD).
Método para chamar myisamchk:
shell> myisamchk [opções] nome_tabela ...
options especifica o que você deseja que o myisamchk faça. Eles são descritos posteriormente. Você também pode obter uma lista de opções chamando myisamchk --help.
tbl_name é a tabela do banco de dados que você deseja verificar ou reparar. Se você não executar o myisamchk em algum lugar do diretório do banco de dados, deverá especificar o caminho para o diretório do banco de dados porque o myisamchk não sabe onde seu banco de dados está localizado. Na verdade, myisamchk não se importa se o arquivo em que você está operando está localizado em um diretório de banco de dados; você pode copiar o arquivo correspondente à tabela de banco de dados em outro lugar e executar a operação de restauração lá;
Se desejar, você pode usar a linha de comando myisamchk para nomear várias tabelas. Você também pode especificar uma tabela nomeando o arquivo de índice (com o sufixo ".MYI"). Permite especificar todas as tabelas em um diretório usando o esquema "*.MYI". Por exemplo, se você estiver no diretório do banco de dados, poderá verificar todas as tabelas MyISAM no diretório assim:
shell> myisamchk *.MYI
Se você não estiver no diretório do banco de dados, poderá verificar todas as tabelas especificando o caminho para o diretório:
shell> myisamchk /path/to/database_dir/*.MYI
Você pode até verificar todas as tabelas em todos os bancos de dados especificando um curinga para o caminho para o diretório de dados do MySQL:
shell> myisamchk /path/to/datadir/*/*.MYI
A maneira recomendada de verificar rapidamente todas as tabelas MyISAM é:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
Se você deseja verificar todas as tabelas MyISAM e reparar quaisquer tabelas corrompidas, você pode usar o seguinte comando:
shell> myisamchk --silent --force --fast --update-state
-O key_buffer=64M -O sort_buffer=64M
-O read_buffer=1M -O write_buffer=1M
/caminho/para/datadir/*/*.MYI
Este comando pressupõe que você tenha mais de 64 MB de memória livre. Para obter detalhes sobre a alocação de memória com myisamchk, consulte a Seção 5.9.5.5, “Uso de memória do myisamchk”.
Ao executar myisamchk, você deve garantir que outros programas não estejam usando a tabela. Caso contrário, ao executar o myisamchk, a seguinte mensagem de erro será exibida:
aviso: os clientes estão usando ou não fecharam a tabela corretamente
Isto indica que você está tentando verificar uma tabela que está sendo atualizada por outro programa (como o servidor mysqld) que não fechou o arquivo ou terminou sem fechar o arquivo corretamente.
Se o mysqld estiver rodando, você deve forçar a liberação de quaisquer modificações na tabela ainda na memória via FLUSH TABLES. Ao executar myisamchk, você deve garantir que outros programas não estejam usando a tabela. A maneira mais fácil de evitar o problema é usar CHECK TABLE em vez de myisamchk para verificar a tabela.