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 | +----------+