XtraBackup是Percona公司开发的一款免费开源的MySQL备份工具。与上一篇介绍的mysqldump不一样,XtraBackup能够对MySQL进行物理备份(备份的是MySQL的文件而不是生成sql文件),且XtraBackup能够对MySQL进行在线备份。html
要安装XtraBackup,能够在Percona公司的官网上下载CentOS的RPM安装包,也可使用Percona提供的YUM源。这里介绍经过YUM进行安装的方法。mysql
首先在https://www.percona.com/downloads/percona-release/redhat/上下载Percona提供的YUM的RPM包,而后安装该RPM包便可使用Percona的YUM源,经过该YUM源能够安装全部的Percona产品。sql
经过如下命令查看能够安装的XtraBackup版本:shell
[root@localhost ~]# yum list percona-xtrabackup*
这里选择2.4的版本进行安装:数据库
[root@localhost ~]# yum install percona-xtrabackup-24.x86_64
使用XtraBackup进行备份时,主要使用如下两个工具:app
xtrabackup工具只能备份InnoDB和XtraDB两种引擎的数据库,并且只备份idb文件不备份frm文件;同时,xtrabackup不能备份表结构和触发器等。socket
innobackupex是使用Perl脚本对xtrabackup进行的封装和功能扩展。innobackupex能够备份和恢复MyISAM、InnoDB和XtraDB引擎的表和frm文件,因此一般使用innobackupex来备份MySQL。工具
这两个工具都是根据MySQL配置文件my.cnf来获取备份文件的,同时须要链接到数据库和数据存储目录的操做权限。优化
注意:innobackupex在备份使用MyISAM的数据库时,会对全库进行加锁操做,阻塞写操做,若备份是在从库上进行的话会影响主从复制,产生延迟。而对于使用InnoDB的数据库,则不会阻塞读写。spa
XtraBackup首先执行flush tables with read lock生成锁以阻止新的写入,而后将表中的数据刷新使其所有保存到硬盘上,接着开始复制文件,文件复制完成后释放锁。
XtraBackup在开始备份时会记住log sequence number(LSN),而后开始复制文件。同时,XtraBackup会启动一个后台进程用于监视事务日志,并从事务日志中复制最新的修改,该操做是持续进行的。因此XtraBackup在备份InnoDB时不会产生阻塞。
XtraBackup使用事务日志对备份的数据进行前滚和回滚操做,以保证这些数据与备份结束时的数据库状态一致。
XtraBackup在准备阶段完成后,便可使用准备好的数据对InnoDB进行恢复。
innobackupex的命令语法以下:
innobackupex --选项
经常使用选线:
在使用XtraBackup进行备份时,建议建立一个仅用于执行备份的MySQL用户,只授予如下权限:
reload,lock tables,replication client,create tablespace,super,process
这里使用一个例子来演示如何使用innobackupex对MySQL进行彻底备份。
实验环境:
运行如下命令进行备份:
[root@localhost full]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock /data/backup/full
innobackupex会在指定的备份目录下产生一个以时间戳命名的目录并将备份的数据存储在该目录中。在该目录中除了备份的MySQL数据库文件,还有如下几个文件:
backup-my.cnf # 备份用到的配置选项信息 xtrabackup_checkpoints # 记录备份的类型、起始LSN和结束LSN等信息 xtrabackup_info # 记录备份过程当中的各类详细信息 xtrabackup_logfile # 事务日志文件,用于在恢复过程当中的准备阶段对备份的数据进行前滚和回滚操做
这里经过将上面备份的数据进行恢复来介绍如何进行彻底备份的恢复。
该阶段仅对使用InnoDB引擎的MySQL有意义。在该阶段中将调用xtrabackup_logfile对备份的数据进行前滚和回滚操做。使用如下命令执行prepare:
[root@localhost full]# innobackupex --apply-log /data/backup/full/2019-01-29_15-22-00
在prepare阶段执行成功后,就能够恢复数据库了。使用如下命令进行数据库恢复:
[root@localhost full]# innobackupex --default-file=/etc/my.cnf --copy-back /data/backup/full/2019-01-29_15-22-00
注意如下两点:
恢复完成后,必须修改从新生成的数据存储目录的权限为运行MySQL的用户,不然MySQL将没法读取该目录:
[root@localhost db]# chown -R mysql:mysql mysql
完成以上步骤后,启动MySQL便可。
第一次的增量备份必须基于一个彻底备份,以后每次的增量备份都是基于上一次的增量备份进行的。
注意:增量备份主要针对InnoDB,对于MyISAM而言,仍然是彻底备份。
这里经过上面的彻底备份进行两次增量备份来演示如何进行增量备份。
第一次增量备份(基于彻底备份):
[root@localhost incremental]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock --incremental /data/backup/incremental --incremental-basedir=/data/backup/full/2019-01-29_15-22-00
第二次增量备份(基于第一次增量备份):
[root@localhost incremental]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock --incremental /data/backup/incremental --incremental-basedir=/data/backup/incremental/2019-01-29_15-46-21
使用增量备份恢复数据库相对来讲步骤比较复杂,在prepare阶段分为如下三个步骤:
这里使用上面生成的彻底备份和两次增量备份来演示如何使用增量备份进行数据库的恢复:
第一次的prepare(使用彻底备份):
[root@localhost backup]# innobackupex --apply-log --redo-only /data/backup/full/2019-01-29_15-22-00
第二次的prepare(使用第一次的增量备份prepare到彻底备份上):
[root@localhost backup]# innobackupex --apply-log --redo-only /data/backup/full/2019-01-29_15-22-00 --incremental-dir=/data/backup/incremental/2019-01-29_15-46-21
第三次的prepare(使用第二次的增量备份prepare到彻底备份上):
[root@localhost backup]# innobackupex --apply-log /data/backup/full/2019-01-29_15-22-00 --incremental-dir=/data/backup/incremental/2019-01-29_15-50-42
最后一次prepare(使用彻底备份最后进行一次完整的prepare):
[root@localhost backup]# innobackupex --apply-log /data/backup/full/2019-01-29_15-22-00
成功执行完以上操做后便可恢复数据库了:
[root@localhost incremental]# innobackupex --default-file=/etc/my.cnf --copy-back /data/backup/full/2019-01-29_16-35-26
针对海量数据,可使用XtraBackup提供的流式特性,在备份的过程当中直接进行压缩而不通过中间环节。
这里经过一个例子来演示如何使用流式特性:将MySQL中的全部数据库进行彻底备份,并将备份直接打包成tar并调用gzip进行压缩,保存在/data/bakcup/tar目录下,运行如下命令
[root@localhost backup]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock --stream=tar /data/backup/tar |gzip > /data/backup/tar/backup.tar.gz
要对生成的tar.gz包进行解压,须要添加i参数:
[root@localhost tar]# tar -zixvf backup.tar.gz