1. 程式人生 > 資料庫 >MySQL備份與恢復之Xtrabackup工具(二)

MySQL備份與恢復之Xtrabackup工具(二)

Xtrabackup物理備份工具,備份MySQL5.6.36

(一)Xtrabackup工具簡介
percona公司的備份工具,效能比較高。物理備份工具。
特點:
物理備份工具,在同級資料量基礎上,都要比邏輯備份效能要好的多。
特別是在資料量比較大的時候,體現的更加明顯。
備份方式:
1、拷貝資料檔案(myisam儲存引擎可以直接cp拷貝,但是innodb的不行)
2、拷貝資料頁
備份原理(innodb):
1、對於innodb表,可以實現熱備
(1)在資料還有修改操作的時刻,直接將資料檔案中的資料頁備份
此時,備份走的資料對於當前mysql來講是不一致。
(2) 將備份過程中的redo和undo一併備走。
(3)為了恢復的時候,只要保證備份出來的資料頁LSN能和redo LSN匹配,

將來恢復的就是一致的資料。redo應用和undo的應用。
2、對與myisam表,實現自動鎖表拷貝檔案。

(二)Xtrabackup軟體安裝:
1、安裝
(1)依賴包解決
wget -O /etc/yum.repos.d/epel.repo
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

wget
rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm

(2)下載Xtrabackup軟體並安裝
wget
yum -y install percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

2、命令引數詳解和備份舉例
建立備份路徑
mkdir /server/backup -p

innobackupex引數講解:
--user=
--password=
--socket= //配置檔案/etc/my.cnf裡面指定了,就不需要指定了
--no-timestamp

全備例子:
innobackupex --user=root --password=oldboy123 /server/backup/ //備份時,需要指定備份路徑,這種會以時間戳為目錄,備份出來
innobackupex --no-timestamp /server/backup/full //以full目錄來存放資料

(三)全備備份恢復實戰:
1、資料備份
innobackupex --user=root --password=oldboy123 --no-timestamp /server/backup/full

2、恢復資料前的準備(合併xtabackup_log_file和備份的物理檔案)
innobackupex --apply-log --use-memory=32M /server/backup/full/

3、模擬故障
停庫:
pkill mysqld
破壞資料:
cd /application/mysql/data
\rm -rf *

4、恢復
(cp -a /server/backup/full/* /application/mysql/data) //一般不建議用這種方式,用第二種方式最佳
或者
innobackupex --copy-back /server/backup/full/ ###注意:恢復時,要確認資料路徑是空的,並且資料庫是停掉的

chown -R mysql.mysql /application/mysql/data //遞迴授權太重要了,不然資料庫啟動不了,切記!!!已經踩過坑了

啟動:
/etc/init.d/mysqld start

(四)xtrabackup 實現增量備份及故障恢復:

週日全備,週一到週六做增量

1、週日全備:
mkdir /backup/full
innobackupex --user=root --password=123 --no-timestamp /backup/full/
2、模擬資料變化(週一資料變化)
mysql> insert into t1 values(7,'zhao3');


3、第一增量(週一晚上增量):
innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1
4、模擬資料變化(週二資料變化)
insert into t1 values(8,'tangyong');


5、第二次增量(週二晚上增量):
innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2
6、模擬資料損壞
n多的操作。。。。。
週三上午10:00時刻,刪除t1表
drop table t1;

7、資料恢復前準備:
innobackupex --apply-log --redo-only /backup/full
innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full
innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full
innobackupex --apply-log /backup/full

8、資料恢復:(切記,恢復前需要關閉資料庫)
Error: datadir must be specified. (這種情況需要在/etc/my.cnf配置檔案裡面指定data資料檔案目錄)
innobackupex --copy-back /backup/full/

啟動資料庫:
chown -R mysql.mysql /applicaion/mysql/data/ 注意:更改所屬主和組,必須要做,否則啟動不了
/etc/init.d/mysql start


作業:生產恢復案例:
背景:
1、xtrabackup備份策略每週日,full全備
2、xtrabackup週一到週六,inc1-inic6
3、總資料量200G
4、週三上午10點誤刪除表t1,資料量1G左右
5、週二晚上inc2備份完成之後到週三上午10點又做了很多操作

如何將資料庫恢復到t1表誤刪除之前狀態?

思路:
1、停業務,掛維護頁
2、找備用庫
3、合併full+inc1+inc2
4、擷取週二晚上inc2備份後到週三上午10點,t1表刪除之前的binlog日誌
5、將合併後的full+擷取的binlog恢復到備用庫
6、驗證資料可用性和完整性
7、使用備用庫替代生產庫使用或者將t1表匯出並匯入回生產庫
8、業務恢復

作業實踐驗證-方法1: (常用方法)
innobackupex增量備份實踐
1、週末晚上對資料進行全量備份
innobackupex --user=root --password=oldboy123 --no-timestamp /backup/full
2、週一對資料進行輸入等操作
insert into t1 values(9,'tang1');
insert into t1 values(10,'tang2');
3、週一晚上對資料進行增量備份
innobackupex --user=root --password=oldboy123 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1
4、週二對資料進行輸入操作
insert into t1 values(11,'tao1');
insert into t1 values(12,'tao2');
5、週二晚上對資料進行增量備份
innobackupex --user=root --password=oldboy123 --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2
6、週三對資料進行輸入操作
insert into t1 values(13,'shanchu1');
insert into t1 values(14,'shanchu2');
7、週三備份前對資料進行刪除操作
drop table t1;
8、資料恢復前準備
innobackupex --apply-log --redo-only /backup/full
innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full
innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full
innobackupex --apply-log /backup/full
9、資料進行恢復
innobackupex --copy-back /backup/full/
啟動資料庫:
chown -R mysql.mysql /applicaion/mysql/data/ 注意:更改所屬主和組,必須要做,否則啟動不了
/etc/init.d/mysql start
10、二進位制日誌擷取
[root@db02 full]# more xtrabackup_binlog_pos_innodb //檢視到最後一次備份的標誌位
my-bin.000003 906

show binary logs和show binlog events in 'my-bin.000003'; //檢視到刪表前的標誌位
| my-bin.000003 | 1275 | Xid | 1 | 1306 | COMMIT / xid=68 /

mysqlbinlog --start-position=906 --stop-position=1306 /data/binlog/my-bin.000003 >/backup/binlog.sql

11、進行binlog日誌檔案的恢復 //到此,xtrabackup備份的資料和binlog二進位制備份的資料已經全部恢復
臨時關閉二進位制日誌
set sql_log_bin=0;
恢復操作
source /backup/binlog.sql;

作業實踐驗證-方法2:
//注:這種表結構只有問開發,必須知道表結構才行,這種方法可以不需要恢復所有資料,針對丟失的1G資料恢復就可以了。
drop table t1; //模擬t1表被誤刪
create table t1 (id int,name varchar(20)); //注:這種表結構只有問開發,必須知道表結構才行
alter table t1 discard tablespace;

cd /application/mysql/data/oldboy
cp /backup/full/oldboy/t1.ibd ./ //將inc2狀態下的t1.ibd檔案拷貝過來

chown -R mysql.mysql * //修改檔案所屬,改為mysql
alter table t1 import tablespace;