MySQL 之數據備份與恢復
使用 innobackupex 工具演示全量備份
使用 innobackupex 工具製作數據備份並執行恢復,本實驗共兩臺主機,node1爲故障主機將被node2替換,將node1上的數據做全量備份,恢復至node2
在node1上製作全量備份並將備份的數據發送至node2
#在node1準備備份數據存儲目錄
mkdir -pv /data/backup
#在node1全量備份
innobackupex --user=root /data/backup
#在node2主機上測試恢復功能
mkdir -pv /data/backup
#在node1將生成的備份目錄發送至恢復主機
scp -rp /data/backup/2017-07-14_22-42-53 [email protected]:/data/backup/
#在node2的備份數據目錄下執行
cd /data/backup/2017-07-14_22-42-53
innobackupex --copy-back ./
#查看恢復的數據
cd /var/lib/mysql/;ls
修改node2上恢復的數據的屬主和屬組
注意:數據恢復後,所有文件和目錄的屬主和屬組都是製作備份的用戶的屬主和屬組,需要修改爲mysql
chown -R mysql.mysql /var/lib/mysql/*
在node2上啓動服務
==注意:數據恢復後的第一時間需要做的就是——對恢復後經過檢驗無誤的數據立刻進行全量備份==
- 在node2上製作全量備份
innobackupex -uroot /data/backup
全量 + 增量備份 及 數據恢復(+時間點恢復)
增量備份是基於上一次備份(全量或增量)製作的數據備份,MyISAM存儲引擎不支持增量備份僅支持全量備份;InnoDB支持全量和增量備份
在上述實驗的基礎上,假設數據已經發生變化
#依賴已經做好的全量備份,製作增量備份
innobackupex -u root --incremental /data/backup --incremental-basedir /data/backup/2017-07-14_22-42-53
再次修改數據,製作第二次增量備份
#基於第一次增量備份,製作第二次增量備份
innobackupex -uroot --incremental /data/backup --incremental-basedir /data/backup/2017-07-14_23-48-14/
數據再次發生變化,但未來得及製作增量備份,此時發生故障,數據庫服務崩潰
- 查詢最近一次增量備份的二進制日誌中的最後執行語句的位置數字
less 2017-07-15_00-00-20/xtrabackup_binlog_info
#結果如下,POS爲1268
master-log.000005 1268
- 查看數據崩潰服務的主機的二進制日誌
cd /var/lib/mysql
#截取1268之後的所有未備份的語句保存至某個 .sql 文件中,用於做時間點恢復
mysqlbinlog master-log.000005 -j 1268 > /data/backup/binlog.sql
- 將所有備份的數據(包括全量和增量還有截取的二進制日誌文件)發送至用於恢復的主機
scp -rp /data/backup/* root@172.16.50.16:/data/backup/
恢復數據 (利用全量備份 + 第一次增量備份 + 第二次增量備份 + 二進制文件時間點恢復)
實驗所需備份文件及目錄名字整理
全量備份的目錄名:2017-07-14_22-42-53
數據發生變化後的第一次增量備份目錄名:2017-07-14_23-48-14
數據發生變化後的第二次增量備份目錄名:2017-07-15_00-00-20
從最後一次備份的語句開始截取的二進制文件名:binlog.sql
數據恢復整體順序:將全量備份與第一次增量備份合併後得到新的備份 ==> 將得到的新的備份與第二次增量備份合併得到新的備份 ==> 利用二進制文件時間點恢復
對製作備份過程中可能導致的未完成的中間事務,僅在所有備份(全量和所有增量)合併完成後才執行回滾操作(undo),在各個備份文件合併過程中僅執行提交操作(redo)。
- 對全量備份本身執行PREPARE準備工作,對於未完成的中間事務此時僅提交、不回滾
innobackupex --apply-log --redo-only /data/backup/2017-07-14_22-42-53
- 將準備好的全量備份與第一次增量備份合併,,對於未完成的中間事務此時僅提交、不回滾
innobackupex --apply-log --redo-only /data/backup/2017-07-14_22-42-53 --incremental-dir=/data/backup/2017-07-14_23-48-14/
- 將得到的新的備份與第二次增量備份合併,對於未完成的中間事務此時僅提交、不回滾
innobackupex --apply-log --redo-only /data/backup/2017-07-14_22-42-53 --incremental-dir=/data/backup/2017-07-15_00-00-20/
- 所有備份文件合併完成後,對中間事務執行提交、並執行回滾,得到一份完整的備份數據
innobackupex --apply-log /data/backup/2017-07-14_22-42-53/
- 將完整的備份數據和截短的二進制文件發送至用於恢復數據的主機
scp -rp 2017-07-14_22-42-53/ binlog.sql root@172.16.50.16:/data/backup
- 恢復備份的數據並修改恢復的數據的屬主和屬組後啓動服務
innobackupex -uroot --copy-back /data/backup/2017-07-14_22-42-53/
chown -R mysql.mysql /var/lib/mysql/*
systemctl start mariadb
- 基於截取的二進制文件進行時間點恢復,將未來得及保存在備份中的修改恢復
mysql < /data/backup/binlog.sql
至此,數據完全恢復至崩潰一刻的狀態
- 對完全恢復的數據應該第一時間進行一次全量備份並妥善保存
注意:儘量不要將備份數據和源數據存儲在同一主機或同一設備上,可以加密後放至雲存儲。