ERROR 3664 (HY000): Failed to set SDI 'MyDatabase.MyTable' in tablespace 'mydatabase/mytable'.
データベースまたはDROP
テーブルをALTER
しようとするたびに、このエラーが発生します。作成したテーブルを削除または変更できません。
ここで本当に興味深いのは、これらのエラーが発生するのは、MySQLを再起動した後、MySQLに(rootユーザーが)ログインした場合のみです。ここにパターンがあります:
DROP
データベースまたはALTER
テーブル問題なし:)DROP
テーブルをALTER
しようとすると、エラー3664が発生し、DROP
またはALTER
が妨げられます :(MySQLを再起動すると、新しいデータベースとテーブルの変更を認識し、ある種の SDI(シリアル化された辞書情報)InnoDB
データベーステーブルとテーブルスペースに関連付けられたメタデータを更新できるようです。変更したい。どういうわけか、このSDI情報の認識がALTER
およびDROP
コマンドを妨げています。 これはMySQLのバグですか?または、私のrootユーザーに、SDIデータを変更するコマンドを実行する権限がないのでしょうか? (ただし、ドキュメントには、SDIデータは内部APIによって変更されると記載されています。)
これは、データベースとテーブルを作成するたびに発生します。したがって、このエラーの非常に致命的な回避策:
DROP DATABASE IF EXISTS MyDatabase;
を呼び出します(ログアウト/数回、またはMySQLを再起動してSELECT
ステートメントでテーブルにアクセスして、これが最終的に機能するようにする必要がある場合があります)。どんな助けでも大歓迎です!ありがとうございました!
MacでMySQL 8.0.11 Community Serverを実行しています。
解決策のない同じ問題: データベースmysqlをドロップできません:エラー3664(HY000)
私と私の生徒数人は、この問題がどんどん発生するのを見てきました。
回避策として、あなたがanalyze table
問題のあるデータベースのすべてのテーブルで、次回サーバーを再起動するまでこのエラーを修正します。
これは、mysql-8.0.11にある関連パッチです。
https://github.com/mysql/mysql-server/commit/261981bdf42c110f08f98ad2cf84ce6fdef1949e
sdi_debug.resultは、
SET GLOBAL DEBUG = '-d, sdi_delete_failure';
問題を克服するために必要です。
すべてのテーブルを空にすると、スキーマを削除できます。
興味深いことに、このステートメントは、PHPでPDOを使用している場合に機能します
$conn->exec("DROP DATABASE IF EXISTS $dbname");
問題は外部キーに関連しています。このステートメントは失敗します:
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を使用してこれらのキーを追加する必要があります。
控えめに言っても迷惑です。
FWIW、私がしようとしたときに同じ「SDIの設定に失敗しました」エラーが発生しました:
ALTER TABLE 'MyDb.MyTable' ADD COLUMN 'myCol' VARCHAR(255)
私の場合、テーブルエンジンはInnoDB
とMyISAM
の組み合わせでした。それらはすべてInnoDB
である必要があり、私がそれらを切り替えてMySQLサーバーを再起動すると、問題はないように見えました。
いろいろありました.sdi
MySqlのデータディレクトリにあるファイル(/usr/local/mysql/data/MyDb/
on my machine)...これは、特定のテーブルに関連するメタデータを含む単純なjson
ファイルです。これらのSDIファイルはMyISAMテーブルにのみ存在するようです。
これに気付く前に、特定のテーブルのSDIファイルが欠落している、または何かが必要であると考えましたが、mysqlにはibd2sdi
binディレクトリ内のユーティリティ。テーブルibd
ファイル(データディレクトリにもあります)からSDIファイルを作成できます。
MyISAM
にこだわる必要がある場合は、それを確認する価値があるかもしれません。ただし、SDIファイルの内容を変更する場合は注意が必要です。私が遭遇したのは MySql作業ログのこの引用 です。
これを行うときは、十分に注意する必要があります。列のデータ型の変更など、.MYDファイルと.MYIファイルに格納されているものと互換性のない変更は、悲惨であり、回避する必要があります。
これが役立つかどうかはわかりませんが、私は共有したいと思いました。