xtrabackup是一种支持InnoDB和xtradb存储引擎的的物理备份工具,它有以下几个特点:
(1)备份过程快速、可靠;
(2)备份过程不会打断正在执行的事务;
(3)能够基于压缩等功能节约磁盘空间和流量;
(4)自动实现备份检验;
(5)还原速度快。
需要安装的软件包:
percona-xtrabackup可以从官网https://www.percona.com/software/mysql-database/percona-xtrabackup获取相应版本
xtrabackup备份策略:
一、完全备份
xtrabackupex --user=DBUSER --passwd=DBUSERPASSWD /path/to/backup_dir/
使用innobakupex备份时,它会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中。
在备份的同时,innobackupex还会在备份目录中创建如下文件:
(1)xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;
每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
(2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
(3)xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。
(4)xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;
(5)backup-my.cnf —— 备份命令用到的配置选项信息;
2、准备(prepare)一个完全备份
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件,使得数据文件处于一致性状态。
实现方式加参数--appy-log
# innobackupex --user=db_user --password=db_password --apply-log /path/to/backup_dir
在实现“准备”的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。
3、从一个完全备份中恢复数据 (注意:恢复不用启动MySQL)
innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。
# innobackupex --user=db_user --password=db_password --copy-back /path/to/BACKUP-DIR
#还原以后默认权限是root用户,需要修改为mysql
# chown -R mysql:mysql /mydata/data/
4、使用innobackupex进行增量备份
每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。
以全量为基础做一次增量备份,可以使用下面的命令进行:
# innobackupex --user=db_user --password=db_password --incremental /backup --incremental-basedir=/backup/2016-05-10_17-18-54
#2016-05-10_17-18-54为全量备份生成的目录,以此为基础做增量备份
此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。
注:增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。
创造环境:
#/etc/init.d/mysqld stop
#cp -a /var/lib/mysql /var/lib/mysql.bak
# rm -fr /var/lib/mysql
“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。
(2)基于所有的备份将未提交的事务进行“回滚”。
# innobackupex --user=db_user --password=db_password --apply-log --redo-only /backup/2016-05-10_17-18-54
# innobackupex --user=db_user --password=db_password --apply-log --redo-only /backup/2016-05-10_17-18-54 --incremental-dir=/backup/incremental-1
如果有多次增量备份,需要执行多次此操作,将增量备份加入到全量备份中
# innobackupex --user=db_user --password=db_password --apply-log /backup/2016-05-10_17-18-54 回滚日志
# innobackupex --user=db_user --password=db_password --copy-back /backup/2016-05-10_17-18-54
恢复完成,重新启动mysql即可
#chown mysql.mysql /var/lib/mysql
#/etc/init.d/mysqld start