Xtrabackup進行MySQL備份與恢復
一、使用Xtrabackup進行MySQL備份
1、簡介
Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb數據庫進行熱備的工具。特點:
(1)備份過程快速、可靠;
(2)備份過程不會打斷正在執行的事務;
(3)能夠基於壓縮等功能節約磁盤空間和流量;
(4)自動實現備份檢驗;
(5)還原速度快;
2、安裝
其最新版的軟件可從 http://www.percona.com/software/percona-xtrabackup/ 因此,直接下載相應版本的rpm包安裝即可,這裏不再演示其過程。
這個工具要安裝在你需要備份的主機上或者遠程操作也可以
percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm
[root@bixia ~]#yum install ./percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm
[root@bixia ~]#rpm -ql percona-xtrabackup-24
二、備份的實現
備份前的環境的準備
兩臺主機:
172.18.77.7: mysql主服務器
172.18.77.77: 用於恢復備份數據的主機
為了可以清楚我將每個主機的主機名設置不一樣;這裏備份我備份在了本機上,為了方便演示。(建議備份時放在其他的主機上)
在兩臺mysql服務器上都安裝percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm
1、完全備份
[root@bixia ~]#mkdir /app/backups創建一個目錄存放備份數據 [root@bixia ~]#innobackupex --user=root --password=centos --host=localhost /app/backups/ 如果備份某一個庫的話可以用--databases= [root@bixia ~]cd /app/backups/2017-11-14_16-16-20/
在備份的同時,innobackupex還會在備份目錄中創建如下文件:
(1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日誌序列號)範圍信息;
每個InnoDB頁(通常為16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。
(2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻為止二進制日誌事件的位置。
(3)xtrabackup_binlog_pos_innodb —— 二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position。
(4)xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件;
(5)backup-my.cnf —— 備份命令用到的配置選項信息;
2、數據恢復
註意:恢復不用啟動MySQL
[root@bixia ~]#scp -r /app/backups/2017-11-14_16-16-20/ 172.18.77.77:
[root@huangshang ~]#systemctl stop mariadb
[root@huangshang ~]#rm -rf /var/lib/mysql/*
準備(prepare)一個完全備份
[root@bixia ~]#cd 2017-11-14_16-16-20/
我們切換到這個目錄下,給備份的數據進行一次prepare這個prepare是為了讓提交的事務同步,未提交的事務回滾,回滾的事務完成回滾 ,這個操作利用innobakupex命令的--apply-log選項可用於實現上述功能
一般情況下,在備份完成後,數據尚且不能用於恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
操作如下:
[root@bixia 2017-11-14_16-16-20]#innobackupex --apply-log /root/2017-11-14_16-16-20/ 171114 16:49:02 completed OK! 最後一行出現completed OK!就說明已經同步回應用完成
[root@bixia 2017-11-14_16-16-20]#innobackupex --copy-back /root/2017-11-14_16-16-20/ 171114 16:52:30 completed OK! 顯示成功即可
[root@bixia 2017-11-14_16-16-20]#cd /var/lib/mysql/ [root@bixia mysql]#chown -R mysql.mysql ./* 將所屬主和所屬者都改為mysql [root@bixia mysql]#systemctl start mariadb 啟動服務
[root@bixia mysql]#mysql -uroot -pcentos 嘗試連接,看數據是否恢復 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 4 Server version: 5.5.52-MariaDB MariaDB Server Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement. MariaDB [(none)]>
實驗證明數據恢復完成!!!!
全量,增量,二進制日誌實現時間點還原的備份
1、先做一次全量備份
[root@bixia ~]#innobackupex --user=root --password=centos --host=localhost /app/backups/
2、然後做增量備份,先連接數據庫,插入一條記錄
[root@bixia ~]#mysql -uroot -pcentos MariaDB [(none)]>use hidb; MariaDB [hidb]> insert into students values (1001,‘wangba‘,59,‘F‘,‘fanren‘);
[root@bixia ~]#innobackupex --user=root --password=centos --host=localhost --incremental /app/backups/ --incremental-basedir=/app/backups/2017-11-14_17-18-40 xtrabackup: Transaction log of lsn (3776175) to (3776175) was copied. 171114 17:29:43 completed OK! 備份完成 ,這是第一次增量備份
[root@bixia backups]#cd /app/backups/2017-11-14_17-29-39/ [root@bixia 2017-11-14_17-29-39]#ls backup-my.cnf hidb ibdata1.meta performance_schema xtrabackup_binlog_info xtrabackup_info ddvdb ibdata1.delta mysql test xtrabackup_checkpoints xtrabackup_logfile [root@bixia 2017-11-14_17-29-39]#cat xtrabackup_checkpoints backup_type = incremental 備份類型是增量備份 from_lsn = 3775741 to_lsn = 3776175 last_lsn = 3776175 compact = 0 recover_binlog_info = 0
我們在第二次增量備份
MariaDB [hidb]> delete from students where age>90; MariaDB [hidb]> select * from students;
[root@bixia ~]innobackupex --user=root --password=centos --host=localhost --incremental /app/backups/ --incremental-basedir=/app/backups/2017-11-14_17-29-39 xtrabackup: Transaction log of lsn (3794804) to (3794804) was copied. 171114 17:40:01 completed OK! [root@bixia backups]#cd 2017-11-14_17-39-58 [root@bixia 2017-11-14_17-39-58]#cat xtrabackup_checkpoints backup_type = incremental from_lsn = 3776175 to_lsn = 3794804 last_lsn = 3794804 compact = 0 recover_binlog_info = 0
在次對主mysql服務器上的數據進行某些操作,比如說在進行下述操作時服務器宕機了
MariaDB [hidb]> update students set major=‘shepi‘ where age=80; MariaDB [hidb]> select * from students where age=80;
因此我們要查看上次最後一次備份時的備份目錄下的xtrabackup_binlog_info文件,確定二進制日誌處於什麽事件的什麽位置
[root@bixia 2017-11-14_17-39-58]#cd /app/backups/ [root@bixia backups]#ls 2017-11-14_17-18-40 2017-11-14_17-29-39 2017-11-14_17-39-58 [root@bixia backups]#cd 2017-11-14_17-39-58/ [root@bixia 2017-11-14_17-39-58]#cat xtrabackup_binlog_info master-log.0000061290 [root@bixia ~]# mysqlbinlog -j 1290 /mydata/logs/master-log.000006 > /root/mybinlog.sql [root@bixia ~]#scp /root/mybinlog.sql 172.18.77.77: 將這部分數據拷貝到用於備份的那臺服務器上
3、數據恢復
首先把第一個增量備份合並上來,在把第二個增量合並上來,然後拿一個目錄去恢復,操作如下
[root@bixia 2017-11-14_17-39-58]#cd /app/backups/ [root@bixia backups]#ls 2017-11-14_17-18-40 2017-11-14_17-29-39 2017-11-14_17-39-58
[root@bixia ~]#cd /app/backups/2017-11-14_17-18-40/ [root@bixia 2017-11-14_17-18-40]#innobackupex --apply-log --redo-only /app/backups/2017-11-14_17-18-40/ 合並全量 171114 19:53:22 completed OK! 成功
[root@bixia 2017-11-14_17-18-40]#innobackupex --apply-log --redo-only ./ --incremental-dir=/app/backups/2017-11-14_17-29-39 合並第一個增量 171114 20:00:32 completed OK!
[root@bixia 2017-11-14_17-18-40]#innobackupex --apply-log --redo-only /app/backups/2017-11-14_17-18-40/ --incremental-dir=/app/backups/2017-11-14_17-39-58 合並第二個增量 171114 20:03:24 completed OK!
上述合並的增量務必在全量備份的目錄下去合並
[root@bixia backups]#scp -r 2017-11-14_17-18-40 172.18.77.77: 將合並完後的全量目錄拷貝到用於數據恢復的服務器上 [root@bixia mysql]#systemctl stop mariadb [root@bixia mysql]#rm -rf /var/lib/mysql/* [root@bixia ~]#cd 2017-11-14_17-18-40 [root@bixia 2017-11-14_17-18-40]#innobackupex --copy-back /root/2017-11-14_17-18-40/ [root@bixia 2017-11-14_17-18-40]#cd /var/lib/mysql/ [root@bixia mysql]#chown -R mysql.mysql ./* [root@bixia ~]#cp mybinlog.sql /tmp/
[root@bixia ~]#systemctl start mariadb
[root@bixia ~]#mysql -uroot -pcentos MariaDB [(none)]> use hidb; MariaDB [hidb]> select * from students where age=80; +------+---------+------+--------+--------------+ | id | name | age | gender | major | +------+---------+------+--------+--------------+ | 65 | stu65 | 80 | M | NULL | | 83 | stu83 | 80 | M | NULL | | 104 | stu104 | 80 | F | NULL | | 113 | stu113 | 80 | M | NULL | | 192 | stu192 | 80 | F | NULL | | 207 | stu207 | 80 | F | NULL | | 222 | stu222 | 80 | F | NULL | | 298 | stu298 | 80 | M | NULL | | 409 | stu409 | 80 | F | NULL | | 415 | stu415 | 80 | F | NULL | | 448 | stu448 | 80 | F | NULL | | 513 | stu513 | 80 | F | NULL | | 545 | stu545 | 80 | M | NULL | | 590 | stu590 | 80 | F | NULL | | 676 | stu676 | 80 | M | NULL | | 696 | stu696 | 80 | F | NULL | | 824 | stu824 | 80 | F | NULL | | 894 | stu894 | 80 | F | NULL | | 930 | stu930 | 80 | M | NULL | | 1000 | stu1000 | 80 | M | NULL | +------+---------+------+--------+--------------+ MariaDB [hidb]> set @@session.sql_log_bin=off; MariaDB [(none)]> \. /tmp/mybinlog.sql MariaDB [hidb]> select * from students where age=80; +------+---------+------+--------+-------------+ | id | name | age | gender | major | +------+---------+------+--------+-------------+ | 65 | stu65 | 80 | M | shepi | | 83 | stu83 | 80 | M | shepi | | 104 | stu104 | 80 | F | shepi | | 113 | stu113 | 80 | M | shepi | | 192 | stu192 | 80 | F | shepi | | 207 | stu207 | 80 | F | shepi | | 222 | stu222 | 80 | F | shepi | | 298 | stu298 | 80 | M | shepi | | 409 | stu409 | 80 | F | shepi | | 415 | stu415 | 80 | F | shepi | | 448 | stu448 | 80 | F | shepi | | 513 | stu513 | 80 | F | shepi | | 545 | stu545 | 80 | M | shepi | | 590 | stu590 | 80 | F | shepi | | 676 | stu676 | 80 | M | shepi | | 696 | stu696 | 80 | F | shepi | | 824 | stu824 | 80 | F | shepi | | 894 | stu894 | 80 | F | shepi | | 930 | stu930 | 80 | M | shepi | | 1000 | stu1000 | 80 | M | shepi | +------+---------+------+--------+-------------+ MariaDB [hidb]> set @@session.sql_log_bin=on;
實驗證明數據已經恢復,但是切記這時在做一次全量備份!!!!!!!!!!
Xtrabackup進行MySQL備份與恢復