MySQL 9.0 发行说明
有关表定义的信息存储在 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 | +----------+