f MySQL 熱備份/還原的機制 ~ 迪貝之家

Pages

MySQL 熱備份/還原的機制

 

我要談的還是xtrabackup這個工具
之前的文章我稍微提到了大概的流程
還是依循backup->prepare->restore
這篇文章主要談它的差異備份的機制
因為如果資料庫大的話
你總不可能每天做full backup 吧!!
如果你熟rdbms的話
那你應該就會知道在crash recovery會做的兩個動作
roll forward 及 back
如果你不熟
那就先去惡補一下
因為xtrabackup prepare就是在做些動作來consistent所有的檔案
為什麼它能做到?
那是因為xtrabackup binary嵌入了一個很小的innodb 程式庫
所以執行prepare就是follow innodb crash recovery的邏輯
其中一個重點就是
如果你的差異是針對前一份非full備份
在還原時,在依序套用各份incremental 時
你就只能讓它進行roll forward (apply-log-only)
因為在進行備份的時候,應該都還有transaction還未commit
如果你在prepare incremental 備份時不指定apply-log-only
那xtrababckup 會rollback 未commit 的資料
在prepare其下一個備份
應該就會失敗
上述就是它的運作原理
這是我的備份還原scenario
1.全備份
2.資料匯入時,進行第一次Incremental備份
3.進行第二次Incremental備份
4.資料庫回復
所以會有3個backup image
/data/backups/base <- 全備份
/data/backups/inc1 <- 第一次Incremental 備份
/data/backups/inc2 <- 第二次Incremental 備份
再次重申backup->prepare->restore 這個flow
執行記錄請點擊相應的指令連結
1. 備份
1.1 FULL :
xtrabackup --user=bkpuser --password=s3cr%T --backup --target-dir=/data/backups/base
1.2 First Incrmental :
xtrabackup --user=bkpuser --password=s3cr%T --backup --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base
這圖表示當第一次incrmental backup 完成時
資料還在匯入當中


1.2 Second Incrmental :
xtrabackup --user=bkpuser --password=s3cr%T --backup --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1
2. Prepare apply-log-only
2.1 FULL :
xtrabackup --user=bkpuser --password=s3cr%T --prepare --apply-log-only --target-dir=/data/backups/base
2.2 First Incrmental :
xtrabackup --user=bkpuser --password=s3cr%T --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1
2.2 Second Incrmental :
xtrabackup --user=bkpuser --password=s3cr%T --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/inc2
3. restore
mkdir -p /var/lib/mysql
xtrabackup --user=bkpuser --password=s3cr%T --copy-back --target-dir=/data/backups/base
最後當然是修改權限,啟動MySQL Instance
chown -R mysql:mysql /var/lib/mysql
service mysql start
既然開啟資料庫Instance了
當然就要比對資料
我的環境是在一個既有的employees資料庫下
執行相同建置的sql script
只是資料庫名字改為employees2
所以我挑了這兩個資料庫內的employee的表格
來比對資料筆數是否一致

======2020/12/20=========
今天又來測了一次table restore
因為從文件裏頭
我發覺上次測試忘了啟動一個參數
innodb_import_table_from_xtrabackup
不過我照著文件指示進行測試
Percona MySQL 8根本不認識該參數