XtraBackup是Percona公司開發的一款很好用的數據備份工具,支持對InnoDB引擎數據的熱備份,對MyISAM引擎的數據作備份時須要鎖表,詳細信息參見官網或其餘資源。【XtracBackup官網】mysql
操做系統:CentOS 6.5 64位 主機地址:10.0.0.26 主機名:mysql01 mysql版本:mysql-5.6.36 XtraBackup版本:2.4.12
MySQL服務詳細安裝過程請參考上一篇文章【慢查詢可視化介紹】
這裏須要注意的是,必需要開啓log-bin功能,並且日誌文件最好不要和數據文件放在同一個目錄,以避免對實驗形成影響。下面是mysql的基本配置,若是缺乏其中某一項則可能會出現報錯。sql
[mysqld] basedir=/opt/mysql-5.6.36/ datadir=/opt/mysql/data log-bin=/opt/mysql/log/mysql-bin slow_query_log_file = /opt/mysql/log/slow.log [client] socket=/opt/mysql/tmp/mysql.sock
一、安裝XtraBackup的依賴:數據庫
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
二、下載安裝XtraBackup:服務器
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.12-1.el6.x86_64.rpm --no-check-certificate yum -y localinstall percona-xtrabackup-24-2.4.12-1.el6.x86_64.rpm
三、檢查是否安裝成功:app
[root@mysql01 data]# xtrabackup -v xtrabackup: recognized server arguments: --datadir=/opt/mysql/data --log_bin=/opt/mysql/log/mysql-bin xtrabackup version 2.4.12 based on MySQL server 5.7.19 Linux (x86_64) (revision id: 170eb8c)
某公司使用mysql數據庫做爲生產環境,對數據庫的備份策略爲全量+增量,具體以下:
一、每週六00:00經過XtraBackup進行一次數據全量備份socket
0 0 * * 6 full.sh
二、週日-週五天天01:00經過XtraBackup進行數據增備ide
0 1 * * 0-5 inc.sh
三、開啓binlog日誌功能工具
在星期二的下午2點,某開發人員不當心誤刪了一張表,大概10GB左右,須要對該表進行恢復操做。在刪表到開始恢復的這段時間內,可能還在繼續對其餘表進行寫入操做。測試
一、斷開數據庫的鏈接,以防止二次破壞 二、準備上週六全備,並--apply-log redo-only 三、合併增量,週日、周1、--apply-log --redoonly 週二--apply-log 四、在測試庫恢復以上數據,數據的目前狀態應該週二凌晨1:00 五、須要恢復的數據狀態是下午2點鐘左右,從1點開始的binlog恢復到刪除以前那個events的position。 六、導出刪除的表,恢復到生產庫,驗證數據可用性、完整性。 七、啓動應用鏈接數據庫。
一、建立備份相關目錄:spa
mkdir /backup/xbackup/full #<==全備目錄 mkdir /backup/xbackup/inc1 #<==增備目錄1 mkdir /backup/xbackup/inc2 #<==增備目錄2 mkdir /backup/xbackup/inc3 #<==增備目錄3
二、建立數據庫和表:
建立數據庫test,在test下建立表test和SC。其中test是須要刪除的表,而SC是一直有數據寫入的表
create database test character set utf8 collate utf8_general_ci; use test; create table test(id int,name char(20),age int); drop table SC; create table SC( SCid int(12) NOT NULL auto_increment COMMENT '主鍵', Cno int(10) NOT NULL COMMENT '課程號', Sno int(10) NOT NULL COMMENT '學號', Grade tinyint(2) NOT NULL COMMENT '學生成績', PRIMARY KEY (SCid) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
時間規劃爲2018-07-20(週五)----2018-07-24(週二)![]
一、模擬全備前數據寫入:
date -s 2018-07-20 insert into test values(1,'小紅',11); insert into test values(2,'小黃',12); INSERT INTO SC(Sno,Cno,Grade) values(0001,1001,1);
二、週六數據全備及以後數據寫入:
date -s 2018-07-21 innobackupex --user=root --password=123456 --no-timestamp /backup/xbackup/full/ date -s 08:00:00 insert into test values(3,'小藍',13); INSERT INTO SC(Sno,Cno,Grade) values(0002,1002,2); commit;
三、週日1點進行增備(20180722)和增量數據模擬:
date -s 2018-07-22 date -s 01:00:00 innobackupex --user=root --password=123456 --incremental --no-timestamp --incremental-basedir=/backup/xbackup/full/ /backup/xbackup/inc1 date -s 14:00:00 insert into test values(4,'小白',14); INSERT INTO SC(Sno,Cno,Grade) values(0003,1003,3); commit;
四、週一1點進行增備(20180723)和增量數據模擬:
date -s 2018-07-23 date -s 01:00:00 innobackupex --user=root --password=123456 --incremental --no-timestamp --incremental-basedir=/backup/xbackup/inc1/ /backup/xbackup/inc2 date -s 17:00:00 insert into test values(5,'小黑',15); INSERT INTO SC(Sno,Cno,Grade) values(0004,1004,4); commit;
五、週二1點進行增備(20180724)和增量數據模擬:
date -s 2018-07-24 date -s 01:00:00 innobackupex --user=root --password=123456 --incremental --no-timestamp --incremental-basedir=/backup/xbackup/inc2/ /backup/xbackup/inc3 date -s 04:00:00 insert into test values(6,'小黃',16); INSERT INTO SC(Sno,Cno,Grade) values(0005,1005,5); commit;
在下午兩點的時候刪除表test,在此以後還繼續對其餘表進行操做。
date -s 14:00:00 drop table test; INSERT INTO SC(Sno,Cno,Grade) values(0006,1006,6);
想要恢復數據,須要XtraBackup備份到星期二01:00點的數據,以及binlog在星期二01:00點以後到14:00這一段時間之類的數據。根據這兩部分的數據,便可恢復表刪除以前時間點的數據。
一、獲取XtraBackup到星期二01:00的完整數據:
innobackupex --apply-log --redo-only /backup/xbackup/full/ innobackupex --apply-log --redo-only --incremental-dir=/backup/xbackup/inc1 /backup/xbackup/full/ innobackupex --apply-log --redo-only --incremental-dir=/backup/xbackup/inc2 /backup/xbackup/full/ innobackupex --apply-log --incremental-dir=/backup/xbackup/inc3 /backup/xbackup/full/ innobackupex --apply-log /backup/xbackup/full/ 詳細備份參數請參考官方文檔或其餘資料。
二、確認binlog的起點:
在XtraBackup的備份文件xtrabackup_binlog_info中會記錄binlog的文件及起始位置。
三、確認DROP語句以前的binlog位置:
mysqlbinlog --start-position=3295 /opt/mysql/log/mysql-bin.000006 >> /tmp/tmp.sql cat /tmp/tmp.sql
四、恢復成sql文件:
經過上面兩步,能夠發現binlog的起始位置,以及DROP以前一個的結束位置。經過這兩個position能夠生成從01:00開始到14:00這一段時間內的數據庫增量文件。
mysqlbinlog --start-position=3295 --stop-position=3782 /opt/mysql/log/mysql-bin.000006 > /tmp/recover.sql
經過另一臺測試庫恢復。將XtraBackup和binlog的恢復文件發送到另一臺測試數據庫(10.0.0.27,mysql02),經過這臺測試數據庫將數據恢復到14:00的狀態,再經過mysqldump備份出test表,最終傳輸到mysql01將數據恢復。
一、傳輸備份文件到mysql02:
scp -rp /backup/xbackup/full/ root@10.0.0.27:/tmp/ scp -rp /tmp/recover.sql root@10.0.0.27:/tmp/
二、測試庫恢復XtraBackup數據:
再數據恢復以前,須要將測試庫的data目錄清空
innobackupex --copy-back /tmp/full/ chown -R mysql.mysql /opt/mysql/data/ /etc/init.d/mysqld start
三、測試庫恢復binlog數據:
source /tmp/recover.sql
到此,已恢復到了刪表前一個時間點的數據,這時咱們將test表導出並恢復到正式庫便可。
mysqldump -uroot -p123456 test test > /tmp/test_test.sql mysql -uroot -p123456 < /tmp/test_test.sql 刪除表恢復到刪除時間點過程結束!
從XtraBackup抽取表文件恢復。相對於方案一來講,不須要恢復所有數據庫,也不須要再其餘庫上進行恢復,可是此種方式須要清楚建表的結構。
一、導出表:
導出表是在備份的prepare階段進行的,所以,一旦徹底備份完成,就能夠在prepare過程當中經過--export選項將某表導出了。
導出前:
導出表命令:
innobackupex --apply-log --export /backup/xbackup/full/ 此命令會爲每一個innodb表的表空間建立一個以.exp結尾的文件,這些以.exp結尾的文件則能夠用於導入至其它服務器。
導出後:能夠看出多了表結構等兩個文件
二、建立相同結構的表並刪除此表的表空間:
create table test(id int,name char(20),age int); alter table test.test discard tablespace; #<==必須經過命令刪除,不能手動刪除文件
三、複製test.ibd和test.exp文件到數據目錄:
[root@mysql01 test]# pwd /backup/xbackup/full/test [root@mysql01 test]# cp test.ibd /opt/mysql/data/test/ [root@mysql01 test]# cp test.exp /opt/mysql/data/test/ [root@mysql01 test]# chown -R mysql.mysql /opt/mysql/data/test/*
四、使用命令導入表
alter table test import tablespace;
五、經過binlog恢復tests表01:00-14:00的增量數據
單表恢復只涉及到了test表,所以不須要其餘表的數據,須要從recover.sql中過濾出test表
grep test /tmp/recover.sql > /tmp/test.sql source /tmp/test.sql
方案1
不須要知道原來的表結構,主庫也只須要source sql文件,可是須要恢復所有數據庫,而且須要在兩臺主機上傳輸數據,在數據量大的時候比較慢。
方案2
須要知曉表結構,相對來講更簡單快捷。
至此,XtraBackup備份及恢復實踐完畢!!!