xtrabackup备份工具使用
前面介绍mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了。
这时就需要一种好用又高效的工具,目前主流的有两个工具可以实现物理热备:ibbackup和xtrabackup;ibbackup是商业软件,需要授权,非常昂贵。而xtrabackup功能比ibbackup还要强大,但却是开源的。因此我们这里就来介绍xtrabackup的使用。
xtrabackup:专用于备份InnoDB和XtraDB引擎的数据;
innobackupex:这是一个perl脚本,封装了xtrabackup,在执行过程中会调用xtrabackup命令,这样用该命令即可以实现备份InnoDB,也可以备份MyISAM引擎的对象。
Xtrabackup是由percona提供的mysql数据库备份工具,特点:
(1)备份过程快速、可靠;
(2)备份过程不会打断正在执行的事务;
(3)能够基于压缩等功能节约磁盘空间和流量;
(4)自动实现备份检验;
(5)还原速度快。
官方链接地址:http://www.percona.com/software/percona-xtrabackup;可以下载源码编译安装,也可以下载适合的RPM包或使用yum进行安装或者下载二进制源码包。
tar -xf P
rpm -ivh libev-4.03-3.el6.x86_64.rpm
yum -y install percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm
xtrbackup使用
我们一般使用innobackupex命令对数据库进行备份,innobackupex是perl脚本对xtrabackup的封装,和功能扩展。
xtrabackup完全备份+binlog增量备份
1、备份
创建备份目录
注:full:全备存放的目录;inc:增量备份存放的目录。
注:确定要备份的数据库和表(如test_db库的stu表)存在及表中插入要测试的数据。
create database test; use test;
create table stu(id int,name varchar(20));
insert into stu values(11,‘li11’);
insert into stu values(10,‘li10’);
开启binlog功能。
修改/etc/my.cnf配置文件,添加如下内容:
log-bin=/data/mysql/log/mysql_bin
server-id=1
重启
备份
mkdir -p /opt/mysqlbackup/{full,inc}
1)完全备份
innobackupex --defaults-file=/etc/my.cnf --socket=/usr/local/mysql/mysql.sock --user=root --password=123456 /opt/mysqlbackup/full/
相关选项说明:
–defaults-file指定数据库的配置文件,innobackupex要从其中获取datadir等信息;
–user指定连接数据库的用户名
–password指定连接数据库的密码
–port=PORT 该选项指定通过TCP/IP连接到数据库时所用的端口
–socket 指定连接到本地数据库sever时使用的一个unix domain socket
–databases指定将要备份的数据库列表。如果要指定多个数据库,彼此间需要以空格隔开;如:“db1 db2”,同时,在指定某数据库时,也可以只指定其中的某张表。 如:databasename.tablename格式。如果没指定参数,则备份所有数据库,
注:–databases指定要备份的数据库,这里指定的数据库只对MyISAM表有效,对于InnoDB 数据来说都是全备(所有数据库中的InnoDB数据都进行了备份,不是只备份指定的数据库,恢复时也一样)
/opt/mysqlbackup/full是备份文件的存放位置
注意:xtrabackup或者innobackupex在使用过程中涉及到2类用户权限:
1、系统用户,用来调用innobackupex或者xtrabackup
2、数据库用户,数据库内使用的用户
数据库的用户需要具有相应权限,如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:
create user ‘bkpuser’@‘localhost’ identified by ‘123456’;
revoke all privileges,grant option from ‘bkpuser’@‘localhost’;
grant reload,lock tables,replication client,process on . to ‘bkpuser’@‘localhost’;
flush privileges;
备份后的文件:
在备份的同时,备份数据会在备份目录下创建一个以当前日期时间为名字的目录存放备份文件:
ls /opt/mysqlbackup/full/2021-03-11_20-25-00/
各文件说明:
(1)xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;
每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
(2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
(3) xtrabackup_info —— 记录备份的基本信息,uuid、备份命令、备份时间、binlog、LSN、以及其他加密压缩等信息。
(4)backup-my.cnf —— 备份命令用到的配置选项信息;
注:在使用innobackupex进行备份时,还可以使用–no-timestamp选项来阻止命令自动创建一个以时间命名的目录;指定了这个选项,备份会直接备份在BACKUP-DIR,不再创建时间戳文件夹。例如:
innobackupex --user=root --password=123456 --no-timestamp /tmp/db_backup/full
(使用–no-timestamp时,后面的这个full目录必须写上且可以不用提前自己建立,它由innobackupex自动建立,
查看完全备份时binlog日志位置(position):
cat /opt/mysqlbackup/full/2021-03-11_20-25-00/xtrabackup_binlog_info
然后向mysql的test_db库的stu表插入几条数据,对完全备份的后数据库更改进行二进制日志增量备份:
insert into stu values(2,‘li2’);
insert into stu values(1,‘li’);
2)增量备份二进制文件:
mysqlbinlog -v --start-position=154 /data/mysq
l/log/mysql-bin.000015 >/opt/mysqlbackup/inc/$(date +%Y%m%d-%H-%M-%S).sql
2、使用innobackupex还原数据库:
模拟数据库损坏:
可以用删除数据目录文件来模拟损坏。生产环境下不要直接删除数据库,可以mv移走数据库。操作如下:
停止数据库:
还原完全备份:
1)准备(prepare)一个完全备份
在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始时的点。
innobakupex命令的–apply-log选项可用于实现上述功能。如下面的命令:
–apply-log指明是将日志应用到数据文件上,完成之后将备份文件中的数据恢复到数据库中。操作如下:
innobackupex --apply-log /opt/mysqlbackup/full/2021-03-11_20-25-00/
注:/opt/mysqlbackup/full/2019-07-12_15-34-01/备份文件所在目录名称
2)使用完全备份还原数据库
innobackupex命令的–copy-back选项用于执行恢复操作
通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。操作如下:
innobackupex --copy-back /opt/mysqlbackup/full/2021-03-11_20-25-00/
这里的–copy-back指明是进行数据恢复
数据恢复完成之后,需要修改相关文件的权限mysql数据库才能正常启动。
修改还原后的数据目录权限:
chown -R mysql:mysql /data/mysql/data/
重启服务
/etc/init.d/mysqld start
验证还原后的数据:
select * from stu;
3)还原增量备份:
为了防止还原时产生大量的二进制日志,在还原时可临时关闭二进制日志后再还原:
set sql_log_bin=0; 临时关闭二进制日志
source /opt/mysqlbackup/inc/20190712154153.sql
set sql_log_bin=1;重新启动二进制日志
select * from stu; 验证
xtrabackup完全备份+xtrabacup增量备份
xtrabackup还支持进行增量备份
增量备份优点:减少备份数据重复,节省磁盘空间,缩短备份时间
测试环境准备:
创建一个测试数据库,并创建一张表输入几行数据
create database test;
use test;
create table xx(id int,name varchar(20));
insert into xx values(1,‘li1’);
insert into xx values(2,‘li2’);
1、xtrabacup进行备份
innobackupex --defaults-file=/etc/my.cnf --soc
ket=/usr/local/mysql/mysql.sock --user=root --password=123456 --port=3306 /opt/mysqlbackup/full/
查看完全备份文件
ll /opt/mysqlbackup/full/
检查备份文件夹下的xtrabackup-checkpoints,查看信息
cat /opt/mysqlbackup/full/2021-03-11_21-00-04/xtrabackup_checkpoints
xtrabackup进行增量备份
先录入些数据往xx表,实现第一次增量数据:
insert into xx values(3,‘li3’);
进行第1次增量备份
使用–incremental创建增量备份
语法:innobackupex --user=root --password=123456 --incremental /增量1路径 --incremental-basedir=全备路径,后面指定在哪个全备上进行增量备份
innobackupex --user=root --password=123456 --incremental /opt/mysqlbackup/inc/ --incremental-basedir=/opt/mysqlbackup/full/2019-07-12_17-29-48/ --socket=/usr/local/mysql/mysql.sock
最新的日期
选项说明:
–incremental:这个选项告诉 xtrabackup 创建一个增量备份,而不是完全备份。
–incremental-basedir:指定上次完整备份或者增量备份文件的位置(即如果是第一次增量备份则指向完全备份所在目录,在执行过增量备份之后再一次进行增量备份时,其–incremental-basedir应该指向上一次的增量备份所在的目录)。
查看增量备份文件:
ls -l /opt/mysqlbackup/inc/
再查看LSN日志序列号
cat /opt/mysqlbackup/inc/2021-03-11_21-12-21/xtrabackup_checkpoints
最新的
注:增量备份创建的另外一种方法:
上面 from_lsn =
innobackupex --user=root --password=123456 --i
ncremental /opt/mysqlbackup/inc/ --incremental-lsn=2674208 --socket=/usr/local/mysql/mysql.sock
进行第2次增量备份:
再往xx表中插入数据
insert into xx values(4,‘li4’),(5,‘li5’);
select * from xx;
进行第2次增备份:
进行第2次增备份:(以增量1为基准:/opt/mysqlbackup/inc/2019-07-13_17-26-01/ )
innobackupex --user=root --password=123456 --i
ncremental /opt/mysqlbackup/inc/ --incremental-basedir=/opt/mysqlbackup/inc/2021-03-11_21-19-48/ --socket=/usr/local/mysql/mysql.sock
2、增量备份的恢复
有3个步骤
1)准备完全备份
2)恢复增量备份到完全备份(开始恢复的增量备份要添加–redo-only参数,到最后一次增量备份要去掉–redo-only)
3)对整体的完全备份进行恢复,回滚未提交的数据
注:–redo-only 用于准备增量备份内容把数据合并到全备份目录
准备一个全备:
innobackupex --apply-log --redo-only /opt/mysqlbackup/full/2019-07-12_17-29-48/
将增量1应用到完全备份
innobackupex --apply-log --redo-only /opt/mysqlbackup/full/2019-07-12_17-29-48/ --incremental-dir=/opt/mysqlbackup/inc/2019-07-13_17-26-01/
将增量2应用到完全备份,注意不加 --redo-only 参数了(因为这是最后一个增量备份)
innobackupex --apply-log /opt/mysqlbackup/full
/2021-03-11_21-00-04/ --incremental-dir=/opt/mysqlbackup/inc/2021-03-11_21-27-01/
注:/opt/mysqlbackup/full/2021-03-11_21-00-04/ 是全库备份路径
/opt/mysqlbackup/inc/2021-03-11_21-19-48/ 是第一次增量备份路径
/opt/mysqlbackup/inc/2021-03-11_21-27-01/ 是第二次增量备份路径
把所有合在一起的完全备份整体进行一次apply操作,回滚未提交的数据
innobackupex --apply-log /opt/mysqlbackup/full/2021-03-11_21-00-04/
模拟测试:
rm -rf /tmp/data/
mv /data/mysql/data/ /tmp/
mkdir /data/mysql/data
innobackupex --defaults-file=/etc/my.cnf --copy-back /opt/mysqlbackup/full/2021-03-11_21-00-04/
chown -R mysql:mysql /data/mysql/data/
/etc/init.d/mysqld start
select * from xx; 数据已恢复