É bastante fácil para uma tabela do MyISAM falhar.
No cabeçalho de todas as tabelas MyISAM, há um contador que rastreia quantos identificadores de arquivos abertos existem na tabela.
Se você iniciar o mysql e o número no cabeçalho não corresponder ao número real de identificadores de arquivos, o mysqld tratará a tabela como travada.
Se um simples REPAIR TABLE mdl_user
faz com que ele funcione novamente todas as vezes sem perda de dados, isso pode indicar que você tem um site com tráfego muito alto que grava mdl_user
.
Se dezenas de tabelas exigirem isso REPAIR TABLE
, eu converteria todas as tabelas para o InnoDB. No entanto, se a mdl_user
tabela é a única tabela com esse problema, há algo que você pode fazer (neste exemplo, digamos que o banco de dados seja moodle
);
Se você deseja que todas as tabelas sejam deixadas como MyISAM
PASSO 01: Criar um script de tabela de reparo
echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql
PASSO 02: Declarar o script de reparo como o arquivo de inicialização
Adicione isso ao /etc/my.cnf
[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql
PASSO 03: Reinicie o mysql
Toda reinicialização do mysql acionará o Script da Tabela de Reparos
Se você deseja que todas as tabelas se tornem InnoDB
Execute esse código para criar um script de conversão em massa das tabelas MyISAM para o InnoDB e visualize-o
MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"
echo "SET SQL_LOG_BIN = 0;" > /root/ConvertMyISAMToInnoDB.sql
mysql ${MYSQL_CONN} -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > /root/ConvertMyISAMToInnoDB.sql
less /root/ConvertMyISAMToInnoDB.sql
Quando estiver satisfeito com o conteúdo do script de conversão, execute-o
mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql
ATUALIZAÇÃO 15-03-2012 14:00 EDT
@ Kevin , enquanto estiver usando o MyISAM, e se ficar sem espaço em disco é seu problema?
Aqui está algo a considerar: De acordo com o MySQL 5.0 Certification Study Guide ,
bulletpoint # 11 diz o seguinte nas páginas 408.409 Seção 29.2:
Se você ficar sem espaço em disco ao adicionar linhas a uma tabela MyISAM, nenhum erro ocorrerá. O servidor suspende a operação até que o espaço fique disponível e, em seguida, conclui a operação.
Quando você ficar sem espaço em disco, não basta desligar ou matar o mysql. A contagem de identificadores de arquivos abertos em qualquer MyISAM usado atualmente não será limpa. Assim, a tabela MyISAM está marcada como travada. Se você pode liberar espaço em disco no volume de dados com o mysqld ainda em execução, o mysqld será ativado assim que o espaço em disco for disponibilizado.