Il est assez facile de planter une table MyISAM.
Dans l'en-tête de chaque table MyISAM se trouve un compteur qui suit le nombre de descripteurs de fichiers ouverts par rapport à la table.
Si vous démarrez mysql et que le nombre dans l'en-tête ne correspond pas au nombre de descripteurs de fichiers réels, mysqld traite la table comme plantée.
Si un simple le REPAIR TABLE mdl_user
fait fonctionner à nouveau à chaque fois sans perte de données, cela peut indiquer que vous avez un site très fréquenté qui écrit mdl_user
.
Si des dizaines de tables l'exigent REPAIR TABLE
, je convertirais toutes les tables en InnoDB. Cependant, si la mdl_user
table est la seule table avec ce problème, vous pouvez faire quelque chose (pour cet exemple, disons que la base de données l'est moodle
);
Si vous voulez que toutes les tables restent MyISAM
ÉTAPE 01: créer un script de table de réparation
echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql
ÉTAPE 02: Déclarez le script de réparation comme fichier de démarrage
Ajoutez ceci à /etc/my.cnf
[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql
ÉTAPE 03: Redémarrez mysql
Chaque redémarrage de mysql déclenchera le script de table de réparation
Si vous voulez que toutes les tables deviennent InnoDB
Exécutez ce code pour créer un script de conversion en masse des tables MyISAM vers InnoDB et affichez-le
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
Une fois que vous êtes satisfait du contenu du script de conversion, exécutez-le
mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql
MISE À JOUR 2012-03-15 14:00 EDT
@Kevin , lors de l'utilisation de MyISAM, que se passe-t-il si vous manquez d'espace disque?
Voici quelque chose à considérer: selon le guide d'étude de certification MySQL 5.0 ,
La puce n ° 11 indique ce qui suit aux pages 408 et 409, section 29.2:
Si vous manquez d'espace disque lors de l'ajout de lignes à une table MyISAM, aucune erreur ne se produit. Le serveur suspend l'opération jusqu'à ce que de l'espace soit disponible, puis termine l'opération.
Lorsque vous manquez d'espace disque, ne vous contentez pas d'arrêter ou de tuer mysql. Le nombre de descripteurs de fichiers ouverts dans tout MyISAM actuellement utilisé n'aura pas été effacé. Ainsi, la table MyISAM est marquée comme plantée. Si vous pouvez libérer de l'espace disque dans le volume de données avec mysqld toujours en cours d'exécution, mysqld se poursuivra une fois que l'espace disque sera disponible.
J'administre également un site moodle sur mysql, et la cause la plus courante de corruption de table pour nous est de manquer d'espace disque.
la source
J'ai trouvé une bonne ligne pour convertir toutes les tables en InnoDB:
la source