xtrabackup工具 進行備份和恢復介紹

一、環境準備:

系統CentOS Linux release 7.2.1511 (Core) X_86 64位最小化安裝
mysql版本是官方二進制版本5.7.22-22,mysql採用的是二進制安裝,單機上開啓2個mysql實例,mysql實例要開啓定時器event_scheduler=ON. 而且2個mysql實例都要開啓Gtid
xtrabackup 採用的是rpm包安裝,版本是version 2.4.13

1.創建測試數據:

創建一個定時器和存儲過程來生成數據模擬演示xtrabackup 的備份過程

創建一個測試庫testdb

create database testdb;
use testdb;

創建一個測試表如下:

CREATE TABLE `test1_event` (
`id` int(8) NOT NULL AUTO_INCREMENT, 
`username` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(20) COLLATE utf8_unicode_ci NOT NULL, 
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`id`) )ENGINE=innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

創建一個存儲過程和一個定時器,讓其定時在表test1_event 中寫數據:

DELIMITER //
DROP PROCEDURE IF EXISTS p_test2//
CREATE PROCEDURE p_test2() 
BEGIN
INSERT INTO test1_event(username,password,create_time) values('tomcat', 'xiaohuahua',now());
END//
CREATE EVENT e_test
ON SCHEDULE EVERY 2 second STARTS TIMESTAMP '2019-08-08 08:29:00'
ON COMPLETION PRESERVE
DO
BEGIN
CALL p_test2();
END//
delimiter ; 

存儲過程和定時器簡單描述:
A.創建一個存儲過程p_test2(), 這個存儲過程就是insert 數據到表test1_event
B.創建一個定時器,從2019-08-08 08:29:00 這個時間點開始,每隔2秒插入一條數據到表test1_event.類似於linux下的定時任務

2.xtrabackup rpm包安裝:

xtrabackup安裝使用介紹如下:

官網下載地址:
https://www.percona.com/downloads/XtraBackup/LATEST/
https://www.percona.com/downloads/
https://www.percona.com/doc/percona-xtrabackup/2.4/using_xtrabackup/privileges.html

下載rpm包來安裝

wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.14/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm

yum localinstall percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm

[root@mgr01 ~]# which xtrabackup
/usr/bin/xtrabackup
[root@mgr01 ~]# which innobackupex 
/usr/bin/innobackupex

nnobackupex命令其實是軟連接到xtrabackup的。但是備份數據時要採用innobackupex命令

[root@mgr01 ~]# ll /usr/bin/innobackupex
lrwxrwxrwx 1 root root 10 Apr 13 20:04 /usr/bin/innobackupex -> xtrabackup
到此處安裝完成

二、xtrabackup 工具使用介紹:

2.1 採用xtrabackup 備份數據庫數據時必須得有登錄本地數據庫的權限:

權限一般給reload,replication client, lock tables, process  super 
grant  reload,replication client,lock tables,process,super on *.* to backupuser@'localhost' identified by '123456';flush privileges;

或者

grant  reload,replication client,lock tables,process,super on *.* to backupuser@'127.0.0.1' identified by '123456';flush privileges;

2.2 備份命令說明:

全量備份命令:

 innobackupex --defaults-file=/data/mysql/mysql3306/my.cnf  -ubackupuser -p123456 --host=127.0.0.1 -S /tmp/mysql3306.sock  --no-timestamp /data/backup/db_3306_`date +%Y%m%d`
或者是 
 innobackupex --defaults-file=/data/mysql/mysql3306/my.cnf  -ubackupuser -p123456 --host=localhost -S /tmp/mysql3306.sock  --no-timestamp /data/backup/db_3306_`date +%Y%m%d`

當然在給的權限是localhost時,也可以去掉--host選項。如下命令:

 innobackupex --defaults-file=/data/mysql/mysql3306/my.cnf  -ubackupuser -p123456  -S /tmp/mysql3306.sock  --no-timestamp /data/backup/db_3306_`date +%Y%m%d`

是支持並行備份的,有個命令參數 parallel。如果生產環境的話,庫的壓力是非常的小的話,可以使用這個參數進行並行備份的,但是庫的壓力大的話,就不要用這個參數了。

innobackupex --help|grep parallel

A:備份未使用並行備份的時的時間:

[root@mgr01 backup]# time innobackupex --defaults-file=/data/mysql/mysql3306/my.cnf  -ubackupuser -p123456  --host=127.0.0.1  -S /tmp/mysql3306.sock  --no-timestamp /data/backup/db_3306_`date +%Y%m%d`
190808 10:02:25 completed OK!

real    0m11.294s
user    0m0.490s
sys 0m1.006s

使用的時間是11秒

B:備份使用了並行備份參數的備份時間: 使用4個線程並行備份

time innobackupex --defaults-file=/data/mysql/mysql3306/my.cnf  -ubackupuser -p123456  --host=127.0.0.1  -S /tmp/mysql3306.sock  --parallel=4 --no-timestamp /data/backup/db_3306_`date +%Y%m%d`
190808 09:58:01 completed OK!

real    0m6.548s
user    0m0.378s
sys 0m0.703s

使用的時間6秒

xtrabackup 備份數據提示:

xtrabackup在備份時,一定要避開業務的高峯期操作,如果在業務的高峯期操作,會產生大量的redo 文件,在恢復數據庫的過程中會非常的慢。而且在備份過程中是存在鎖表的。影響到數據的正常寫入。
而且備份最好是在slave庫上進行備份。因爲slave庫上是允許延遲的

鎖表驗證:

從備份的日誌看到是從11:42:08 開始鎖表的

190808 11:42:08 Executing FLUSH TABLES WITH READ LOCK...
190808 11:42:08 Starting to backup non-InnoDB tables and files
到11:42:13  13秒後完成解鎖
190808 11:42:13 Executing UNLOCK TABLES
190808 11:42:13 All tables unlocked
此時查看錶test1_event中的數據(實際是每2秒insert 一條)
 5621 | tomcat   | xiaohuahua | 2019-08-08 11:42:04 |
| 5622 | tomcat   | xiaohuahua | 2019-08-08 11:42:06 |  ##由於08秒處出現鎖表,所以數據沒寫入成功
| 5623 | tomcat   | xiaohuahua | 2019-08-08 11:42:13 |
| 5624 | tomcat   | xiaohuahua | 2019-08-08 11:42:13 |   ##到13秒處,突然一下插入2條數據
| 5625 | tomcat   | xiaohuahua | 2019-08-08 11:42:14 |
| 5626 | tomcat   | xiaohuahua | 2019-08-08 11:42:16 |

從此處說明,xtrabackup 在備份innodb表時,還是會鎖表的,鎖表會造成數據延遲寫入,和丟失數據的情況

2.3 恢復的命令介紹:
此次演示的恢復在本機上再新開啓一個mysql 3308的實例來恢復。 把上面3306實例上備份的文件恢復到3308的實例上

xtrabackup 恢復演示:

對數據庫進行備份xtrabackup。 備份完了。然後採用下面的命令來恢復


 innobackupex  --apply-log   /data/backup/db_3306_20190808/
 190808 10:31:56 completed OK!

innobackupex --defaults-file=/data/mysql/mysql3308/my3308.cnf --copy-back /data/backup/db_3306_20190808/
 190808 10:41:38 completed OK!

提示:如果mysql實例中表存在多個引擎的話,下面的文件中的記錄的binlog 的位置點會不同的,但是要以位置點大的爲準
下面的binlog位置點是相同的,原因是mysql實例中所有的表都採用的是Innodb的引擎

[root@mgr01 db_3306_20190808]# cat /data/backup/db_3306_20190808/xtrabackup_binlog_info
mysql-bin.000002    3199225 bde7b592-b966-11e9-8c64-000c294f3e61:1-7796
[root@mgr01 db_3306_20190808]# cat /data/backup/db_3306_20190808/xtrabackup_binlog_pos_innodb 
mysql-bin.000002    3199225

啓動mysql3308 實例報錯:

[ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
2019-08-08T10:46:55.705574+08:00 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable

原因是權限不對
給恢復的數據目錄data mysql的權限

 chown -R mysql.mysql  /data/mysql/mysql3308/data 

再次啓動mysql 啓動成功:

 /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3308/my3308.cnf   &

數據成功恢復到3308實例:

[root@mgr01 mysql3308]# mysql -S /tmp/mysql3308.sock -e "select count(*) from testdb.test1_event;select user,host from mysql.user;"
+----------+
| count(*) |
+----------+
|     2631 |
+----------+
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| backupuser    | 127.0.0.1 |
| backupuser    | localhost |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
[root@mgr01 mysql3308]# 

2.4Tips:

如果備份不是用並行,恢復的時候可以用並行麼 ??是可以.
恢復時,想讓恢復的更快,可以把 --use-memory= 這個內存的值調整的大點,這個參數只是針對在恢復數據庫採用--apply-log參數時使用--use-memory= 加大內存可以加快恢復數據庫的時間

  --use-memory The default value is 100MB, 
 官網介紹地址: https://www.percona.com/doc/percona-xtrabackup/2.3/xtrabackup_bin/xbk_option_reference.html#cmdoption-xtrabackup-use-memory

採用多線程恢復:

time innobackupex --defaults-file=/data/mysql/mysql3308/my3308.cnf  --parallel=2 --use-memory=200M --copy-back /data/backup/db_3306_20190808/
190808 11:14:26 completed OK!

real    0m16.963s
user    0m0.037s
sys 0m2.270s

恢復使用的時間是16秒

採用單線程恢復:

  time innobackupex --defaults-file=/data/mysql/mysql3308/my3308.cnf  --use-memory=200M --copy-back /data/backup/db_3306_20190808/
190808 11:16:11 completed OK!

real    0m21.567s
user    0m0.035s
sys 0m2.905s

恢復使用的時間是21秒

2.5 xtrabackup 增量備份原理:

查找上次備份終止的LSN號
Copy redo
對於LSN號:
大於上次終止的LSN的Page頁都進行copy(每個表一個單獨的文件)
小於上次終止的LSN的Page不copy

生產上不建議使用 xtrabackup 來進行增量備份數據庫

2.6 xtrabackup 恢復原理:

利用xtrabackup 實現crash recovery:
沒有binlog參與
找到checkpoint 的LSN號
掃描大於checkpoint 的LSN號 的redo,確認commit併合併到datafile,反之rollback

提示:
apply-log過程中出現失敗的話是可以多次運行apply-log的

Tps:
xtrabackup 備份時,在cp .ibd文件的過程中,此時是沒有鎖表的,但是是不允許修改表結構的
當前的版本中,在備份數據庫的過程中時不允許進行DDL操作的,所以備份的過程中是不允許 alter 表結構的
undo 文件是存放的歷史數據,方便數據庫庫故障進行恢復使用的,它是要持久化到磁盤的

提示:

不管什麼DML(create alter )操作都會形成undo
update insert delete,
select 操作是不會形成undo 的
MySQL8.0 的DDL操作也會形成undo

具體備份命令可以參考下面的文檔
https://blog.51cto.com/wujianwei/1934084

以上備份原理出自知書堂mysql課程內容總結。本博文總結於此處,方便自己工作和學習查閱,順便也貢獻給專注於MySQL領域的朋友們。有不妥之處請留言,一起交流學習

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