XtraBackup是Percona推出的一款备份工具,算是对于mysqldump的一个补充。对于大批量数据的导入使用mysqldump会出现一定的瓶颈,这一点做过一些数据迁移项目的同学可能感同身受。
数据迁移中的数据量,小有小的好,大有大的招,见招拆招,找到适合的场景是最佳的。
如果现在去Percona官网下载,就会发现最新的版本已经是2.4.6了。下载可以选择一个完整的打包,或者逐个的rpm根据需求来安装也可以。完整的工具大概在60M左右。
而目前的MySQL版本大多都在5.5, 5.6, 对于5.7相对来说要新一些。中间会有一些时间的过渡,在多年前,可能相对来说用2.0版本一下的还比较多。
XtraBackup其实包含两个工具,一个是xtrabackup,另外一个是innobackupex。我们暂且以一个较早的版本作为演示,然后使用新版本来对比下。
# xtrabackup --version xtrabackup version 1.6.5 for Percona Server 5.1.59
innobackupex --version InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy and Percona Inc 2009-2012. All Rights Reserved.
可以看到这两个工具的版本还有一些差别,
xtrabackup主要是用于热备份innodb,或者是 xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex是将xtrabackup进行封装的perl脚本,可以备份和恢复MyISAM表以及数据表结构。
所以总体来看InnoDB的使用场景虽然最为普遍,但是还得考虑到MyISAM,两者总体来说,使用innobackex的场景会多一些。
使用innobackupex备份,命令选项还不少,可以使用innobackupex --help来查看明细的参数使用。
比如我需要做一个全备。可以采用如下类似的方式,在备份命令中加几个辅助选项,备份使用socket连接,备份目录在/home/databak/full/20170322下。
innobackupex --socket=/home/mysql/mysql.sock /home/databak/full/20170322 --no-timestamp --no-lock --throttle=100备份后查看对应的目录,备份的数据情况如下,其中红色的几个文件是备份中额外生成的。整体看来和源库的目录结构一样。
# du -sh ./* 2.6G ./backend 4.0K ./backup-my.cnf 646M ./gm 1.0G ./ibdata1 99M ./mobile_activity 5.0G ./mobile_billing 1.1M ./mysql 2.0G ./oem_mon 212K ./performance_schema 112K ./test 4.0K ./xtrabackup_binary 4.0K ./xtrabackup_checkpoints 4.0K ./xtrabackup_logfile对于上面生成的文件,我们简单看一下。
binary结尾的文件是备份中用到的可执行文件,这个可以对应几个版本,比如xtrabackup_51,xtrabackup_55等
# more xtrabackup_binary xtrabackup_55logfile结尾的文件的内容无法直接查看,但是可以用strings来看。通过strings解析可以看到对应的二进制日志,当然事务的Xid也有的。
# strings xtrabackup_logfile xtrabkup 170322 16:33:40 { ';{ ';{ MySQLXid ./mysql-bin.000009 393102654 08360000000039DB下面的这个文件就更特别了,这个是作为数据的备份恢复的关键,里面有着备份恢复所有的检查点LSN,从下面的数据来看,这是一个全备,因为from_lsn=0.
# cat xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0 to_lsn = 30754980731 last_lsn = 30754980731
而在源库的目录结构下,我们稍作过滤,也会得到一个几乎和这个工具备份出来一样的目录结构来。
# du -sh ./*|grep -v mysql-bin|grep -v innodb|grep -v log 2.6G ./backend 646M ./gm 1.0G ./ibdata1 4.5M ./ib_lru_dump 99M ./mobile_activity 5.0G ./mobile_billing 1.1M ./mysql 4.0K ./mysql.pid 0 ./mysql.sock 2.0G ./oem_mon 212K ./performance_schema 112K ./test所以xtrabackup这样一个工具就是一个热备工具,有点类似有文件级别的拷贝,但是不止于此,我们往下看。
数据恢复是DBA最重要的工作之一,多年之前,这个“之一“的字眼还要去掉。数据无法恢复,则备份无意义。
数据的恢复还是使用innobackupex这个工具,这是参数有些差别。
这里的数据恢复分为两个步骤,prepare和还原恢复,prepare的意义就在于,如果我们备份数据的时候,存在未提交的事务,但是数据却存在于备份中,这样就是一个数据不一致的状态,在启动数据库的时候需要走一个前滚,然后是一个回滚的操作。这个体现主要就在于logfile和ibdata。是使用apply-log这个选项实现的。
我们使用如下的方式来做。
innobackupex --defaults-file=/home/databak/full/20170322/backup-my.cnf --user=root --apply-log /home/databak/full/20170322这个过程其实就会隐式调用xtrabackup_55这个可执行文件,调用的命令类似于:
xtrabackup_55 --defaults-file="/home/databak/full/20170322/backup-my.cnf"默认会使用100M的内存,也可以使用选项--use-memory来调整,整个过程会重构redo日志文件和ibdata.
这个步骤完成之后就是最关键的地方了,还原恢复。这个过程是使用copy-back的选项实现的。
innobackupex --defaults-file=/home/databak/full/20170322/backup-my.cnf --user=root --copy-back /home/databak/full/20170322整个过程就是大量的拷贝工作。
完成之后需要修改一下文件的属主,默认是root,然后启动即可。
我们接下来看看增量备份和恢复,先来创建一些数据。我们在数据库test下创建一个表test2.
|