在「How to Restore a Single InnoDB Table from a Full Backup After Accidentally Dropping It」這篇提到了 MySQL InnoDB 單表復原的事情。
文章裡先提到了 2012 年的文章「How to recover a single InnoDB table from a Full Backup」,講更特定的情況。
這邊兩篇的大前提都是使用 innodb_file_per_table
。
2012 的文章裡講的是誤刪 (DELETE
) 後的處理,如果是 DROP TABLE
、TRUNCATE
或是因為 ALTER TABLE
而造成資料遺失的話,就不能用這篇文章的方式處理:
You must not drop, truncate or alter the schema of the table after the backup has been taken.
如果很幸運是因為 DELETE
而遺失的話,在文章裡有提到 innobackupex 這個工具,透過 innobackupex 備份的資料才有辦法依照文章裡的方法做到單表復原。
先 discard tablespace:
mysql> set FOREIGN_KEY_CHECKS=0; mysql> ALTER TABLE salaries DISCARD TABLESPACE;
然後把檔案 cp 進去:
cp /tmp/2012-01-22_14-13-20/employees/salaries.ibd /var/lib/mysql/data/employees/
最後再 import tablespace 回去:
mysql> set FOREIGN_KEY_CHECKS=0; mysql> ALTER TABLE salaries IMPORT TABLESPACE; mysql> set FOREIGN_KEY_CHECKS=1;
而 2017 講的誤刪則是補充了 2012 文章裡另外的情況,用途也比較廣,但動作比較複雜。
本來的四個步驟:
- Prepare the backup
- Discard the tablespace of the original table
- Copy .ibd from the backup to the original table path
- Import the tablespace
變成了七個步驟:
- Prepare the backup
- Extract the original table structure from the backup (i.e., extract the create statement from the backup .frm file)
- Create a new empty table
- Apply some locks
- Discard the newly created tablespace
- Copy back .ibd from the backup
- Import the tablespace
粗體的部份就是不一樣的部份,多出來的步驟產生出同樣的環境配合 .ibd
,然後讓 .ibd
檔匯進 MySQL。
實際練過一次會比較有感覺 (應該可以在 Docker 裡測試),等不幸遇到的時候手腳比較不會慌亂...