MySQL 8.4 Release Notes
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
文件恢复到另一个 MySQL 实例中。您可能会使用这个过程,如果系统表空间丢失或不可恢复,并且您想在新 MySQL 实例上恢复.ibd
文件备份。
该过程不支持general 表空间.ibd
文件。
该过程假设您只有.ibd
文件备份,您正在恢复到创建孤儿.ibd
文件的同一版本MySQL,并且.ibd
文件备份是干净的。请参阅第17.6.1.4节,“Moving or Copying InnoDB 表”了解创建干净备份的信息。
本过程中所述的表导入限制在第17.6.1.3节,“Importing 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 | +----------+