关于xtrabackup的简介就不再赘述,百度一堆,使用方法也说明也很多。感觉还是只有自己试过之后才能有更深刻的认识,以下的使用说明基于官方文档及自己试验过程,记录下备查。
去percona-xtrabackup官网上下载,有rpm包、tar包,也有解压直接可用的二进制包。我试验采用的二进制包。
由于里面的innobackupx命令实际上是用perl语言封装了xtrabackupx而成,所以使用innobackupx命令要先检查perl包以及其依赖包的安装情况。
可以执行yum install prel perl-DBD perl-Time-HiRes
解决关于perl的报错。
当然个人还是推荐yum安装,先安装percona的yum源
yum install http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
然后 yum install percona-xtrabackup,所有依赖全搞定
备份有全库备份、部分备份、全量备份、增量备份以及压缩备份等方式。
全库备份指备份数据目录下的所有库;部分备份指备份指定的库/表;全量和增量不在赘述。
如果以root之外的用户执行备份,备份用户需要有以下权限:
RELOAD and LOCK TABLES (unless the –no-lock option is specified) in order to FLUSH TABLES WITH READ LOCK prior to start copying the files and
REPLICATION CLIENT in order to obtain the binary log position,
CREATE TABLESPACE in order to import tables (see Restoring Individual Tables) and
SUPER in order to start/stop the slave threads in a replication environment.
my.cnf文件里面必须指定datadir=xxx,innobackupx在备份和恢复阶段从这里获知数据目录的路径。
innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR
并注意观察输出的最后一行,有“complete ok”才算成功。程序会在备份目录下创建一个以当前时间戳为名的目录存储备份的文件。
如果MySQL配置文件不在默认目录(/etc,/datadir/)下,需要通过以下方式告知程序my.cnf的路径
innobackupex --defaults-file=/tmp/other-my.cnf --user=DBUSER --password=DBUSERPASS /path/to/BACKUP
并且–defaults-file必须作为第一个选项
恢复分为两个步骤:准备阶段—-恢复阶段
innobackupx备份完之后的数据时不能直接恢复使用的,因为拷贝数据文件的同时,还会有事务提交或回滚,xtrabackup通过一个额外的线程记录拷贝过程中binlog日志中的变化,并在“准备”阶段通过将日志中的改变应用到备份文件中来保证备份文件的数据一致性。
执行innobackupex --apply-log /path/to/BACKUP-DIR
另外可以通过使用--use-memory=xx
选项来加速此过程,例如
innobackupex --apply-log --use-memory=4G /path/to/BACKUP-DIR
此过程执行完,看到最后提示“complete ok”说明已经将日志中记录的的改变应用到备份文件中。
关闭mysql,清空datadir(注意:mysql的datadir在恢复过程中必须确保是空的,否则执行不成功),
innobackupex --copy-back /path/to/BACKUP-DIR
(从my.cnf获得datadir之后,将最终可用的数据拷贝至datadir)
提示“complete ok”之后,就可以启动数据库了。注意:在启动数据库前要注意修改数据目录权限,以确保mysql对于数据的读写权限。
特定库/表备份
对于特定库/表的备份,官方文档给出了三种方法
–include=’正则表达式’ 例如 –include=’^ljk’只备份ljk库,在备份目录里还会有其他库的目录,但都是空的
–tables-file=文件 该文件中应该包含database.table形式的内容,每行一个表,注意:ljk.*是不生效的。
–databases=’库名[.表名]’ 多个库中间以空格隔开,此选项还不完善,官方文档也说明了:此选项只对.frm文件和非innodb表有效,对于InnoDB表即使指定了数据库,仍然会备份所有的库。
恢复过程
执行innobackupex --apply-log /path/to/partial/backup
成功后关闭数据库,将制定库/表的备份文件cp至数据目录下即可,记得修改权限。
思路:先做全量备份,之后按照下面命令执行增备
innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR
innobackupex --user=DBUSER --password=DBUSERPASS --incremental /data/backups --incremental-basedir=BASEDIR
恢复过程
思路:将各个增量备份的数据文件合并到最初的全量备份的目录下,最终是从全量备份这个目录下恢复数据。假如现在有一个全量三个增量的备份
innobackupex --apply-log --redo-only BASE-DIR/全备目录
注意;此处增加了–redo-only
innobackupex --apply-log --redo-only BASE-DIR/全备目录 --incremental-dir=INCREMENTAL-DIR-1
(第一个增量的目录)
innobackupex --apply-log --redo-only BASE-DIR/全备目录 --incremental-dir=INCREMENTAL-DIR-2
(第二个增量的目录)
innobackupex --apply-log BASE-DIR/全备目录 --incremental-dir=INCREMENTAL-DIR-3
(注:最后一个增量目录不需要加–redo-only选项)
注:“准备”程中,增量备份的路径需要些绝对路径,试验时写相对路径不成功
如果以上都执行成功,则可以继续下一步
innobackupex --apply-log BASE-DIR/全备目录
将记录在日志里的改变应用的数据中,确保数据一致性。
然后可以向全量备份一样执行恢复了
innobackupex --copy-back BASE-DIR/全备目录