### 15.21.4 对 InnoDB 数据字典操作进行故障排除

[](<>)

有关表定义的信息存储在 InnoDB[数据字典](glossary.html#glos_data_dictionary).如果您移动数据文件，字典数据可能会变得不一致。

如果数据字典损坏或一致性问题阻止您开始`InnoDB`， 看[第 15.21.3 节，“强制 InnoDB 恢复”](forcing-innodb-recovery.html)有关手动恢复的信息。

#### 无法打开数据文件

[](<>)

和[`innodb_file_per_table`](innodb-parameters.html#sysvar_innodb_file_per_table)启用（默认），以下消息可能会在启动时出现，如果[每表文件](glossary.html#glos_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.html)语句从数据字典中删除有关缺失表的数据。

#### 恢复孤立文件每表 ibd 文件

[](<>)

此过程描述如何恢复孤立[每表文件](glossary.html#glos_file_per_table) `.ibd`文件到另一个 MySQL 实例。如果系统表空间丢失或不可恢复并且您想要恢复，您可以使用此过程`.ibd`新 MySQL 实例上的文件备份。

该过程不支持[通用表空间](glossary.html#glos_general_tablespace) `.ibd`文件。

该过程假定您只有`.ibd`文件备份，您正在恢复到最初创建孤儿的相同版本的 MySQL`.ibd`文件，然后`.ibd`文件备份是干净的。看[第 15.6.1.4 节，“移动或复制 InnoDB 表”](innodb-migration.html)有关创建干净备份的信息。

表导入限制中概述[第 15.6.1.3 节，“导入 InnoDB 表”](innodb-table-import.html)适用于本程序。

1.  在新的 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;
    ```

2.  丢弃新创建的表的表空间。

    ```
    mysql> ALTER TABLE sakila.actor DISCARD TABLESPACE;
    ```

3.  复制孤儿`.ibd`文件从备份目录到新的数据库目录。

    ```
    $> cp /backup_directory/actor.ibd path/to/mysql-5.7/data/sakila/
    ```

4.  确保`.ibd`文件具有必要的文件权限。

5.  导入孤儿`.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
    ```

6.  查询表以验证`.ibd`文件已成功恢复。

    ```
    mysql> SELECT COUNT(*) FROM sakila.actor;
    +----------+
    | count(*) |
    +----------+
    |      200 |
    +----------+
    ```
