Xtrabackup提供了两种命令行工具:html
- xtrabackup:专用于备份InnoDB和XtraDB引擎的数据;
- innobackupex:是一个perl脚本,在执行过程当中会调用xtrabackup命令,这个命令便可以实现备份InnoDB,也能够备份Myisam引擎的对象。
xtrabackup是由percona提供的MySQL数据库备份工具,其备份速度快而且可靠;备份过程不会打断正在执行的事务;可以基于压缩等功能节约磁盘空间和流量;自动实现备份检验;还原速度快。mysql
若须要安装xtrabackup,能够移步其官方网站,在其官网上提供了多种安装方式。sql
博文大纲:shell
- 1、安装xtrabackup及其插件
- 2、xtrabackup彻底备份+binlog增量备份
- 3、xtrabackup彻底备份+xtrabackup增量备份
- 4、innobackupex全库备份+innobackupex增量备份
注:2、3、四是三种不一样的备份方案,在生产环境中选择合适的一种便可。数据库
参考官方文档,在官方文档上提供了各个版本的帮助说明。服务器
[root@mysql ~]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm [root@mysql ~]# yum -y install percona-xtrabackup-24
xtrabackup中主要包含两个工具:app
- xtrabackup:是用于热备份innodb,xtradb表中数据的工具,支持在线热备份,能够在不加锁的状况下备份innodb数据表,不过该工具不能操做myisam引擎表。
- innobackupex:是将xtrabackup进行封装的perl脚本,能同时处理innodb和myisam,但在处理myisam时须要加一个读锁,因为操做myisam时须要加读锁,因此会堵塞线上服务的写操做,而Innodb没有这样的限制。
[root@mysql test]# yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5 [root@mysql test]# wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm [root@mysql test]# rpm -ivh percona-toolkit-2.2.19-1.noarch.rpm
[root@mysql test]# mkdir -p /opt/mysqlbackup/{full,inc} # full:全备存放的目录 # inc:增量备份存放的目录
[root@mysql test]# mysql -uroot -p123.com mysql> create user bakuser@'localhost' identified by '123.com'; mysql> revoke all privileges,grant option from 'bakuser'@'localhost'; mysql> grant reload,lock tables,replication client,process on *.* to bakuser@'localhost'; mysql> flush privileges;
[root@mysql test]# innobackupex --user=bakuser --password=123.com /opt/mysqlbackup/full/ #当备份完成后将出现如下提示信息 ............. #忽略部分信息 200116 13:09:21 completed OK!
上述执行相关解释以下:ide
- --user:指定链接数据库的用户名;
- --password:指定链接数据库的密码;
- --defaults-file:指定数据库的配置文件my.cnf,innobackupex要从其中获取datadir等信息,若是不指定,则会默认去搜索my.cnf这个文件,搜索顺序和mysql启动时的搜索顺序同样;
- --database:指定要备份的数据据库,这里指定的数据库只对myisam表有效,对于innodb数据来讲都是全备(全部数据库中的innodb数据都进行了备份,不是只备份指定的数据库,恢复时也同样);
- /opt/mysqlbackup/full:是备份文件的存放位置。
各个文件存放的内容以下:工具
在进行增量备份前,须要先查看到彻底备份时binlog日志位置(position),以下:测试
[root@mysql 2020-01-17_10-39-52]# pwd /opt/mysqlbackup/full/2020-01-17_10-39-52 [root@mysql 2020-01-17_10-39-52]# cat xtrabackup_binlog_info bin_log.000001 154 # 获得彻底备份是备份到了bin_log.000001二进制日志中的154的位置
经过二进制日志进行增量备份:
在增量备份前,自行向数据库中进行增删改等操做,以便产生新的二进制日志。
[root@mysql ~]# mysqlbinlog --start-position=154 /usr/local/mysql/data/bin_log.000001 > /opt/mysqlbackup/inc/`date +%F`.sql
[root@mysql ~]# rm -rf /usr/local/mysql/data/* #直接删除本地全部数据
还原彻底备份的大概流程以下:
经过--apply-log选项可用于实现上述功能,命令以下:
[root@mysql ~]# innobackupex --apply-log /opt/mysqlbackup/full/2020-01-17_10-39-52/ [root@mysql 2020-01-17_10-39-52]# cat xtrabackup_checkpoints backup_type = full-prepared #当准备工做完成后,备份目录下的此文件内容中的备份类型会为:full-prepared from_lsn = 0 to_lsn = 2841752 last_lsn = 2841761 compact = 0 recover_binlog_info = 0 flushed_lsn = 2841761
注:/opt/mysqlbackup/full/2020-01-17_10-39-52/是备份文件所在目录名称,若是执行正确,最后几行输出的信息以下:
在实现“准备”的过程当中,innobackupex一般还可使用“--user-memory”选项来指定其可使用的内存大小,默认为100M,若是有足够的内存,能够多划分一些内存给prepare的过程,以提升其完成速度。
在准备工做完成后,便可使用如下命令进行恢复:
[root@mysql ~]# innobackupex --copy-back /opt/mysqlbackup/full/2020-01-17_10-39-52/
确认数据已恢复:
彻底备份的数据已经恢复,可是须要注意权限的问题,恢复后的数据属主及属组都是当前用户root,因此还须要更改其属主及属组,以下:
[root@mysql ~]# cd /usr/local/mysql/data/ [root@mysql data]# chown -R mysql.mysql . [root@mysql data]# ll #确认当前属组与属主 总用量 122924 drwxr-x--- 2 mysql mysql 90 1月 17 11:15 data1 -rw-r----- 1 mysql mysql 324 1月 17 11:15 ib_buffer_pool -rw-r----- 1 mysql mysql 12582912 1月 17 11:15 ibdata1 -rw-r----- 1 mysql mysql 50331648 1月 17 11:15 ib_logfile0 -rw-r----- 1 mysql mysql 50331648 1月 17 11:15 ib_logfile1 -rw-r----- 1 mysql mysql 12582912 1月 17 11:15 ibtmp1 drwxr-x--- 2 mysql mysql 4096 1月 17 11:15 mysql drwxr-x--- 2 mysql mysql 8192 1月 17 11:15 performance_schema drwxr-x--- 2 mysql mysql 8192 1月 17 11:15 sys -rw-r----- 1 mysql mysql 20 1月 17 11:15 xtrabackup_binlog_pos_innodb -rw-r----- 1 mysql mysql 481 1月 17 11:15 xtrabackup_info -rw-r----- 1 mysql mysql 1 1月 17 11:15 xtrabackup_master_key_id [root@mysql ~]# systemctl restart mysqld #在数据恢复后,须要重启服务器,不然数据不统一
[root@mysql ~]# mysql -uroot -p123.com -e "select * from data1.t1;" +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | | 3 | tom3 | +------+------+
为了防止还原时产生大量的二进制日志,在还原时最好临时关闭二进制日志,以下:
[root@mysql ~]# mysql -uroot -p123.com -e 'set sql_log_bin=0;' #临时关闭二进制日志 [root@mysql ~]# mysql -uroot -p123.com < /opt/mysqlbackup/inc/2020-01-17.sql #恢复二进制日志 [root@mysql ~]# mysql -uroot -p123.com -e 'set sql_log_bin=1;' #开启二进制日志 [root@mysql ~]# mysql -uroot -p123.com -e "select * from data1.t1;" #确认数据恢复正确 +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | | 3 | tom3 | | 4 | tom4 | | 5 | tom5 | +------+------+--+i
在第一个备份方案中,增量备份使用的是备份二进制日志,其实xtrabackup还支持进行增量备份,xtrabackup的备份原理以下:
在innodb内部会维护一个redo日志我呢见,也能够叫作事务日志文件(transaction,事务日志),事务日志会存储每一个innodb表数据的记录修改,当innodb启动时,innodb会检查数据文件和事务日志,并能执行两个步骤:它应用已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操做。xtrabackup在启动时会记住log sequence number(LSN),而且复制全部的数据文件,复制过程须要一些时间,因此这期间若是数据文件有改动,那么将会使数据库处于一个不一样的时间点。这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改,xtrabackup必须持续的作这个操做,是由于事务日志是会轮转重复的写入,而且事务日志能够被重用。因此xtrabackup自启动开始,就不停的将事务日志中每一个数据文件的修改都记录下来。这就是xtrabackup的备份过程。
因此每一个innodb的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面LSN就会自动增加。这就是innodb表能够进行增量备份的基础。xtrabackup基于innodb的crash-recovery功能,它会复制innodb的data file ,因为不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。
mysql> create database test; mysql> use test; mysql> create table xx(id int,name varchar(20)); mysql> insert into xx values(1,'tom1'); mysql> insert into xx values(2,'tom2'); mysql> select * from xx; +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | +------+------+
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --user=bakuser --password="123.com" --port=3306 --backup --target-dir=/opt/mysqlbackup/full/full_incre_$(date '+%F_%T')
上述各个指令解释以下:
- --defaults-file:指定数据库的配置文件,若是使用该参数,必须做为第一个参数;
- --user:指定链接数据库的用户名;
- --password:指定链接数据库的密码;
- --port:指定链接数据库的端口号;
- --backup:实施备份到target-dir;
- --target-dir=name:备份文件的存放目录路径。innobackupex要从其中获取datadir等信息;
- --database:指定要备份的数据库,这里指定的数据库只对myisam和innodb表的表结构有效,对于innodb数据库来讲都是彻底备份(恢复时也同样)。
#先插入新的数据 [root@mysql full]# mysql -uroot -p123.com -e "insert into test.xx values(3,'tom3');" #再进行增量备份 [root@mysql full]# xtrabackup --defaults-file=/etc/my.cnf --user=bakuser --password="123.com" --port=3306 --backup --target-dir=/opt/mysqlbackup/inc/incre_$(date '+%F_%T') --incremental-basedir=/opt/mysqlbackup/full/full_incre_2020-01-17_14\:34\:39/
在上述指令中,--incremental-basedir是指定上次完整备份或者增量备份文件的位置(即若是是第一次增量备份则指向彻底备份所在目录,在执行过增量备份以后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录)。
查看增量备份文件:
[root@mysql full]# ll /opt/mysqlbackup/inc/ 总用量 0 drwxr-x--- 7 root root 274 1月 17 15:12 incre_2020-01-17_15:12:00 # 注:这里的增量备份只是针对innodb,对于myisam来讲,仍是完整备份。
#再插入新的数据 [root@mysql full]# mysql -uroot -p123.com -e "insert into test.xx values(4,'tom4');" #进行第二次增量备份 [root@mysql full]# xtrabackup --defaults-file=/etc/my.cnf --user=bakuser --password="123.com" --port=3306 --backup --target-dir=/opt/mysqlbackup/inc/incre_$(date '+%F_%T') --incremental-basedir=/opt/mysqlbackup/inc/incre_2020-01-17_15\:12\:00/
注:第二次增量备份--incremental-basedir应该指向上一次增量备份文件的位置。
恢复数据的大概流程以下:
若是备份文件是tar包,解包命令为:tar -izxf xxx.tar,这里必须使用-i参数,表示忽略存档中的0字节。
首先准备恢复彻底备份:
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=bakuser --password="123.com" --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_2020-01-17_14\:34\:39/
再准备恢复到第一次增量备份的时刻,以下:
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=bakuser --password='123.com' --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_2020-01-17_14\:34\:39/ --incremental-dir=/opt/mysqlbackup/inc/incre_2020-01-17_15\:12\:00/
再准备恢复第二次增量备份,以下:
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=bakuser --password='123.com' --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_2020-01-17_14\:34\:39/ --incremental-dir=/opt/mysqlbackup/inc/incre_2020-01-17_15\:20\:32/
而后中止MySQL数据库:
[root@mysql ~]# systemctl stop mysqld
开始rsync数据文件:
[root@mysql ~]# cd /opt/mysqlbackup/full/full_incre_2020-01-17_14\:34\:39/ [root@mysql full_incre_2020-01-17_14:34:39]# rsync -rvt --exclude 'xtrabackup_checkpoints' --exclude 'xtrabackup_logfile' ./ /usr/local/mysql/data/
当数据恢复到mysql的data目录之后,还须要确保全部数据文件的属主和属组均为正确的用户,如我这里须要修改成mysql,以下:
[root@mysql full_incre_2020-01-17_14:34:39]# cd /usr/local/mysql/data/ [root@mysql data]# chown -R mysql.mysql . #更改恢复后的数据属组和属主为mysql
确认数据已恢复:
[root@mysql data]# mysql -uroot -p123.com -e "select * from test.xx;" +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | | 3 | tom3 | | 4 | tom4 | +------+------+
#准备测试数据 [root@mysql data]# mysql -uroot -p123.com -e "select * from test.xx;" +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | | 3 | tom3 | +------+------+ #开始彻底备份 [root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password='123.com' /opt/mysqlbackup/full/full_incre_$(date '+%F_%H%M%S') --no-timestamp
注:--no-timestamp选项来阻止命令自动建立一个以时间命名的目录,而后便可自定义目录了;
# 插入测试数据 [root@mysql ~]# mysql -uroot -p123.com -e "insert into xx values(4,'tom4'),(5,'tom5');" test #进行增量备份 [root@mysql ~]# innobackupex --incremental /opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/full/full_incre_2020-01-17_165254/ --user=bakuser --password='123.com' --no-timestamp # --incremental-basedir:指定的是上次彻底备份或者增量备份的目录 #因为这是第一次增量备份,因此就须要指定上次彻底备份的目录 [root@mysql ~]# ll /opt/mysqlbackup/inc/ #查看增量备份文件 总用量 0 drwxr-x--- 7 root root 274 1月 17 17:04 incre_20200117_170424
#插入新的数据 [root@mysql ~]# mysql -uroot -p123.com -e "insert into test.xx values(6,'tom6')"; #基于第一次增量备份的目录文件作第二次增量备份 [root@mysql ~]# innobackupex --incremental /opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/inc/incre_20200117_170424/ --user=bakuser --password='123.com' --no-timestamp
[root@mysql ~]# ll /opt/mysqlbackup/inc/ 总用量 0 drwxr-x--- 7 root root 274 1月 17 17:04 incre_20200117_170424 drwxr-x--- 7 root root 274 1月 17 17:10 incre_20200117_171035
[root@mysql ~]# rm -rf /usr/local/mysql/data/* #恢复彻底备份目录文件 [root@mysql ~]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_2020-01-17_165254/ # 将第一次增量备份合并到全备目录 [root@mysql ~]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_2020-01-17_165254/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200117_170424/ # 将第二次增量备份合并到全备目录 [root@mysql ~]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_2020-01-17_165254/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200117_171035/
[root@mysql ~]# systemctl stop mysqld #中止数据库 #进行恢复 [root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password='123.com' --copy-back /opt/mysqlbackup/full/full_incre_2020-01-17_165254/
[root@mysql ~]# cd /usr/local/mysql/data/ [root@mysql data]# chown -R mysql.mysql .
[root@mysql data]# systemctl start mysqld [root@mysql data]# mysql -uroot -p123.com -e "select * from test.xx;" +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | | 3 | tom3 | | 4 | tom4 | | 5 | tom5 | | 6 | tom6 | +------+------+
数据恢复成功。
Xtrabackup对备份的数据文件支持“流”功能,便可以将备份的数据经过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅须要使用--stream选项便可。以下:
#进行完整备份 [root@mysql opt]# innobackupex --user=bakuser --password="123.com" --stream=tar /opt/mysqlbackup/full/ | gzip > /opt/mysqlbackup/full/full_`date +%F_%H%M%S`.tar.gz #上述命令生成的备份文件以下: [root@mysql full]# ll /opt/mysqlbackup/full/ 总用量 640 -rw-r--r-- 1 root root 652578 1月 17 17:45 full_2020-01-17_174513.tar.gz
———————— 本文至此结束,感谢阅读 ————————