テーブルに関する特定の問題点は、MySQL
サーバーが、データベースディレクトリ内に格納する
.frm
ファイル内にデータ辞書情報を保存する一方、InnoDB
もまたテーブル領域ファイル内にあるそれ自体のデータ辞書に情報を格納するということです。もし
.frm
ファイルを移動させたり、サーバーがデータ辞書操作の最中にクラッシュしたりすると、.frm
ファイルの場所は、InnoDB
内部データ辞書内に記録された場所と同期しなくなってしまうかもしれません。
同期していないデータ辞書の兆候は、CREATE
TABLE
ステートメントが失敗することです。もしこれが起こったら、サーバーのエラーログを確認する必要があります。もしログが、テーブルはすでに
InnoDB
内部データ辞書内に存在すると報告すると、対応する
.frm
ファイルを持たない
InnoDB
テーブル領域ファイル内に孤立テーブルを持つということになります。エラーメッセージはこのようになります:
InnoDB: Error: table test/parent already exists in InnoDB internal InnoDB: data dictionary. Have you deleted the .frm file InnoDB: and not used DROP TABLE? Have you used DROP DATABASE InnoDB: for InnoDB tables in MySQL version <= 3.23.43? InnoDB: See the Restrictions section of the InnoDB manual. InnoDB: You can drop the orphaned table inside InnoDB by InnoDB: creating an InnoDB table with the same name in another InnoDB: database and moving the .frm file to the current database. InnoDB: Then MySQL thinks the table exists, and DROP TABLE will InnoDB: succeed.
エラーメッセージで指示された方法に従えば、孤立テーブルを削除することができます。もしまだ
DROP TABLE
を無事にに利用できないのであれば、その問題は
mysql
クライアント内での名前補完に原因があるかもしれません。この問題を解決するには、--skip-auto-rehash
オプションを利用して
mysql
クライアントを開始し、もう一度
DROP TABLE
を実行してみてください。(名前補完がオンになっていると、mysql
は今説明したような問題が存在するときに失敗する、テーブル名のリストを構築しようとします)。
同期していないデータ辞書のその他の兆候は、.InnoDB
ファイルを開くことができないエラーを MySQL
がプリントすることです:
ERROR 1016: Can't open file: 'child2.InnoDB'. (errno: 1)
エラーログ内に次のようなメッセージが表示されます:
InnoDB: Cannot find table test/child2 from the internal data dictionary InnoDB: of InnoDB though the .frm file for the table exists. Maybe you InnoDB: have deleted and recreated InnoDB data files but have forgotten InnoDB: to delete the corresponding .frm files of InnoDB tables?
これは InnoDB
内に、対応するテーブルを持たない孤立した
.frm
ファイルがあることを意味します。孤立した
.frm
ファイルは、マニュアルで削除することで削除できます。
もし MySQL が ALTER
TABLE
操作の最中でクラッシュしたら、InnoDB
テーブル領域の中に孤立した一時テーブルができてしまうかもしれません。表モニターを使えば、#sql-
で始まる名前を持つテーブルを表示できます。名前を逆引用符で囲めば、文字
「#
」
を名前に含んでいるテーブル上で SQL
ステートメントを実行することができます。したがって、先ほど説明した方法で、そのような孤立テーブルをほかの孤立テーブルと同じように削除することができます。UNIX
シェル内でファイルをコピーしたりリネームしたりするには、もしファイル名が
「#
」
を含んでいたら、ファイル名を二重引用符で囲まなければいけません。
innodb_file_per_table
が有効になっていると、.frm
ファイルまたは .ibd
ファイル (あるいはその両方)
が見つからない場合に、次のメッセージが発生する可能性があります。
InnoDB: in InnoDB data dictionary has tablespace id N
,
InnoDB: but tablespace with that id or name does not exist. Have
InnoDB: you deleted or moved .ibd files?
InnoDB: This may also be a table created with CREATE TEMPORARY TABLE
InnoDB: whose .ibd and .frm files MySQL automatically removed, but the
InnoDB: table still exists in the InnoDB internal data dictionary.
これが発生した場合には、問題を解決するために次の手順を試してください。
どれかほかのデータベースディレクトリ内で対応する
.frm
ファイルを作成し、それを孤立テーブルが格納されているデータベースディレクトリにコピーします。
元のテーブルに対して
DROP TABLE
を発行します。すると、そのテーブルが正常に削除され、.ibd
ファイルが見つからないことを示す警告が、InnoDB
からエラーログに出力されるはずです。