mysql备份工具之xtrabackup

xtrabackup是perconna公司的产品

mysql5.7之前(包含5.7)使用xtrabackup - Percona XtraBackup 2.4 ,mysql8.0以上使用Xtrabackup8.0.

首先XtraBackup有两个工具,一个xtrabackup,一个innobackupex 。2.4版本中已经把两个工具和在一起了,innobackupex只是xtarbackup的一个链接。

 

 

 创建一个全量备份

xtrabackup --backup --target-dir=/data/backups/base  --datadir=/var/lib/mysql/

注: --target-dir备份目录     --datadir需要备份的数据目录

 

 备份文件下面除了数据文件外还有xtrabackup的一些信息文件。

 

backup-my.cnf

此文件中包含了my.cnf中的一些设置信息,但是,并不是my.cnf中的所有信息都会包含在此文件中,此文件中只包含了备份时需要的信息。

xtrabackup_binlog_info

此文件中记录了备份开始时二进制日志文件的"位置(position)"

xtrabackup_checkpoints

此文件中记录此次备份属于那种类型的备份,是全量还是增量,备份时起始的LSN号码,结束的LSN号码等信息。

xtrabackup_info

本次备份的概要信息,此文件中的信息还是比较全面的。

xtrabackup_logfile

记录了备份过程中的日志,在对数据进行prepare时需要通过日志将数据还原成一致的可用的数据。

 

增量备份

第一次增备:

xtrabackup    --backup    --target-dir=/data/backups/inc1    --incremental-basedir=/data/backups/base    --datadir=/var/lib/mysql/

第二次增备:

xtrabackup    --backup    --target-dir=/data/backups/inc2    --incremental-basedir=/data/backups/inc1     --datadir=/var/lib/mysql/

注:第二次增备是在第一次增备的基础上进行备份的,这个取决于--incremental-basedir,如果--incremental-basedir是全量备份的目录,则在全量备份的基础上进行增备。

数据库在还原的时候需要先执行一下准备步骤:

xtrabackup    --prepare    

这一步有两个操作:一个是把日志文件中的已提交的事务写入数据文件,一个是回滚未提交的事务。

增量备份的xtrabackup--prepare步骤与普通全备备份不同。在正常全备备份中,两种类型的操作形式是为了让数据库保持一致性。

 

增量备份准备步骤时必须跳过未提交事务的回滚,这时候需要用到选项--apply-log-only,因为在备份时可能正在进行中,很可能会在下一次增量备份中提交。只需要在最后一次增量准备中回滚数据即可。

注意:

如果在增量备份准备步骤中没有使用xtrabackup --prepare  --apply-log-only  选项,会导致你接下来的增量备份数据不可用。因为在事务被回滚后,下面的增量备份不能被应用。

例如:下面有三个备份文件,一个全备,两个增备:

/data/backups/base
/data/backups/inc1
/data/backups/inc2

准备(prepare)基本备份,组织回滚操作:

xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base

输出的结束文本内容类似于下面这样:

101107 20:49:43  InnoDB: Shutdown completed; log sequence number 1291135

log sequence number需要匹配上base backup 中的to_lsn。

此备份实际上可以安全地恢复到现在的状态,即使已跳过回滚阶段。如果您恢复它并启动MySQL,InnoDB将检测到回滚阶段没有执行,并且它将在后台执行该操作,就像通常用于开始时的崩溃恢复一样。它会通知您数据库没有正常关闭。

当应用第一个增量备份到全备的时候,需要执行下面这段命令:

xtrabackup   --prepare   --apply-log-only   --target-dir=/data/backups/base   --incremental-dir=/data/backups/inc1

这会将增量文件应用于/data/backups/base中的文件,这会将增量文件按时间向前滚动到增量备份的时间。然后它像往常一样应用重做日志到结果中。最后的数据在/data/backups/base中,而不是在增量目录中。你应该看看一些输出,如:

incremental backup from 1291135 is enabled.
xtrabackup: cd to /data/backups/base/
xtrabackup: This target seems to be already prepared.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(1291340)
Applying /data/backups/inc1/ibdata1.delta ...
Applying /data/backups/inc1/test/table1.ibd.delta ...
.... snip
101107 20:56:30 InnoDB: Shutdown completed; log sequence number 1291340

同样,LSN应该与您先前检查第一个增量备份时看到的内容相匹配。如果整修数据文件/data/backups/base,您应该可以看到第一次增量备份时数据库的状态。

准备第二次增量备份的过程与此类似:将增量应用于(修改的)基本备份,然后您将滚动其数据及时转发到第二个增量备份点:

xtrabackup   --prepare   --target-dir=/data/backups/base    --incremental-dir=/data/backups/inc2

提示:

xtrabackup  --apply-log-only 选项只用在增量全恢复中,但最后一个增量文件恢复除外。这就是为什么上面一行没有包含xtrabackup  --apply log only选项。即使在最后一步中使用了xtrabackup--apply log,备份仍然是

一致,但在这种情况下,服务器将执行回滚阶段。

 

做完准备工作后,需要把备份的数据恢复,无论是新的库还是以前的库,都应该保证恢复的位置是空的,没有数据。因为默认不会覆盖已经存在的数据文件,除非指定选项 --force-non-empty-directories ,但最好是一个空库,把数据文件全给删除。

 

xtrabackup   --copy-back   --datadir=还原的库    --target-dir=/home/mysql3306/back  --force-non-empty-directories 

 

xtrabackup    --copy-back   --datadir=还原的库     --target-dir=/home/mysql3306/back

 

注:datadir表示新的数据目录,这个可以使用参数指定,可以用添加在默认的配置文件里指定参数--defaults-file=my.cnf.

 

当启用了单独表空间(innodb_file_per_table)后,xtrabackup支持部分备份。这里有三种方式支持部分备份:

1、可以用正则表达式匹配表名;

2、在文件中提供表列表;

3、提供数据库列表。

示例:

1、$ xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ --tables="^test[.].*"

2、$ echo "mydatabase.mytable" > /tmp/tables.txt
      $ xtrabackup --backup --tables-file=/tmp/tables.txt

3、$ xtrabackup --databases='mysql sys performance_schema ...'

 

还有一些高级特性,待续。。。。。。。。。。。。

 

posted @ 2020-07-27 16:22  wongchaofan  阅读(564)  评论(0编辑  收藏  举报