有关表定义的信息存储在 InnoDB 数据字典中。如果移动数据文件,字典数据可能会变得不一致。
如果数据字典损坏或一致性问题阻止您启动InnoDB,请参阅第15.21.2 节”强制 InnoDB 恢复”,了解有关手动恢复的信息。

无法打开数据文件


启用innodb_file_per_table(默认值)后,如果缺少文件/表空间文件(.ibd文件),则启动时可能会出现以下消息:

  1. [ERROR] InnoDB: Operating system error number 2 in a file operation.
  2. [ERROR] InnoDB: The error means the system cannot find the path specified.
  3. [ERROR] InnoDB: Cannot open datafile for read-only: './test/t1.ibd' OS error: 71
  4. [Warning] InnoDB: Ignoring tablespace `test/t1` because it could not be opened.

若要解决这些消息,请发出DROP TABLE语句,以从数据字典中删除有关缺失表的数据。

还原孤立文件每表 ibd 文件


此过程介绍如何将每个表.ibd孤立文件还原到另一个 MySQL 实例。如果系统表空间丢失或不可恢复,并且要还原新 MySQL 实例上的.ibd文件备份,可以使用此过程。
常规表空间.ibd文件不支持该过程。
该过程假定您只有.ibd文件备份,正在恢复到最初创建孤立.ibd文件的 MySQL 版本,并且该.ibd文件备份是干净的。有关创建干净备份的信息,请参阅第 15.6.1.4节”移动或复制 InnoDB 表”。
15.6.1.3 节”导入 InnoDB 表”中概述的表导入限制适用于此过程。

  1. 在新的 MySQL 实例上,在同名数据库中重新创建表。

    1. mysql> CREATE DATABASE sakila;
    2. mysql> USE sakila;
    3. mysql> CREATE TABLE actor (
    4. actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    5. first_name VARCHAR(45) NOT NULL,
    6. last_name VARCHAR(45) NOT NULL,
    7. last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    8. PRIMARY KEY (actor_id),
    9. KEY idx_actor_last_name (last_name)
    10. )ENGINE=InnoDB DEFAULT CHARSET=utf8;
  2. 放弃新创建的表的表空间。

    1. mysql> ALTER TABLE sakila.actor DISCARD TABLESPACE;
  3. 将孤立.ibd文件从备份目录复制到新的数据库目录。

    1. shell> cp /backup_directory/actor.ibd path/to/mysql-5.7/data/sakila/
  4. 确保.ibd文件具有必要的文件权限。

  5. 导入孤立.ibd文件。发出警告,指示正在尝试导入文件而不进行InnoDB架构验证。

    1. mysql> ALTER TABLE sakila.actor IMPORT TABLESPACE; SHOW WARNINGS;
    2. Query OK, 0 rows affected, 1 warning (0.15 sec)
    3. Warning | 1810 | InnoDB: IO Read error: (2, No such file or directory)
    4. Error opening './sakila/actor.cfg', will attempt to import
    5. without schema verification
  6. 查询表以验证.ibd文件是否已成功还原。

    1. mysql> SELECT COUNT(*) FROM sakila.actor;
    2. +----------+
    3. | count(*) |
    4. +----------+
    5. | 200 |
    6. +----------+

    原文链接

    https://dev.mysql.com/doc/refman/8.0/en/innodb-troubleshooting-datadict.html