該部分介紹了怎樣做增量備份及如何利用全量備份,增量備份,binlog進行完全恢復。
增量備份隻影響xtradb和innodb表,其他引擎將會複製所有數據。
這裏計劃做一次全量備份,三次增量備份。後兩次的增量備份都基於上次的增量備份。
一 增量備份與恢復
1.1 備份
1.1.1 全量備份
增量備份基於全量備份,所以需要先創建一個全量備份。
全量備份命令示例:
innobackupex --port=3307 --user=XtrabackupUser --password=123456 /download/bak/xtrbak/
在備份路徑下生成了一個子目錄2020-03-18_19-46-30。
1.1.2 增量備份
增量備份需要指定--incremental選項和BASEDIR信息。
BASEDIR可以指向之前的全備,也可以指向上一個增量備份。
#增量備份1
innobackupex --port=3307 --user=XtrabackupUser --password=123456 --incremental --incremental-basedir=/download/bak/xtrbak/2020-03-18_19-46-30 /download/bak/xtrbak/
在備份路徑下生成了一個子目錄2020-03-18_19-53-42。
#增量備份2
innobackupex --port=3307 --user=XtrabackupUser --password=123456 --incremental --incremental-basedir=/download/bak/xtrbak/2020-03-18_19-53-42 /download/bak/xtrbak/
在備份路徑下生成了一個子目錄2020-03-18_19-55-45。
#增量備份3
innobackupex --port=3307 --user=XtrabackupUser --password=123456 --incremental --incremental-basedir=/download/bak/xtrbak/2020-03-18_19-55-45 /download/bak/xtrbak/
在備份路徑下生成了一個子目錄2020-03-18_19-56-55。
1.2 故障模擬
刪除數據文件:
cd /data/server/mysql_3307/
mv data data_bak
重啓數據庫失敗:
Starting MySQL. ERROR! The server quit without updating PID file (/data/server/mysql_3307/data/pc1.pid)
1.3 恢復
1.3.1 prepare
規則:
需要在全量備份及除最後一個增量備份外的所有增量備份上--apply log --redo only,在最後一個增量備份上加--apply log,即只有最後一個備份中不用加--redo only.
#對全量備份做prepare
innobackupex --apply-log --redo-only 2020-03-18_19-46-30
#將增量備份1合併到全量備份中(incremental-dir後跟增量備份目錄)
innobackupex --apply-log --redo-only 2020-03-18_19-46-30 --incremental-dir=/download/bak/xtrbak/2020-03-18_19-53-42
#將增量備份2合併到全量備份中
innobackupex --apply-log --redo-only 2020-03-18_19-46-30 --incremental-dir=/download/bak/xtrbak/2020-03-18_19-55-45
#將增量備份3合併到全量備份中(不加redo-only)
innobackupex --apply-log 2020-03-18_19-46-30 --incremental-dir=/download/bak/xtrbak/2020-03-18_19-56-55
1.3.2 使用innobackupex做恢復
在prepare階段後,如果需要用備份數據來恢復數據庫,則需要指定--copy-back和備份數據所在的目錄即可。
#如果數據庫沒被關閉,需要關閉數據庫:
service mysqld stop
#如果數據目錄不爲空,則將數據目錄設置爲空
cd /data/server/mysql_3307/
mv data data_bak
#在恢復機器上恢復數據:
innobackupex --copy-back /download/bak/xtrbak/2020-03-18_19-46-30
chown -R mysql:mysql data
此時,數據恢復到了備份時刻的狀態。
1.3.3 利用binlog做完全恢復
若想恢復到故障時刻,需要結合binlog進行完全恢復:
關閉相應的應用接口,阻止往數據庫裏寫入數據,防止數據錯亂。
service mysqld start
#查看應該從哪個binlog及position進行恢復
查看最近的一個增量備份的xtrabackup_binlog_info文件。
cd 2020-03-18_19-56-55
[root@pc1 2020-03-18_19-56-55]# cat xtrabackup_binlog_info
mysql-bin.000037 1042 2daff865-67ce-11ea-874e-080027040516:1-11,
a4ac8cd2-e17c-11e9-a602-080027040516:1-89,
d4d2f1d2-66f2-11ea-972a-080027040516:1-17
#查看有哪些binlog需要恢復(上面陰影部分的binlog及其之後的binlog都需要恢復)
mysql> show binary logs;
……
| mysql-bin.000037 | 1345 |
|mysql-bin.000038 | 577 |
| mysql-bin.000039 | 530 |
| mysql-bin.000040 | 274
#執行flush logs,以防止恢復最後一個binlog時,會重複複製,因爲恢復binlog本身的操作也會記錄到binlog裏。
#恢復
/usr/local/mysql/bin/mysqlbinlog --skip-gtids=true --start-position=1042 mysql-bin.000037 | mysql -u root -p
/usr/local/mysql/bin/mysqlbinlog --skip-gtids=true mysql-bin.000038 mysql-bin.000039 mysql-bin.000040 | mysql -u root -p