テーブル定義に関する情報は、InnoDB data dictionary に格納されます。 データファイルを移動すると、ディクショナリデータに一貫性がなくなる可能性があります。
データディクショナリの破損や一貫性の問題によって InnoDB
を起動できない場合は、手動のリカバリに関する情報について、セクション15.21.2「InnoDB のリカバリの強制的な実行」を参照してください。
innodb_file_per_table
が有効な場合 (デフォルト)、file-per-table テーブルスペースファイル (.ibd
ファイル) が欠落していると、起動時に次のメッセージが表示されることがあります:
[ERROR] InnoDB: Operating system error number 2 in a file operation.
[ERROR] InnoDB: The error means the system cannot find the path specified.
[ERROR] InnoDB: Cannot open datafile for read-only: './test/t1.ibd' OS error: 71
[Warning] InnoDB: Ignoring tablespace `test/t1` because it could not be opened.
これらのメッセージに対処するには、DROP TABLE
ステートメントを発行して、欠落しているテーブルに関するデータをデータディクショナリから削除します。
この手順では、孤立した file-per-table .ibd
ファイルを別の MySQL インスタンスにリストアする方法について説明します。 システムテーブルスペースが消失またはリカバリ不能で、新しい MySQL インスタンスで .ibd
ファイルのバックアップをリストアする場合は、このプロシージャを使用できます。
プロシージャは、general tablespace .ibd
ファイルではサポートされていません。
この手順では、.ibd
ファイルのバックアップのみがあり、孤立した .ibd
ファイルを最初に作成したのと同じバージョンの MySQL にリカバリしており、.ibd
ファイルのバックアップがクリーンであることを前提としています。 クリーンバックアップの作成の詳細は、セクション15.6.1.4「InnoDB テーブルの移動またはコピー」 を参照してください。
この手順には、セクション15.6.1.3「InnoDB テーブルのインポート」 で概説されているテーブルのインポート制限が適用されます。
-
新しい MySQL インスタンスで、同じ名前のデータベースにテーブルを再作成します。
mysql> CREATE DATABASE sakila; mysql> USE sakila; mysql> CREATE TABLE actor ( actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, first_name VARCHAR(45) NOT NULL, last_name VARCHAR(45) NOT NULL, last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (actor_id), KEY idx_actor_last_name (last_name) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
新しく作成したテーブルのテーブルスペースを破棄します。
mysql> ALTER TABLE sakila.actor DISCARD TABLESPACE;
-
孤立した
.ibd
ファイルをバックアップディレクトリから新しいデータベースディレクトリにコピーします。shell> cp /backup_directory/actor.ibd path/to/mysql-5.7/data/sakila/
.ibd
ファイルに必要なファイル権限があることを確認します。-
孤立した
.ibd
ファイルをインポートします。InnoDB
がスキーマ検証なしでファイルをインポートしようとしていることを示す警告が発行されます。mysql> ALTER TABLE sakila.actor IMPORT TABLESPACE; SHOW WARNINGS; Query OK, 0 rows affected, 1 warning (0.15 sec) Warning | 1810 | InnoDB: IO Read error: (2, No such file or directory) Error opening './sakila/actor.cfg', will attempt to import without schema verification
-
テーブルをクエリーして、
.ibd
ファイルが正常にリストアされたことを確認します。mysql> SELECT COUNT(*) FROM sakila.actor; +----------+ | count(*) | +----------+ | 200 | +----------+