MySQL 8.4 发行说明
关于表定义的信息存储在 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
文件还原到另一个 MySQL 实例。如果您丢失了系统表空间或系统表空间无法恢复,并且希望在新的 MySQL 实例上恢复 .ibd
文件备份,则可以使用此过程。
此过程不支持通用表空间 .ibd
文件。
此过程假定您只有 .ibd
文件备份,您要恢复到最初创建孤立的 .ibd
文件的相同版本的 MySQL,并且 .ibd
文件备份是干净的。有关创建干净备份的信息,请参阅 第 17.6.1.4 节,“移动或复制 InnoDB 表”。
第 17.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=utf8mb4;
丢弃新创建表的表空间。
mysql> ALTER TABLE sakila.actor DISCARD TABLESPACE;
将孤立的
.ibd
文件从您的备份目录复制到新的数据库目录。$> 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 | +----------+