1. 程式人生 > 資料庫 >mysql增量備份及斷點恢復指令碼例項

mysql增量備份及斷點恢復指令碼例項

簡介

增量備份是指在一次全備份或上一次增量備份後,以後每次的備份只需備份與前一次相比增加或者被修改的檔案。這就意味著,第一次增量備份的物件是進行全備後所產生的增加和修改的檔案;第二次增量備份的物件是進行第一次增量備份後所產生的增加和修改的檔案,如此類推。

目的

解決完全備份中時間長、恢復慢的問題,採取了增量備份

特點

優:無重複資料,備份量不大,時間短
缺:需要上次完全備份及完全備份後的增量備份才能恢復,需對增量備份逐個反覆恢復,操作繁瑣

實現方式

通過mysql的二進位制日誌間接實現增量備份:
二進位制日誌儲存了所有更新或可能更新的資料
二進位制日誌在mysql啟動時開始記錄,且會重新建立新的日誌檔案

需定時執行flush logs方法重新建立日誌,生成二進位制檔案序列

實驗環境:

安裝了mysql5.7資料庫的一臺centos7虛擬機器

操作過程:

一、增量備份

1、在配置檔案中新增二進位制日誌

vim /etc/my.cnf
[mysqld] #在此模組下新增
log-bin=mysql-bin #二進位制日誌

2、重啟服務,並檢視二進位制日誌

systemctl restart mysqld.service
cd /usr/local/mysql/data/
mysqlbinlog --no-defaults mysql-bin.000001


3、在資料庫自由建立資料庫、表,作為實驗模板


4、對school資料庫進行完全備份

mysqldump -uroot -pabc123 school > /opt/school.sql

5、重新整理日誌,生成新的日誌,注意:之前資料庫的操作寫入編號為000001的日誌中,新生成的000002的日誌為空

mysqladmin -uroot -pabc123 flush-logs #重新整理日誌
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001 #檢視000001日誌
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 #檢視000002日誌

#--base64-output=decode-rows -v:避免檔案中亂碼,前面的檢視命令也可以使用



6、新新增mysql資料庫操作,然後重新整理日誌,進行增量備份

use school;
mysql>indert into info (id,name,score) values (3,'aaa',78);
mysql>delete from info where name='tom'; #誤操作
mysql> insert into info (id,score) values (4,'bbb',64);
mysqladmin -uroot -pabc123 flush-logs #重新整理日誌,生成000003
#此次增量備份已記錄到000002日誌檔案中



7、刪除info表

mysql -uroot -pabc123 -e 'use school;drop table info;'

8、恢復完全備份,然後恢復增量備份

mysql -uroot -pabc123 school < /opt/school.sql #完全備份還原

mysqlbinlog --no-defaults mysql-bin.000002 | mysql -uroot -p


那麼,此處暴露出一個問題,如果出現誤操作,還原備份時就會出現錯誤,並不能實現理想的備份,達到真正的目的。此時,就需要斷鏈恢復(屬於恢復增量備份的特殊用法),即在還原時只恢復正確的資料庫操作。

二、斷鏈恢復

在操作斷鏈恢復前,需要還原到未進行增量備份還原的狀態,如圖


基於時間點

2018-09-04 16:43:52 錯誤操作時間 (開頭載入到此時間點結束)
2018-09-04 16:44:32 正確操作時間 (從此時間點再次開始載入) 從此時間點再次開始載入

mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 #檢視000002日誌


mysqlbinlog --no-defaults --stop-datetime='2018-09-04 16:43:52' /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p
mysqlbinlog --no-defaults --start-datetime='2018-09-04 16:44:32' /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p


基於位置點

at 565 上一次正確執行位置 --stop-position
at 667 下一次正確執行位置 --start-position

mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 #檢視000002日誌

mysqlbinlog --no-defaults --stop-position='565' /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p
mysqlbinlog --no-defaults --start-position='667' /usr/local/mysql/data/mysql-bin.000002 | mysql -uroot -p