系统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.13html
1.建立测试数据:mysql
建立一个定时器和存储过程来生成数据模拟演示xtrabackup 的备份过程linux
建立一个测试库testdbsql
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 中写数据:tomcat
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包安装:session
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.htmlapp
下载rpm包来安装ide
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
到此处安装完成
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 的位置点会不一样的,可是要以位置点大的为准.
正常的状况下show master status\G的显示的Gtid值和binglog文件,position和xtrabackup_binlog_info内容是一致的,因此要以xtrabackup_binlog_info的信息为准。
下面的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
重要提示
MySQL5.5的选择2.2xtrabackup备份
MySQL5.6的选择2.3xtrabackup备份
MySQL5.7的选择2.4xtrabackup 备份
具体备份命令能够参考下面的文档
https://blog.51cto.com/wujianwei/1934084
以上备份原理出自知书堂mysql课程内容总结。本博文总结于此处,方便本身工做和学习查阅,顺便也贡献给专一于MySQL领域的朋友们。有不妥之处请留言,一块儿交流学习