寫在前面
作為一名DBA,最擔心受怕的莫過於誤操作刪除庫表,數據整沒了,無論是大公司,還是小公司,都存在或者難免遇到類似情況,DBA的工作就是在刀口舔血,無時無刻不面臨」從刪庫到跑路「的風險。業內類似事故比比皆是,不勝枚舉。那麼,有沒有可行的方案可以及時處理刪除庫表問題呢?今天我們一起研究一下單庫表快速備份恢復神器。
前提條件
mysql version 5.6+,筆者測試版本為:percona server 5.6.29-76.2-log
開啟innodb_file_per_table
ENGINE:XtraDB or InnoDB
備份帳號權限:
RELOAD and LOCK TABLES
REPLICATION CLIENT
PROCESS
SUPER
工具介紹
這就是著名的percona xtrabackup工具,該工具除了可以全量備份和增量備份,還有一個很重要的功能,就是部分庫表備份,支持在線物理備份庫表文件,同時在線恢復庫表數據,可謂是刪除庫表的剋星。
如下按照單個庫表分別介紹。
單表備份方法:
innobackupex --export--include=<table_name> /path/to/backup
innobackupex --apply-log --export /path/to/backup
單表恢復方法:
1 手動創建表結構
可以在物理備份的時候,同時備份表結構到sql文件,直接執行該sql文件即可
2 廢棄tablespace
ALTER TABLE <table_name> DISCARDTABLESPACE;
3 拷貝數據文件
拷貝備份文件 .cfg .ibd文件到表文件所在目錄,注意修改文件屬主
3 導入數據
ALTER TABLE <table_name> IMPORTTABLESPACE;
單庫備份方法:
innobackupex --export--databases=<db_name> /path/to/backup
innobackupex --apply-log --export /path/to/backup
單庫恢復方法:
1 創建庫表結構
可以在物理備份之前,備份該庫的表結構到sql文件,然後此處執行sql文件即可。
2 針對該庫中的每個表,按照「單表恢復方法」操作即可。
單表備份恢復測試
單表備份:
1 備份之前查看表信息,並且備份表結構:
2 在線物理備份
[root@db1 ~]# innobackupex --export--include="dbatest1.tt2" --user=xxx --password=xxxxxx --host=127.0.0.1 --port=3990--defaults-file=/data1/mysql3990/my3990.cnf --no-timestamp /data1/backup/mysql3990/dbatest1.tt2.2017-12-18
[root@db1 ~]# innobackupex --apply-log --export /data1/backup/mysql3990/dbatest1.tt2.2017-12-18
單表備份文件列表:
單表恢復:
參考單表恢復方法恢復數據後,查看結果:
單庫備份恢復測試
單庫備份:
[root@db1 ~]# innobackupex --export--databases="dbatest1" --user=xxx --password=xxxxxx --host=127.0.0.1 --port=3990--defaults-file=/data1/mysql3990/my3990.cnf --no-timestamp /data1/backup/mysql3990/dbatest1.2017-12-18
[root@db1 ~]# innobackupex --apply-log --export /data1/backup/mysql3990/dbatest1.2017-12-18
查看備份文件列表:
單庫恢復:
1 創建庫表結構
執行備份的庫表結構sql文件
2 對於該庫的每個表,執行單表恢復方法即可,不能直接把備份的庫目錄拷貝到mysql實例中。
以上是對單個庫表測試,實際上,percoan xtrabackup支持多庫表在線物理備份,讀者可自行測試,這裡不再贅述。
總結
由於該方法屬於在線物理備份,速度相對比較快,適合於數據文件比較大的場景。
在實際應用中,備份和恢復一般是針對同一個mysql實例,建議使用percona server 5.6+版本,為了避免影響業務,建議在從庫上備份,在主庫上恢復數據。