Innobackup 在從庫上做增量備份

從庫做增量備份


Innobackup 的介紹詳見 -- Mysql增備工具--Xtrabackup


1.全備
Slave$ innobackupex --no-timestamp --slave-info --safe-slave-backup /data/backup/full/

Note:
--save-info : It prints the binary log position and name of the master server. It also writes this information to the xtrabackup_slave_info file as a CHANGE MASTER statement
--safe-slave-backup :this option stops the slave SQL thread and wait to start backing up until Slave_open_temp_tables in SHOW STATUS is zero

2.增備
第一次增備
Master$ mysql -uroot -pqwer1234 -e 'create database kk;'
Master$ mysql -uroot -pqwer1234 -e 'use kk;create table k_1 as select * from information_schema.tables;'
Slave$ mysql -uroot -pqwer1234 -e 'use kk;show tables;'
Slave$ innobackupex -no-timestamp --slave-info --safe-slave-backup --incremental --incremental-basedir=/data/backup/full/ /data/backup/inc1

第二次增備
Master$ mysql -uroot -pqwer1234 -e 'use kk;create table k_2 as select * from information_schema.tables;'
Slave$ mysql -uroot -pqwer1234 -e 'use kk;show tables;'
Slave$ innobackupex -no-timestamp --slave-info --safe-slave-backup --incremental --incremental-basedir=/data/backup/inc1/ /data/backup/inc2

第三次增量
Master$ mysql -uroot -pqwer1234 -e 'use kk;create table k_3 as select * from information_schema.tables;'
Master$ mysql -uroot -pqwer1234 -e 'use kk;create table k_4 engine='Myisam' as select * from information_schema.tables;'
Slave$ mysql -uroot -pqwer1234 -e 'use kk;show tables;'
Slave$ innobackupex -no-timestamp --slave-info --safe-slave-backup --incremental --incremental-basedir=/data/backup/inc2/ /data/backup/inc3

3.恢復 從庫上做

第一次增備恢復
/etc/init.d/mysql stop
rm -rf /var/lib/mysql/*
rm -rf /data/backup
cp -rf /data/backup--bak /data/backup

“準備”(prepare)增量備份與整理完全備份有着一些不同,尤其要注意的是:
(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”。“重放”之後,所有的備份數據將合併到完全備份上。
(2)基於所有的備份將未提交的事務進行“回滾”。
於是,命令中需要加上--redo-only,如下:

innobackupex --apply-log --redo-only /data/backup/full/

innobackupex --apply-log /data/backup/full --incremental --incremental-dir=/data/backup/inc1

innobackupex --apply-log /data/backup/full ## 恢復前的準備操作,主要做如下兩個操作

replay committed transactions and rolled back uncommitted transaction

innobackupex --copy-back /data/backup/full ## 拷貝數據到數據庫目錄
chown -R mysql.mysql /var/lib/mysql
/etc/init.d/mysql start
mysql -uroot -pqwer1234 -e 'use kk;show tables;'
+--------------+
| Tables_in_kk |
+--------------+
| k_1 |
+--------------+

第二次增備恢復
/etc/init.d/mysql stop
rm -rf /var/lib/mysql/*
rm -rf /data/backup
cp -rf /data/backup--bak /data/backup
innobackupex --apply-log --redo-only /data/backup/full/
innobackupex --apply-log --redo-only /data/backup/full --incremental --incremental-dir=/data/backup/inc1
innobackupex --apply-log /data/backup/full --incremental --incremental-dir=/data/backup/inc2

# --redo-only should be used when merging all incrementals except the last one.
#Even if the --redo-only was used on the last step, backup would still be consistent but in that case server would perform the rollback phase

#If you merge the incrementals in the wrong order, the backup will be useless.

innobackupex --apply-log /data/backup/full
innobackupex --copy-back /data/backup/full
chown -R mysql.mysql /var/lib/mysql
/etc/init.d/mysql start
mysql -uroot -pqwer1234 -e 'use kk;show tables;'
+--------------+
| Tables_in_kk |
+--------------+
| k_1 |
| k_2 |
+--------------+

第三次增備恢復 (一般就只需要做這一步)
/etc/init.d/mysql stop
rm -rf /var/lib/mysql/*
rm -rf /data/backup
cp -rf /data/backup--bak /data/backup
innobackupex --apply-log --redo-only /data/backup/full/
innobackupex --apply-log --redo-only /data/backup/full --incremental --incremental-dir=/data/backup/inc1
innobackupex --apply-log --redo-only /data/backup/full --incremental --incremental-dir=/data/backup/inc2
innobackupex --apply-log /data/backup/full --incremental --incremental-dir=/data/backup/inc3
innobackupex --apply-log /data/backup/full
innobackupex --copy-back /data/backup/full
chown -R mysql.mysql /var/lib/mysql
/etc/init.d/mysql start
mysql -uroot -pqwer1234 -e 'use kk;show tables;'
+--------------+
| Tables_in_kk |
+--------------+
| k_1 |
| k_2 |
| k_3 |
| k_4 |
+--------------+


備註:

使用XtraBackup容易引起的一個經典錯誤,引起這個錯誤的原因也很簡單,就是XtraBackup在備完innodb表的時候,要獲得對所有表的鎖定來備份MyISAM表和其他文件,來保證數據的一致性,如果在此過程中數據庫不斷的有DML操作,XtraBackup就可能遲遲無法獲得對所有表的鎖定,最後超時。
要避免這個問題,一個是加大超時的時間限制,但這顯然不是一個好的解決辦法,另外就是在備份的時候加上no-lock參數,就是在複製MyISAM表和.frm等文件的時候不鎖表,但要保證這時沒有對MyISAM表的DML操作和Innodb表的DDL操作,這一般通過應用端權衡時間是容易辦到的。
但是要注意的是,如果備份出來的文件要用於主從複製,那麼不鎖表會導致沒有輸出 slave_info文件和binlog_info文件,這對於一些人的應用場景可能會有影響。這時可以加一個safe-slave-backup參數,使得在從庫上備份的時候停止SQL THRED,這樣即使從庫能從主庫接收binlog文件,但是不會應用,relay log position就不會移動了。但是單純的停掉slave SQL Thread是不會影響binlog position的。

因爲臨時表的原因,safe-slave-backup需要在SHOW STATUS的輸出中slave_open_temp_tables爲0的時候才停止slave SQL Thread,否則會導致複製出問題。因爲臨時表是基於用戶session的,因此如果正在操作臨時表的數據的時候停止slave SQL Thread,會導致可能後續的數據不一致,在其他停用slave SQL Thread的場景也要注意這個問題。

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