MySQL 之數據備份與恢復

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/

數據再次發生變化,但未來得及製作增量備份,此時發生故障,數據庫服務崩潰

  1. 查詢最近一次增量備份的二進制日誌中的最後執行語句的位置數字
less 2017-07-15_00-00-20/xtrabackup_binlog_info 
#結果如下,POS爲1268
master-log.000005       1268
  1. 查看數據崩潰服務的主機的二進制日誌
cd /var/lib/mysql
#截取1268之後的所有未備份的語句保存至某個 .sql 文件中,用於做時間點恢復
mysqlbinlog master-log.000005 -j 1268 > /data/backup/binlog.sql
  1. 將所有備份的數據(包括全量和增量還有截取的二進制日誌文件)發送至用於恢復的主機
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)。

  1. 對全量備份本身執行PREPARE準備工作,對於未完成的中間事務此時僅提交、不回滾
innobackupex --apply-log --redo-only /data/backup/2017-07-14_22-42-53
  1. 將準備好的全量備份與第一次增量備份合併,,對於未完成的中間事務此時僅提交、不回滾
innobackupex --apply-log --redo-only /data/backup/2017-07-14_22-42-53 --incremental-dir=/data/backup/2017-07-14_23-48-14/
  1. 將得到的新的備份與第二次增量備份合併,對於未完成的中間事務此時僅提交、不回滾
innobackupex --apply-log --redo-only /data/backup/2017-07-14_22-42-53 --incremental-dir=/data/backup/2017-07-15_00-00-20/
  1. 所有備份文件合併完成後,對中間事務執行提交、並執行回滾,得到一份完整的備份數據
innobackupex --apply-log /data/backup/2017-07-14_22-42-53/
  1. 將完整的備份數據和截短的二進制文件發送至用於恢復數據的主機
scp -rp 2017-07-14_22-42-53/ binlog.sql root@172.16.50.16:/data/backup
  1. 恢復備份的數據並修改恢復的數據的屬主和屬組後啓動服務
innobackupex -uroot --copy-back /data/backup/2017-07-14_22-42-53/
chown -R mysql.mysql /var/lib/mysql/*
systemctl start mariadb
  1. 基於截取的二進制文件進行時間點恢復,將未來得及保存在備份中的修改恢復
mysql < /data/backup/binlog.sql
  • 至此,數據完全恢復至崩潰一刻的狀態

    1. 對完全恢復的數據應該第一時間進行一次全量備份並妥善保存

注意:儘量不要將備份數據和源數據存儲在同一主機或同一設備上,可以加密後放至雲存儲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章