ERROR 3664 (HY000): Failed to set SDI 'MyDatabase.MyTable' in tablespace 'mydatabase/mytable'.
Je rencontre cette erreur chaque fois que j'essaie de modifier DROP
une base de données ou ALTER
une table. Je suis incapable de supprimer ou de modifier une table que j'ai créée.
Ce qui est vraiment intéressant, c’est que ces erreurs ne surviennent qu’après le redémarrage de MySQL et la connexion ultérieure (par l’utilisateur root) à MySQL. Voici le motif:
DROP
la base de données ou ALTER
Tables sans problème :)DROP
la base de données ou les tables ALTER
que j'ai créées précédemment, empêchant toute DROP
ou ALTER
:(Il semble que le redémarrage de MySQL lui permette de reconnaître les nouvelles modifications apportées à la base de données et aux tables et de mettre à jour une sorte de SDI (informations du dictionnaire sérialisé) métadonnées associées à ma InnoDB
Tables de base de données et espace de table que je souhaite modifier. En quelque sorte, cette reconnaissance des informations SDI empêche mes commandes ALTER
et DROP
. Cela pourrait-il être un bug dans MySQL? Ou bien, mon utilisateur root pourrait-il ne pas être autorisé à exécuter des commandes qui modifient les données SDI? (Bien que la documentation indique que les données SDI sont modifiées par une API interne.)
Cela m’arrive CHAQUE FOIS que je crée une base de données et des tables. Donc, ma solution de contournement très invalidante pour cette erreur:
DROP DATABASE IF EXISTS MyDatabase;
(vous devrez peut-être vous déconnecter/entrer plusieurs fois, ou redémarrez MySQL et essayez d'accéder aux tables avec les instructions SELECT
pour que cela fonctionne enfin)Toute aide serait grandement appréciée! Je vous remercie!
J'utilise MySQL 8.0.11 Community Server sur un Mac.
Le même problème sans solution: Impossible de supprimer la base de données mysql: ERROR 3664 (HY000)
Plusieurs de mes étudiants et moi-même avons vu ce problème se poser de plus en plus.
En guise de solution de contournement, j'ai trouvé que si vous entrez et faites un analyze table
sur toutes les tables de la base de données problématique, cette erreur sera corrigée jusqu'au prochain redémarrage du serveur.
C'est un correctif associé qui est dans mysql-8.0.11:
_ { https://github.com/mysql/mysql-server/commit/261981bdf42c110f08f98ad2cf84ce6fdef1949e }
sdi_debug.result semble indiquer que
SET GLOBAL DEBUG = '-d, sdi_delete_failure';
est nécessaire pour surmonter le problème.
Si vous videz toutes les tables, vous pouvez alors supprimer le schéma.
Fait intéressant, cette instruction fonctionne si vous utilisez un PDO en PHP
$conn->exec("DROP DATABASE IF EXISTS $dbname");
Le problème est lié aux clés étrangères. Cette déclaration échoue:
CREATE TABLE `lottery` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`club_id` int(11) unsigned DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`details` text,
`open_date` date DEFAULT NULL,
`close_date` date DEFAULT NULL,
`status_id` smallint(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `fk_lottery_club` (`club_id`),
CONSTRAINT `fk_lottery_club` FOREIGN KEY (`club_id`) REFERENCES `club` (`id`) ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Mais si je supprime les clauses KEY et CONSTRAINT, cela fonctionne.
CREATE TABLE `lottery` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`club_id` int(11) unsigned DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`details` text,
`open_date` date DEFAULT NULL,
`close_date` date DEFAULT NULL,
`status_id` smallint(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Après la création, je dois ensuite rajouter ces clés avec ALTER TABLE.
Ennuyeux pour le moins.
FWIW, je recevais le même message d'erreur "Impossible de définir SDI" lors d'une tentative:
ALTER TABLE 'MyDb.MyTable' ADD COLUMN 'myCol' VARCHAR(255)
Dans mon cas, les moteurs de table étaient un mélange de InnoDB
et MyISAM
. Ils devraient tous avoir la valeur InnoDB
et lorsque je les ai changés et que j'ai redémarré le serveur MySQL, les choses ont semblé fonctionner.
Il y avait une variété de fichiers .sdi
dans le répertoire de données de MySql (/usr/local/mysql/data/MyDb/
sur ma machine) ... qui est simplement un fichier json
avec des métadonnées liées à une table spécifique. Ces fichiers SDI ne semblent exister que pour les tables MyISAM.
Avant de réaliser cela, je pensais que le fichier SDI de la table spécifique devait être manquant, ou quelque chose du genre, et il s'avère que mysql a un utilitaire ibd2sdi
dans son répertoire bin qui peut créer un fichier SDI à partir d'un fichier tables ibd
(qui sont également dans le répertoire de données).
Si vous devez vous en tenir à MyISAM
, cela vaut la peine d’y jeter un coup d’œil. Attention toutefois à la modification du contenu d'un fichier SDI, car je rencontrais cette citation dans les journaux de travail MySql :
Vous devez faire très attention lorsque vous procédez ainsi: des modifications incompatibles avec ce qui est stocké dans les fichiers .MYD et .MYI, telles que la modification du type de données d'une colonne, seraient probablement désastreuses et doivent être évitées.
Je ne sais pas si cela est utile, mais j'ai pensé partager.