1. 程式人生 > >xtrabackup備份和還原

xtrabackup備份和還原

mysql xtrabackup 備份

Xtrabackup備份原理:
物理備份,不鎖表,那麽怎麽保證現有的數據(備份過程中有尚未提交或已經提交但未同步事務)與復制出來的數據一致呢?
我們知道MySQL修改操作都會先記錄在ib_logfile日誌文件,再同步到磁盤,這個文件並重復使用。在復制期間會開啟一個線程用來監控ib_logfile日誌文件,如果有修改就從上次記錄的日誌序列號(checkpoins)開始復制新增內容到Logfile文件。復制結束後,把logfile事務日誌進行回滾,把未完成的事務同步到ibdata1和ibd裏面,來保證數據一致性。這與Mysql崩潰後恢復基本操作一樣。

測試前準備:
1 、CentOS6.8安裝mysql

[root@Paul ~]# yum install -y mysql-server mysql-client

2、在percona官網下載percona-xtrabackup,並安裝
[root@Paul ~]# rpm -ivh percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm
3、用RPM包安裝mysql默認sql_log_bin是關閉,我們需要開啟二進制日誌
4、在mysql中創建好數據庫和表,並插入好數據以及備份目錄。

測試用xtrabackup做完全備份和還原

1、完全備份
[root@Paul backup]# innobackupex --user=root --password=123456 /root/backup

[root@Paul backup]# ls /root/backup/2018-04-23_13-45-50/
backup-my.cnf ibdata1 jiaowu mysql test xtrabackup_binary xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_logfile

備份後生成文件解釋:
backup-my.cnf --------------備份命令用到的配置選項信息
xtrabackup_binary ------備份中用到的xtrabackup的可執行文件
xtrabackup_binlog_info ---- mysql服務器當前正在使用的二進制日誌文件及至備份這一刻為止二進制日誌事件的位置

xtrabackup_checkpoints -----備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日誌序列號)範圍信息

2、準備(prepare)一個完全備份
一般情況下,在備份完成後,數據尚且不能用於恢復操作,因為備份的數據中可會
含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍
處理不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事
務至數據文件也使得數據文件處於一致性狀態。
[root@Paul ~]# innobackupex --apply-log /root/backup/2018-04-23_13-45-50/

3、使用完全備份恢復數據
[root@Paul backup]# rm -rf /var/lib/mysql/* 刪掉數據庫所有文件,模擬數據庫宕機
[root@Paul backup]# innobackupex --copy-back /root/backup/2018-04-23_13-45-50/
[root@Paul backup]# chown -R mysql.mysql /var/lib/mysql

測試用xtrabackup做一次完全備份,一次差異備份,一次增量備份,然後mysql服務宕
機,通過事務日誌做及時點還原。

做完全備份
[root@Paul backup]# innobackupex --user=root --password=123456 /root/backup
[root@Paul backup]# innobackupex --apply-log /root/backup/2018-04-23_14-22-11/

在tutors表中插入數據做增量:
mysql> update tutors set Tname=‘apple‘ where TID=1;

做差異備份,以/root/backup/2018-04-23_14-22-11/為基表
[root@Paul backup]# innobackupex --user=root --password=123456 --incremental /root/backup --incremental-basedir=/root/backup/2018-04-23_14-22-11/

再往tutors表中插入數據:
mysql> update tutors set Tname=‘banana‘ where TID=2;

做增量備份,以/root/backup/2018-04-23_14-41-15/
[root@Paul backup]# innobackupex --user=root --password=123456 --incremental /root/backup/ --incremental-basedir=/root/backup/2018-04-23_14-41-15/

增量備份的恢復
增量備份的恢復需要有3個步驟

  1. 恢復完全備份
  2. 恢復增量備份到完全備份(開始恢復的增量備份要添加--redo-only參數,到最後一次增量備份要去掉--redo-only)
  3. 最整理完全備份做恢復,回滾未提交數據

#準備一個全備#
root@Paul backup]# innobackupex --apply-log --redo-only /root/backup/2018-04-23_14-22-11/

#將差異備份應用到全備#
[root@Paul backup]# innobackupex --apply-log --redo-only /root/backup/2018-04-23_14-22-11/ --incremental-dir=/root/backup/2018-04-23_14-41-15/
#將增量備份應用到全備#
[root@Paul backup]# innobackupex --apply-log --redo-only /root/backup/2018-04-23_14-22-11 --incremental-dir=/root/backup/2018-04-23_14-48-22/
#把所有合在一起的完全備份整體進行一次apply操作,回滾未提交的數據#
[root@Paul backup]# innobackupex --apply-log /root/backup/2018-04-23_14-22-11

#最後做一次增量更新#
mysql> update tutors set Tname=‘orange‘ where TID=3;

模擬測試:
記錄最後一次增量更新二進制日誌位置
[root@Paul 2018-04-23_14-48-22]# more xtrabackup_binlog_info
mysql-bin.000001 517
備份二進制文件
[root@Paul ~]# mysqlbinlog -j 517 /var/lib/mysql/mysql-bin.000001 > /root/backup/mysql-bin.sql
[root@Paul ~]# cp /root/backup/mysql-bin.sql /tmp/

#刪掉/var/lib/mysql/中所有文件#
[root@Paul ~]# rm -rf /var/lib/mysql/*

全備恢復
[root@Paul ~]# innobackupex --copy-back /root/backup/2018-04-23_14-22-11
root@Paul ~]# chown -R mysql.mysql /var/lib/mysql
[root@Paul ~]# service mysqld stop
[root@Paul ~]# service mysqld start

二進制及時點還原
mysql> set sql_log_bin=0;
mysql> SOURCE /tmp/mysql-bin.sql
mysql> set sql_log_bin=1

xtrabackup備份和還原