一、环境准备:
系统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
[[email protected] ~]# which xtrabackup
/usr/bin/xtrabackup
[[email protected] ~]# which innobackupex
/usr/bin/innobackupex
nnobackupex命令其实是软连接到xtrabackup的。但是备份数据时要采用innobackupex命令
[[email protected] ~]# 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 [email protected]‘localhost‘ identified by ‘123456‘;flush privileges;
或者
grant reload,replication client,lock tables,process,super on *.* to [email protected]‘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:备份未使用并行备份的时的时间:
[[email protected] 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的引擎
[[email protected] db_3306_20190808]# cat /data/backup/db_3306_20190808/xtrabackup_binlog_info
mysql-bin.000002 3199225 bde7b592-b966-11e9-8c64-000c294f3e61:1-7796
[[email protected] 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实例:
[[email protected] 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 |
+---------------+-----------+
[[email protected] 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领域的朋友们。有不妥之处请留言,一起交流学习
原文地址:https://blog.51cto.com/wujianwei/2430281