【理論篇】Percona XtraBackup 恢復單表


小明在某次操作中,誤操作導致誤刪除了某個表,需要立即進行數據恢復。

如果是數據量較小的實例,並且有備份,即便是全備,做一次全量恢復,然后單表導出導入,雖然麻煩一點,卻也花不了多少時間;如果是數據量大的實例,但分表備份的話,那么直接導入的話也是可以的。

現實中往往是比較殘酷的,我們很可能是全量備份,加上增量備份的備份策略,那么這樣的代價就比較大了。

全量備份恢復,再加上 N 個增量的恢復,上百 G 甚至上 T 的數據,在等數據恢復、拷貝數據庫、追同步完成的過程中,估計你后面已經站滿了領導/(ㄒoㄒ)/~~

本文主要介紹利用 XtraBackup 備份工具來實現單表快速恢復,在緊急數據恢復場景下,用最短的時間來恢復數據,最大程度降低損失。

在 MySQL 5.6 之前,對基於 InnoDB 存儲引擎的表,即便開啟 innodb_file_per_table 選項,也是無法通過復制數據文件來達到在不同實例之間復制表的目的的。

但是,通過 Percona XtraBackup 可以導出任意基於 InnoDB 存儲引擎,並且使用獨立表空間的表,還可以把它們導入到 啟用了 XtraDB 存儲引擎的 Percona Server 或者 MySQL 5.6 中(源庫不要求必須是使用 XtraDB 存儲引擎或者 MySQL 5.6,但目標庫要求必須)。這只適用於使用獨立 .ibd 文件的表,不能導出沒有 .ibd 文件的表。

注意:

如果你使用的 Percona Server 版本早於 5.5.10-20.1,變量 innodb_expand_import 應該換成 innodb_import_table_from_xtrabackup

導出表(Exporting tables)

導出表是在准備階段完成,而不是在創建備份的時候。一旦創建完成了一個備份,使用 --export 選項來准備:

$ innobackupex --user=backup_user --password=backup_password --no-timestamp --apply-log --export /path/to/backup

這個操作會為每個啟用獨立表空間的 InnoDB 表創建一個以 .exp 為后綴的文件。這個過程會輸出包含以下內容的信息:

..
xtrabackup: export option is specified.
xtrabackup: export metadata of table 'mydatabase/mytable' to file
`./mydatabase/mytable.exp` (1 indexes)
..

執行完畢,可以在目標目錄看到 .exp 文件:

$ find /data/backups/mysql/ -name export_test.*
/data/backups/mysql/test/export_test.exp
/data/backups/mysql/test/export_test.ibd
/data/backups/mysql/test/export_test.cfg

這三個文件是導入到運行了 MySQL 5.6 或者 啟用了 XtraDB 的 Percona Server 的實例時需要用到的。

注意:

MySQL 使用 .cfg 文件以指定的格式存儲 InnoDB 字典。這個格式與目的相同存儲了 XtraDB 字典的 .exp 不同。嚴格來講,一個 .cfg 文件在導入表空間到 MySQL 5.6 或者 Percona Server 5.6 的時候並不是必須的。一個表空間即便是來自另一個實例,也能夠被成功導入,但 InnoDB 存儲引擎會檢驗 schema 看對應的 .cfg 文件是否存在於同一目錄下。

每個 .exp 或者 .cfg 文件在導入相應的表的時候用到。

注意:

InnoDB 在 export 的時候需要正常關閉,即 purge 所有日志,和合並 change buffer。否則表空間不一致,導致無法導入。適用於所有常見性能問題的注意事項:足夠的緩沖池,即 --use-memory,默認 100M;足夠快的存儲速度,否則需要很長的時間來完成導出。

導入表(Importing tables)

把一張表導入到另一個實例,首先需要創建一張與導入前的原表結構相同的表:

OTHERSERVER|mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;

然后釋放這張表的表空間:

OTHERSERVER|mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

然后,復制 mytable.ibdmytable.exp(或者 mytable.cfg 如果導入到 MySQL 5.6) 文件到數據目錄,接着導入表空間:

OTHERSERVER|mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

一旦這個命令執行完畢,導進來的表數據就可用了。

參考:https://www.percona.com/doc/percona-xtrabackup/2.4/innobackupex/restoring_individual_tables_ibk.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM