xtrabackup工具 进行备份和恢复介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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领域的朋友们。有不妥之处请留言,一起交流学习

以上是关于xtrabackup工具 进行备份和恢复介绍的主要内容,如果未能解决你的问题,请参考以下文章

mysql xtrabackup 备份恢复实现分享

Xtrabackup进行MySQL备份与恢复

mysql xtrabackup 备份恢复实现,mysql命令备份数据库,打包压缩数据库

percona-xtrabackup完全及增量备份与恢复

xtrabackup热备和恢复mysql

MySQL数据库物理备份