上次我们介绍了采用逻辑备份mysqldump 备份方式,其最大的缺陷就是备份和恢复速度都慢,但如果数据库非常大,那再使用 mysqldump 备份就不太适合了。这时就需要一种好用又高效的工具,xtrabackup 就是其中一款,号称免费版的 InnoDB HotBackup。(mysqldump备份请到L宝宝聊IT公众号中找“mysql备份与还原——mysqldump结合binlog”文章)
Xtrabackup 实现是物理备份,而且是物理热备。
Xtrabackup 提供了两种命令行工具: xtrabackup:专用于备份 InnoDB 和 XtraDB 引擎的数据; innobackupex:这是一个 perl 脚本,在执行过程中会调用 xtrabackup 命令,这样用该命令即可以实现备份 InnoDB,也可以备份 MyISAM 引擎的对象。
Xtrabackup 是由 percona 提供的 mysql 数据库备份工具,特点:
(1)备份过程快速、可靠;
(2)备份过程不会打断正在执行的事务;
(3)能够基于压缩等功能节约磁盘空间和流量;
(4)自动实现备份检验;
(5)还原速度快。
安装xtrabackup:
官方链接地址:http://www.percona.com/software/percona-xtrabackup;可以下载源码编译安装,也可以下载适合的 RPM 包或使用 yum 进行安装或者下载二进制源码包。
1)下载 xtrabackup
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz
2)解压
# tar zxf percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz
3)进入解压目录
# cd percona-xtrabackup-2.4.4-Linux-x86_64/
4)复制 bin 下的所有程序到/usr/bin
[root@localhost percona-xtrabackup-2.4.4-Linux-x86_64]# cp bin/* /usr/bin/
5)安装相关插件
#yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL
perl-TermReadKey.x86_64 perl-Digest-MD5 –y
6)下载 percona-toolkit 并安装
#wget
https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm
# rpm -vih percona-toolkit-2.2.19-1.noarch.rpm
下面就可以启动备份了
下面通过几个案例来讲解xtrabackup备份mysql数据库。
案例一:xtrabackup 完全备份+binlog 增量备份
1、创建备份目录
2、完全备份
语法:# innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
# innobackupex --user=root --password=123456 /opt/mysqlbackup/full
/path/to/BACKUP-DIR/指定备份所存放的目标目录,备份过程会创建一个以当时备份时间命名的目录存放备份文件。
出现如下提示。表示成功
在备份的同时,备份数据会在备份目录下创建一个以当前日期时间为名字的目录存放备份文件:
各文件说明:
(1)xtrabackup_checkpoints ——备份类型(如完全或增量)、备份状态(如是否已经为prepared 状态)和 LSN(日志序列号)范围信息; 每个 InnoDB 页(通常为 16k 大小)都会包含一个日志序列号,即 LSN。LSN 是整个数据库系统的系统版本号,每个页面相关的 LSN 能够表明此页面最近是如何发生改变的。 (2)xtrabackup_binlog_info —— mysql 服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。 (3)xtrabackup_binlog_pos_innodb ——二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前 position。 (4)xtrabackup_binary ——备份中用到的 xtrabackup 的可执行文件; (5)backup-my.cnf ——备份命令用到的配置选项信息; 在使用 innobackupex 进行备份时,还可以使用--no-timestamp 选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex 命令将会创建一个 BACKUP-DIR 目录来存储备份数据
注:备份选项,其中,--user 指定连接数据库的用户名,--password 指定连接数据库的密码,--defaults-file指定数据库的配置文件,innobackupex 要从其中获取 datadir 等信息;--database 指定要备份的数据库,这里指定的数据库只对 MyISAM 表有效,对于 InnoDB 数据来说都是全备(所有数据库中的 InnoDB 数据都进行了备份,不是只备份指定的数据库,恢复时也一样);/opt/mysqlbackup/full 是备份文件的存放位置。
备份数据库的用户需要具有相应权限,如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户
3、至此全备完全成功,然后向 mysql 某个库插入几条数据,然后进行增量备份,对完全备份的后数据库更改进行二进制日志增量备份。
查看完全备份时 binlog 日志位置(position):
模拟数据库修改:
增量备份二进制文件:
#mysqlbinlog --start-position=2378 /usr/local/mysql/data/mysql-bin.000023 >
/opt/mysqlbackup/inc/`date +%F`.sql
4、模拟数据库损坏:
这里直接使用删除数据目录文件来模拟损坏。
# rm -fr /usr/local/mysql/data/*
5、还原完全备份
(1)准备(perpare)一个完全备份
# innobackupex --apply-log /opt/mysqlbackup/full/2016-09-12_11-29-55/
--apply-log 指明是将日志应用到数据文件上,完成之后将备份文件中的数据恢复到数据库中。
注:/opt/mysqlbackup/full/2016-09-12_11-29-55/备份文件所在目录名称
如果执行正确,其最后输出的几行信息通常如下:
(2)还原数据库
# innobackupex --copy-back /opt/mysqlbackup/full/2016-09-12_11-29-55/
这里的--copy-back 指明是进行数据恢复。数据恢复完成之后,需要修改相关文件的权限 mysql 数据库才能正常启动。
如果执行正确,其输出信息的最后几行通常如下:
请确保如上信息的最行一行出现“completed OK!”。
(3)修改还原后的数据目录权限:
当数据恢复至 DATADIR 目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如 mysql,否则,在启动 mysqld 之前还需要事先修改数据文件的属主和属组。如:
# chown -R mysql:mysql /usr/local/mysql/data/
必须重启 MySQL:
# systemctl restart mysqld
(4)验证还原后的数据:
6、还原增量备份:(为了防止还原时产生大量的二进制日志,在还原时可临时关闭二进制日志后再还原:mysql> set sql_log_bin=0;)
重新启动二进制日志并验证还原数据:
mysql> set sql_log_bin=1;
案例二、xtrabackup 完全备份+xtrabacup 增量备份
前面我们进行增量备份时,使用的还是老方法:备份二进制日志。其实 xtrabackup 还支持进行增量备份。
测试环境准备:
创建一个测试数据库,并创建一张表输入几行数据
1、执行完全备份
其中,--defaults-file 指定数据库的配置文件,如果使用该参数必须做为第一个参数;--user指定连接数据库的用户名;--password 指定连接数据库的密码;--port 指定连接数据库的端口号;--backup 实施备份到 target-dir; --target-dir=name 备份文件的存放目录路径。innobackupex 要从其中获取 datadir 等信息;--database 指定要备份的数据库,这里指定的数据库只对 MyISAM 表和 InnoDB 表的表结构有效,对于 InnoDB 数据来说都是全备(所有数据库中的 InnoDB 数据都进行了备份,不是只备份指定的数据库,恢复时也一样); /opt/mysqlbackup/full/是备份文件的存放位置
查看完全备份文件
2、xtrabackup 进行增量备份
(1)先录入些数据,实现第一次增量数据:
备份命令:
其中,--incremental-basedir 指定上次完整备份或者增量备份文件的位置(即如果是第一次增量备份则指向完全备份所在目录,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir 应该指向上一次的增量备份所在的目录)。
查看增量备份文件:
注:这里的增量备份其实只针对的是 InnoDB,对于 MyISAM 来说,还是完整备份。
(2)向表中再插入几行数据,继续第二次增量备份
注:第二次增量备份--incremental-basedir 指向上一次增量备份文件的位置
查看增量备份文件:
3、xtrabacup 进行增量恢复为了验证比对,先删除两个增量备份前表里面的数据。
4、完整备份恢复
(1)准备一个完全备份
(2)恢复完整备份
5、恢复到第二次增量备份前面:
6、恢复整个库
7、停止 mysql 数据库:
systemctl stop mysqld
开始 rsync 数据文件:
当数据恢复至 DATADIR 目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如 mysql,否则,在启动 mysqld 之前还需要事先修改数据文件的属主和属组。
授予 mysql 访问权限:
# chown -R mysql:mysql /usr/local/mysql/data/
启动 mysql 服务:
# systemctl start mysqld
8、验证
案例三:innobackupex 全库备份+innobackupex 增量备份
测试环境准备:
创建一个测试数据库,并创建一张表输入几行数据
1、innobackupex 先做完全备份
查看完全备份文件:
2、innobackupex 做增量备份
(1)做第一次增量备份
先录入增量数据
再进行增量备份,命令如下:
查看增量备份文件:
(2)基于全备和第一个增量备份来做第二次增量备份
查看增量备份文件:
3、innobackupex 做增量恢复,先删除两次增量数据,用来查看验证恢复结果。
4、开始做恢复,恢复全备份
--redo-only 用于准备增量备份内容把数据合并到全备份目录,配合 incremental-dir 增量备份目录使用
基于全备份进行第一次增量备份的恢复
基于全备份和第一次增量备份,恢复第二次增量备份
5、停止数据库
# systemctl stop mysqld
清空数据目录下所有文件
将恢复好的数据按照配置文件的需求拷贝到相应目录
当数据恢复至 DATADIR 目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如 mysql,否则,在启动 mysqld 之前还需要事先修改数据文件的属主和属组。
赋予 mysql 账号权限
# chown -R mysql:mysql /usr/local/mysql/data/
启动 mysql 服务
# systemctl start mysqld
6、验证
Xtrabackup 的“流”及“备份压缩”功能
Xtrabackup 对备份的数据文件支持“流”功能,即可以将备份的数据通过 STDOUT 传输给 tar 程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用--stream 选项即可。如: