1、简介

    XtraBackup是Percona提供的一个开源的、免费的MySQL数据库备份工具,它能够对InnoDB和XtraDB数据库进行热备份,据官方介绍,XtraBackup具有以下特点:

    1. 备份过程快速、可靠;

    2. 备份过程不会打断正在执行的事务;

    3. 能够基于压缩等功能节约磁盘空间和流量;

    4. 自动实现备份检验;

    5. 恢复速度快。


2、安装XtraBackup

最新版本可以从https://www.percona.com/software/percona-xtrabackup获得。

# yum install https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.2.10/binary/redhat/6/x86_64/percona-xtrabackup-2.2.10-1.el6.x86_64.rpm


3、创建所需用户

# 创建具有所需完整备份最低权限的数据库用户示例:

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cret';

mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';

mysql> FLUSH PRIVILEGES;


4、完全备份

# innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/

# 检查输出最后一行的确认消息

innobackupex: Backup created in directory ’/path/to/BACKUP-DIR/2013-03-25_00-00-09’

innobackupex: MySQL binlog position: filename ’mysql-bin.000003’, position 1946

111225 00:00:53 innobackupex: completed OK!


5、准备(Prepar)一个完全备份

# innobackupex --apply-log /path/to/BACKUP-DIR

111225 1:01:57 InnoDB: Shutdown completed; log sequence number 1609228

111225 01:01:57 innobackupex: completed OK!

# 注意:在实现"准备"的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高完成速度。


6、从一个完全备份中恢复

# innobackupex命令的--copy-back选项用于执行恢复操作,通过复制所有数据相关的文件到mysql服务器的DATADIR目录中来执行恢复过程。


# innobackupex --copy-back /path/to/BACKUP-DIR

# 如果执行正确,会出现类似几行

innobackupex: Finished copying back files.

111225 01:08:13 innobackupex: completed OK!


# 注意:删除数据目录之前,先停止mysqld服务,然后直接用命令恢复启动即可,不需要重新初始化数据库。当数据恢复到DATADIR目录后,还需要确保所有数据文件的属主和属组均为正确的用户,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。

# chown -R mysql:mysql /data/mysql


7、增量备份

# 每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这也是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。


创建一个增量备份(需要做一个完全备份为基础):

# innobackupex --user=DBUSER --password=DBUSERPASS --incremental /data/backups --incremental-basedir=BASEDIR

# 其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。


# 注意:增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表,执行增量备份其实进行的是完全备份。


8、准备增量备份

# "准备"增量备份与完全备份有点不同,需要注意的是:

    1. 需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行"重放"。"重放"之后,所有的备份数据合并到完全备份上;

    2. 基于所有的备份将未提交的事务进行"回滚"。


操作步骤:

# innobackupex --apply-log --redo-only BASE-DIR

120103 22:00:12 InnoDB: Shutdown completed; log sequence number 1291135

120103 22:00:12 innobackupex: completed OK!


# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

120103 22:08:43 InnoDB: Shutdown completed; log sequence number 1358967

120103 22:08:43 innobackupex: completed OK!


# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

completed OK!


# 其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,如果有多次增量备份,每一次都要执行如上操作。