我要談的還是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根本不認識該參數 |