Documentation Home
MySQL 8.0 参考手册  / 第 15 章 InnoDB 存储引擎  / 15.21 InnoDB 故障排除  /  15.21.4 InnoDB 数据字典操作故障排除

15.21.4 InnoDB 数据字典操作故障排除

有关表定义的信息存储在 InnoDB 数据字典中。如果您四处移动数据文件,字典数据可能会变得不一致。

如果数据字典损坏或一致性问题阻止您启动InnoDB,请参阅 第 15.21.3 节,“强制 InnoDB 恢复”以获取有关手动恢复的信息。

无法打开数据文件

启用(默认)后,如果缺少 file-per-table 表 空间文件 ( file),则innodb_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语句以从数据字典中删除有关缺失表的数据。

恢复孤立文件每表 ibd 文件

此过程描述了如何将孤立 的 file-per-table .ibd文件恢复到另一个 MySQL 实例。如果系统表空间丢失或不可恢复并且您希望.ibd 在新的 MySQL 实例上恢复文件备份,则可以使用此过程。

一般表空间 .ibd文件 不支持该过程 。

该过程假设您只有 .ibd文件备份,您正在恢复到最初创建孤立 .ibd文件的同一版本的 MySQL,并且 .ibd文件备份是干净的。有关创建干净备份的信息,请参阅 第 15.6.1.4 节,“移动或复制 InnoDB 表”

第 15.6.1.3 节“导入 InnoDB 表”中 概述的表导入限制 适用于此过程。

  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=utf8mb4;
  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 |
    +----------+