XtraBackup是percona公司提供的开源工具,以热备Innodb表著称而被广泛采用。
XtraBackup对Innodb的备份之所以是热备,无需锁表,是基于Innodb自身的崩溃恢复机制,它首先复制所有的Innodb数据文件,这样复制出来的文件肯定是不一致的,然后对每个文件进行崩溃恢复处理,最终达到一致。就和MySQL在启动Innodb的时候一样,会通过比较数据文件头和redo log文件头信息来检查数据是否是一致的,如果不一致就尝试通过前滚(把redo log中所有提交的事务写入数据文件)和回滚(从数据文件中撤销所有redo log中未提交的事务引起的修改)来使数据达到最终一致。
XtraBackup在启动的时候会记录一个LSN(log sequence number),然后就把所有的Innodb数据文件复制出来,这样复制出来的数据文件是不一致的,但是XtraBackup会在后台运行一个进程把所有对redo log file的修改记录下来,只要有了这个数据,就能进行崩溃恢复。只所以要额外记录下来,是因为MySQL自身的redo log file是可重用的。
以上的操作是由xtrabackup二进制程序(比如xtrabackup_55)完成的,如果使用innobackupex 脚本,刚才的步骤完成以后,innobackupex就会去备份MyISAM表和.frm文件,这时要保证数据的一致性就会先锁表了,通过FLUSH TABLES WITH READ LOCK命令锁表然后把文件复制出来,再释放掉这个锁。
使用案例:
准备:
针对linux和mysql的版本下载对应的xtrabackup工具(mysql 5.1只能用2.0的版本,2.0以上的使用会报错。)
全备(defaults-file:指定配置文件,/root/backup:备份目录)
./innobackupex --user=root --password=xxx --defaults-file=/etc/my.cnf /root/backup/
全备还原
①准备(生成备份过程中的的redo log,undo log,用于进行前滚或者回滚使数据达成一致)
./innobackupex --apply-log /root/backup/2014-03-14_06-52-12/
②覆盖还原
停mysql服务
Original data directory '/var/lib/mysql' is not empty! at ./innobackupex line 590. ### 清空datadir目录下的文件
Original InnoDB data directory'/var/lib/mysql/innodb' is not empty! at ./innobackupex line 590. ### 清空共享表空间文件
./innobackupex --copy-back /root/backup/2014-03-14_06-52-12/
chown -R mysql:mysql /var/lib/mysql
启动mysql服务
增量备份 (incremental-basedir是基于哪个完全备份的目录做增量备份)
./innobackupex --defaults-file=/etc/my.cnf --user=root --password=xxx --incremental --incremental-basedir=/root/backup/2014-03-14_07-49-42/ /root/backup/incream/
还原增量备份(增量备份只能执行一次apply-log,多次会报错)
停mysql服务
./innobackupex --apply-log /root/backup/2014-03-14_08-18-25/ --incremental-dir=/root/backup/incream/2014-03-14_08-22-00/
./innobackupex --copy-back /root/backup/2014-03-14_08-18-25/
chown -R mysql:mysql /var/lib/mysql
启动mysql服务
===================================================================================================================
高级功能
将备份通过流保存成文件,或者进行压缩
./innobackupex --stream=xbstream /root/backup/ > /root/backup/backup.xbstream
./innobackupex --stream=xbstream --compress /root/backup/ > /root/backup/backup.xbstream
--------------------------------------------
从库上备份 (--safe-slave-backup)
为保证一直的复制状态,此选项停止slave的SQL线程。并且备份的时候show status 查看的Slave_open_temp_tables值必须为0,否则会在--safe-slave-backup-timeout超时(默认300秒)后备份失败。
--------------------------------------------
并行备份
--------------------------------------------
单表恢复
--------------------------------------------
时间点恢复
mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 --start-position=57 --stop-datetime="11-12-25 01:00:00" | mysql -u root -p
--------------------------------------------