web-dev-qa-db-fra.com

MySQL 8 - DROP ou ALTER provoque ERROR 3664 (HY000): Impossible de définir SDI

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:

  1. Connectez-vous à MySQL en tant qu'utilisateur root.
  2. Créez une base de données et créez des tables.
  3. DROP la base de données ou ALTER Tables sans problème :)
  4. Quitter MySQL
  5. Redémarrez MySQL (stop puis start)
  6. Connectez-vous à MySQL en tant qu'utilisateur root.
  7. Obtenez ERREUR 3664 en essayant de 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:

  1. Supprimez manuellement les fichiers de données associés à la base de données dans le répertoire de données.
  2. Appelez 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)
  3. Recréez la base de données et les tables nécessaires.

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)

8
Tim Arterbury

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.

2
kyru

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.

2
Xypron

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");
1
pbonner

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.

0
Alec Smythe

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.

0
TheMadDeveloper