文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  排查 InnoDB 数据字典操作问题

17.20.4 排查 InnoDB 数据字典操作问题

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

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

无法打开数据文件

启用 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 文件

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

此过程不支持通用表空间 .ibd 文件。

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

第 17.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 |
    +----------+