一次线上的Xtrabackup主从复制过程
一、Xtrabackup介绍
1.Xtrabackup和mysqlump的区别
mysqldump:逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能够接受的,如果数据库非常大,那再使用mysqldump备份就不太适合了。
Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上唯一一个开源的能够对innodb和xtradb数据库进行物理热备的工具。测试环境中备份150G的数据,大概20多分钟。
2.xtrabackup工具的特点
1)备份过程快速,可靠;
2)备份过程不会打断正在执行的事务(不需要锁表)
3)能够给予压缩等功能节约磁盘空间和流量。
4)自动实现备份检验;
5)还原速度快;
6)可以进行流传出备份,备份到另外一台机器上
3.工具集
软件包安装完后一共有4个可执行文件,如下:
usr
├── bin
│ ├── innobackupex
│ ├── xbcrypt
│ ├── xbstream
│ └── xtrabackup
其中最主要的是 innobackupex 和 xtrabackup,前者是一个 perl 脚本,后者是 C/C 编译的二进制。
a.innobackupex:此工具将xtrabackup进行封装,本身是个perl脚本,可以备份mysiam表。innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 mysqld server 发送命令进行交互,如加读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。简单来说,innobackupex 在 xtrabackup 之上做了一层封装。
b.xtrabackup:用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,只能备份表数据,不能备份表结构。xtrabackup是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 mysqld server 没有交互;
另外两个小众的工具:
xbcrypt 是加解密用的;xbstream 类似于tar,是 Percona 自己实现的一种支持并发写的流文件格式。两都在备份和解压时都会用到(如果备份用了加密和并发)。
4.原理
2个工具之间的交互和协调是通过控制文件的创建和删除来实现的,主要文件有:
a. xtrabackup_suspended_1
b. xtrabackup_suspended_2
c. xtrabackup_log_copied
举个例子,我们来看备份时 xtrabackup_suspended_2 是怎么来协调2个工具进程的
1.innobackupex 在启动 xtrabackup 进程后,会一直等 xtrabackup 备份完 InnoDB 文件,方式就是等待 xtrabackup_suspended_2 这个文件被创建出来;
2.xtrabackup 在备完 InnoDB 数据后,就在指定目录下创建出这个文件,然后等这个文件被 innobackupex 删除;
3.innobackupex 检测到文件 xtrabackup_suspended_2 被创建出来后,就继续往下走;
4.innobackupex 在备份完非 InnoDB 表后,删除 xtrabackup_suspended_2 这个文件,这样就通知 xtrabackup 可以继续了,然后等 xtrabackup_log_copied 被创建;
5.xtrabackup 检测到 xtrabackup_suspended_2 文件删除后,就可以继续往下了。
5.备份过程
更多详情可参考网站:
http://www.cnblogs.com/zhoujinyi/p/5888271.html
二、xtrabackup的安装部署配置
安装方法:
1.下载安装包。
可直接登陆网站,也可使用以下命令:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.3/binary/redhat/6/x86_64/percona-xtrabackup-2.3.3-1.el6.x86_64.rpm |
---|
下载的是rpm包。
2.安装依赖
yum install -y perl-DBD-MySQL per-DBI perl-Time-HiRes libaio* |
---|
3.安装rpm包
rpm -ivh percona-xtrabackup-2.3.3-1.e16.x86_64.rpm |
---|
此时会发现提示如下错误:
warning: percona-xtrabackup-2.3.3-1.e16.x86_64.rpm: Header V4 DSA/SHA1 Signature,key ID cd2efd2a: NOKEYerror: Faild dependencies:lidev.so4()(64bit) is needed by percona-xtrabackup-2.3.3-1.e16.x86_64 |
---|
原因是缺少依赖项,去官网下载依赖项。官网地址:
地址:http://rpmfind.net/linux/RPM/index.html
搜索libev.so.4()(64bit),这里我下载的版本是:
libev-4.04-2.e16.x86_64.rp
4.安装依赖:
rpm -ivh libev-4.04-2.e16.x86_64.rpm |
---|
5.安装xtrabackup
rpm -ivh percona-xtrabackup-2.3.3-1.e16.x86_64.rpmPreparing... ########################################### [100%] 1:percona-xtrabackup ########################################### [100%] |
---|
三、xtrabackup重要参数
Xtrabackup常用参数
--user=USER #指定备份用户,不指定的话为当前系统用户
--password=PASSWD #指定备份用户密码
--port=PORT #指定数据库端口
--defaults-group=GROUP-NAME #在多实例的时候使用
--host=HOST #指定备份的主机,可以为远程数据库服务器
--apply-log #回滚日志
--database #指定需要备份的数据库,多个数据库之间以空格分开
--defaults-file #指定mysql的配置文件
--copy-back #将备份数据复制回原始位置
--incremental #增量备份,后面跟要增量备份的路径
--incremental-basedir=DIRECTORY #增量备份时使用指向上一次的增量备份所在的目录
--incremental-dir=DIRECTORY #增量备份还原的时候用来合并增量备份到全量,用来指定全备路径
--redo-only #对增量备份进行合并
--rsync #加快本地文件传输,适用于non-InnoDB数据库引擎。不与--stream共用
--safe-slave-backup
--no-timestamp #生成的备份文件不以时间戳为目录.
四、一次线上xtrabackup主从复制
生产环境:主从节点各一台,需要将主节点中的数据复制出来,然后再恢复到从节点上,然后从节点追主节点的binlog。其中主节点上面不停的有数据刷新,主从节点有一个共享的挂载硬盘服务器。
1.备份主节点上面的数据。
innobackupex --socket=/data/mysql_3306/tmp/mysql.sock /data/我的备份目录/xtra_backup -udba_admin -pXXXXXX -h127.0.0.1 -P3306 |
---|
此处有坑!!!
上面的语句一直不能通过,提示错误:
Access deneied for user root@localhost (using password Yes)。
一开始怀疑是密码输错,重新输入之后,发现没有问题;
再怀疑是socket连接出错,去掉-h参数和-P参数,错误提示变为socket连接问题;
充新添加-h和-P参数,调换目录和-h -u -P的顺序,发现提示-h参数错误;
innobackupex --help:
发现-H参数需要大写,更改为如下语句之后,备份成功。
innobackupex --socket=/data/mysql_3306/tmp/mysql.sock /data/我的备份目录/xtra_backup -udba_admin -pXXXXXX -H 127.0.0.1 -P3306 |
---|
2.还原(在从库上执行,切记关闭从库的mysql服务,进入共享的挂载目录)
第一步:先prepare,利用--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
innobackupex --apply-log /data/备份目录/xtra_backup/2018-08-22_11-40-58/ |
---|
此步骤提示:
data目录和innodblog目录已经存在,无法进行还原。
这时候,我们需要先将从库上的data目录和innodblog目录进行备份,然后重新进行还原。
--apply-log应用全备时 log sequence number 之后的数据,完了后会输出类似 InnoDB: Last MySQL binlog file position 0 262484673, file name ./mysql-bin.000135 的信息,如图所示,此时需要保存这个位置信息,为后面的还原做好准备。
第二步:copy:需要数据目录为空
innobackupex --socket=/data/mysql_3306/tmp/mysql.sock -udba_admin -p -H 127.0.0.1 -P3306 --copy-back --rsync /data/备份目录/xtra_backup/2018-08-22_11-40-58/ |
---|
这里面需要注意--copy-back和--rsync两个备份参数。
3.还原成功后,需要进行从节点的配置过程:
首先启动mysql服务:
./mysqld_safe --defaults-file=/data/mysql_3306/my.cnf &
此时会弹出错误:
无法启动,然后查询错误日志,发现:
File '/data/mysql_3306/innodblog/mysqlbin.~rec~' not found
原因:本分之后,需要改变data文件夹和innnodblog文件夹的用户组和用户:
解决方案:
//改变权限
chown -R mysql.mysql datachown -R mysql.mysql innodblog |
---|
启动客户端
./mysql -udba_admin -p -h127.0.0.1 -P3306 |
---|
配置主从(这里已经提前配置好了binlog、server_id、以及relay_log):
change master to master_host='10.30.124.60',master_user='dba_repl',master_password='replsafe',master_log_file='mysqlbin.000051',master_log_pos=670453415; |
---|
这里的位置就是刚才prepare阶段记录的那个位置。
show slave statusG发现无法连接,思考原因应该是从库防火墙未开启,开启从库防火墙:
vim /etc/sysconfig/iptables
之后
添加:
-A INPUT -p tcp -s 10.30.124.0/24 --sport 1024:65535 -m multiport --dports 3306 -m state --state NEW -j ACCEPT
结果如下:
从节点开始追主节点,主从复制过程结束。