web-dev-qa-db-ja.com

MySQL 8-DROPまたはALTERがエラー3664(HY000)を引き起こす:SDIの設定に失敗しました

ERROR 3664 (HY000): Failed to set SDI 'MyDatabase.MyTable' in tablespace 'mydatabase/mytable'.

データベースまたはDROPテーブルをALTERしようとするたびに、このエラーが発生します。作成したテーブルを削除または変更できません。

ここで本当に興味深いのは、これらのエラーが発生するのは、MySQLを再起動した後、MySQLに(rootユーザーが)ログインした場合のみです。ここにパターンがあります:

  1. MySQLにrootユーザーとしてログインします。
  2. データベースを作成し、テーブルを作成します。
  3. DROPデータベースまたはALTERテーブル問題なし:)
  4. MySQLを終了する
  5. MySQLを再起動(停止してから開始)
  6. MySQLにrootユーザーとしてログインします。
  7. 以前に作成したデータベースまたはDROPテーブルをALTERしようとすると、エラー3664が発生し、DROPまたはALTERが妨げられます :(

MySQLを再起動すると、新しいデータベースとテーブルの変更を認識し、ある種の SDI(シリアル化された辞書情報)InnoDBデータベーステーブルとテーブルスペースに関連付けられたメタデータを更新できるようです。変更したい。どういうわけか、このSDI情報の認識がALTERおよびDROPコマンドを妨げています。 これはMySQLのバグですか?または、私のrootユーザーに、SDIデータを変更するコマンドを実行する権限がないのでしょうか? (ただし、ドキュメントには、SDIデータは内部APIによって変更されると記載されています。)

これは、データベースとテーブルを作成するたびに発生します。したがって、このエラーの非常に致命的な回避策

  1. データディレクトリ内のデータベースに関連付けられているデータファイルを手動で削除します。
  2. DROP DATABASE IF EXISTS MyDatabase;を呼び出します(ログアウト/数回、またはMySQLを再起動してSELECTステートメントでテーブルにアクセスして、これが最終的に機能するようにする必要がある場合があります)。
  3. 必要なデータベースとテーブルを再作成します。

どんな助けでも大歓迎です!ありがとうございました!


MacでMySQL 8.0.11 Community Serverを実行しています。

解決策のない同じ問題: データベースmysqlをドロップできません:エラー3664(HY000)

9
Tim Arterbury

私と私の生徒数人は、この問題がどんどん発生するのを見てきました。

回避策として、あなたがanalyze table問題のあるデータベースのすべてのテーブルで、次回サーバーを再起動するまでこのエラーを修正します。

6
kyru

これは、mysql-8.0.11にある関連パッチです。

https://github.com/mysql/mysql-server/commit/261981bdf42c110f08f98ad2cf84ce6fdef1949e

sdi_debug.resultは、

SET GLOBAL DEBUG = '-d, sdi_delete_failure';

問題を克服するために必要です。

2
Xypron

すべてのテーブルを空にすると、スキーマを削除できます。

興味深いことに、このステートメントは、PHPでPDOを使用している場合に機能します

$conn->exec("DROP DATABASE IF EXISTS $dbname");
1
pbonner

問題は外部キーに関連しています。このステートメントは失敗します:

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;

しかし、KEY句とCONSTRAINT句を削除すると機能します。

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;

作成後、ALTER TABLEを使用してこれらのキーを追加する必要があります。

控えめに言っても迷惑です。

0
Alec Smythe

FWIW、私がしようとしたときに同じ「SDIの設定に失敗しました」エラーが発生しました:

ALTER TABLE 'MyDb.MyTable' ADD COLUMN 'myCol' VARCHAR(255)

私の場合、テーブルエンジンはInnoDBMyISAMの組み合わせでした。それらはすべてInnoDBである必要があり、私がそれらを切り替えてMySQLサーバーを再起動すると、問題はないように見えました。

いろいろありました.sdi MySqlのデータディレクトリにあるファイル(/usr/local/mysql/data/MyDb/ on my machine)...これは、特定のテーブルに関連するメタデータを含む単純なjsonファイルです。これらのSDIファイルはMyISAMテーブルにのみ存在するようです。

これに気付く前に、特定のテーブルのSDIファイルが欠落している、または何かが必要であると考えましたが、mysqlにはibd2sdibinディレクトリ内のユーティリティ。テーブルibdファイル(データディレクトリにもあります)からSDIファイルを作成できます。

MyISAMにこだわる必要がある場合は、それを確認する価値があるかもしれません。ただし、SDIファイルの内容を変更する場合は注意が必要です。私が遭遇したのは MySql作業ログのこの引用 です。

これを行うときは、十分に注意する必要があります。列のデータ型の変更など、.MYDファイルと.MYIファイルに格納されているものと互換性のない変更は、悲惨であり、回避する必要があります。

これが役立つかどうかはわかりませんが、私は共有したいと思いました。

0
TheMadDeveloper