單錶快速恢復!XtraBackup 隱藏技巧揭祕
背景介紹
資料庫工作者對下面這個場景肯定不會陌生:某次操作失誤導致誤刪了某個表,需要立即進行資料恢復。如果是普通的全量備份,發現這個例項有好幾百G甚至上T的資料,然後苦逼的拷貝資料庫、追同步、等待資料恢復,估計好幾個小時已經過去了~~~
本文主要介紹利用 XtraBackup 備份工具來實現單錶快速恢復,在緊急資料恢復場景下,用最短的時間來恢復資料,最大程度降低損失。
涉及兩種備份模式:
- 本地全量備份
- 遠端流式備份
注:只適應於獨立表空間的場景,即 innodbfileper_table = ON
本地全量備份恢復
正常使用 XtraBackup 備份到本地,並執行 apply-log ,但是在打包上傳儲存的時候,對每個表文件單獨打包壓縮。
重點 :對每個表文件單獨打包,例如 dbname.tablename.tar
備份命令簡單示例:
## 備份資料
innobackupex --user=users --password=xxxxxxx --socket=/xxx/mysql.sock --defaults-file=/xxxxx/my.cnf /data/backup_dir/mysql 2>> /var/log/mysqlbackup.log
## 應用 apply log
innobackupex -apply-log /data/backup/mysql
## 分表單獨打包(可以根據實際情況加入壓縮和加密)
for tablename in $tables; do tar -cvf dbname.tablename.tar dbname/tablename ; done
注:一定不要忘記執行 apply-log
在資料恢復的時候,只需要拷貝必須的基礎檔案和需要恢復的表文件包,解壓啟動,並在資料庫配置檔案中新增replicate-wild-do-table=dbname.tablename ,只需要追對應表的資料同步即可。這樣可以省去大量傳輸資料、解壓和追同步的時間,以最少的時間恢復資料。
單錶快速資料恢復步驟:
- 拷貝 mysql 庫相關檔案
- 拷貝 ibdata* 檔案
- 拷貝 ib_logfile* 檔案
- 拷貝 my.cnf 配置檔案
- 拷貝 XtraBackup 相關日誌檔案
- 拷貝需要恢復的資料表相關檔案以及目錄結構
- 配置檔案中新增配置:replicate-wild-do-table=dbname.tablename
- 配置檔案中新增配置:skip-slave-start
- 如果有壓縮加密則解壓解密相關檔案,啟動
- change 到指定點位或者 gtid
注:恢復時配置檔案一定要加 skip-slave-start 引數,避免直接啟動同步導致資料追過頭
遠端流式備份恢復
在資料庫容量逐漸變大,本地備份和傳輸磁碟容量有瓶頸的時候我們引入了遠端流式備份。XtraBackup 有個 –stream 的引數,支援兩種流式備份:tar 和 xbstream ,為了單錶快速恢復,我們選擇了 xbstream 。
備份命令簡單示例:
## 直接利用 xbstream 將資料備份到遠端儲存
innobackupex --user=users --password=xxxxxxx --socket=/xxx/mysql.sock --defaults-file=/xxxxx/my.cnf --stream=xbstream --compress /data/backup_dir/mysql 2>> /var/log/mysqlbackup.log | ssh [email protected] "xbstream -x -C /data/backup_dir1/mysql/"
資料恢復與之前本地備份單錶快速恢復類同,拷貝必須的基礎檔案和需要恢復的資料表表相關檔案,大致操作步驟與命令如下:
- 拷貝 mysql 庫相關檔案
- 拷貝 ibdata* 檔案
- 拷貝 ib_logfile* 檔案
- 拷貝 my.cnf 配置檔案
- 拷貝 XtraBackup 相關日誌檔案
- 拷貝需要恢復的資料表相關檔案以及目錄結構
- 配置檔案中新增配置:replicate-wild-do-table=dbname.tablename
- 配置檔案中新增配置:skip-slave-start
- 解壓相關檔案,命令:
innobackupex --decompress --parallel=8 /data/backup_dir/mysql
- 執行 apply-log:
innobackupex -apply-log /data/backup/mysql
- change 到指定點位或者 gtid
注:執行 apply-log 時出現如下報錯不要緊張,直接忽略就行,因為只拷貝了部分表資料檔案用來恢復,其他表的資訊仍然在存在於 InnoDB 的內部資料字典中,所以會有報錯。
InnoDB: Table xxxx/xxxxx in the InnoDB data dictionary has tablespace id xxx, but tablespace with that id or name does not exist. Have you deleted or moved .ibd files? This may also be a table created with CREATE TEMPORARY TABLE whose .ibd and .frm files MySQL automatically removed, but the table still exists in the InnoDB internal data dictionary.
總結
單錶快速恢復能幫我們最短時間恢復線上資料,同時此方法也適用於多表恢復。不過想要快速恢復資料前期準備也必不可少,怎麼能快速獲取備份資訊、需要恢復到的 binlog 點位、gtid 等都需要下一番功夫。只有諸事具備才能無往不利。
文章來自微信公眾號:HULK一線技術雜談