テーブルに関する特定の問題点は、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
テーブルスペースの中に孤立したテンポラリ
テーブルができてしまうかもしれません。innodb_table_monitor
を利用して、#sql-...
が誰の名前なのかが表示されたテーブルのリストを確認する事ができます。名前をバックフォートで囲めば、文字
‘#
’
を名前に含んでいるテーブル上で SQL
ステートメントを実行する事ができます。したがって、先ほど説明した方法で、そのような孤立テーブルを他の孤立テーブルと同じようにドロップする事ができます。Unix
シェル内でファイルをコピーしたりリネームしたりするには、もしファイル名が
‘#
’
を含んでいたら、ファイル名を二重引用符で囲まなければいけない事を覚えておいてください。