Nous avons (apparemment) mal exécuté notre moteur de base de données Solaris MySQL hier soir. Au moins certaines des tables InnoDB sont corrompues, avec des erreurs d'horodatage en panne dans le journal des transactions et une erreur spécifique concernant l'index corrompu.
Nous connaissons les outils disponibles pour les réparations de tables MyISAM, mais nous ne trouvons rien pour InnoDB.
Note latérale: la tentative d'optimisation d'une table (dans ma tentative de reconstruction de l'index corrompu) provoque le crash du serveur de base de données.
Tout d'abord arrêtez le serveur et créez une image du disque. Il ne sert à rien d'avoir un seul coup à ce sujet. Alors jetez un oeil ici .
arrêtez votre application ... ou arrêtez votre esclave afin qu'aucune nouvelle ligne ne soit ajoutée
create table <new table> like <old table>;
insert <new table> select * from <old table>;
truncate table <old table>;
insert <old table> select * from <new table>;
redémarrez votre serveur ou esclave
La solution suivante a été inspirée par l'astuce de Sandro ci-dessus.
Attention: alors que cela a fonctionné pour moi, mais je ne peux pas dire si cela fonctionnera pour vous.
Mon problème était le suivant: lire certaines lignes spécifiques d'une table (appelons cette table broken
) plantait MySQL. Même SELECT COUNT(*) FROM broken
le tuerait. J'espère que vous avez un PRIMARY KEY
Sur cette table (dans l'exemple suivant, c'est id
).
CREATE TABLE broken_repair LIKE broken;
INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
LIMIT 100000
Puis utiliser des valeurs inférieures, jusqu'à ce que l'utilisation de LIMIT 1
Plante la base de données).SELECT MAX(id) FROM broken
avec le nombre de lignes dans broken_repair
).OFFSET
au LIMIT
.Bonne chance!
Voici la solution fournie par MySQL: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
Voir cet article: http://www.unilogica.com/mysql-innodb-recovery/ (C'est en portugais)
On explique comment utiliser innodb_force_recovery et innodb_file_per_table . J'ai découvert cela après avoir besoin de récupérer une base de données en panne avec un seul ibdata1 .
En utilisant innodb_file_per_table, toutes les tables dans InnoDB créeront un fichier de table séparé, comme MyISAM.