凌云的博客

行胜于言

MySQL 物理备份恢复(二)

分类:MySQL| 发布时间:2019-11-08 10:51:00


本文主要描述如何对 MySQL 进行增量备份与恢复。

增量备份

我上一篇文章中,我们介绍了如何使用 xtrabackup 进行 MySQL 的物理备份,命令如下:

$ xtrabackup \
    --password=123456 \
    --user="root" \
    --backup \
    --datadir=/var/lib/mysql/ \
    --socket=/var/run/mysqld/mysqld.sock \
    --target-dir=/data/mysqlbackup/base

xtrabackup 还支持进行 MySQL 的增量备份,命令如下:

$ xtrabackup \
    --password=123456 \
    --user="root" \
    --backup \
    --datadir=/var/lib/mysql/ \
    --socket=/var/run/mysqld/mysqld.sock \
    --target-dir=/data/mysqlbackup/inc1 \
    --incremental-basedir=/data/mysqlbackup/base

可以看到 xtrabackup 来进行增量备份非常简单,只要指定本次增量的 base/上一次 备份目录就行。

我的全备不在本地了,该如何进行增量备份呢?

你可能会问,我的备份数据已经归档到远程存储了,又或者我是以 stream=xbstream 的形式对备份数据进行打包处理的, 该如何进行增量备份呢?

其实在使用 xtrabackup 进行增量备份时,除了可以使用 incremental-basedir 来指定上一次备份的目录外, 还可以使用 incremental-lsn 来指定本次只备份比指定的 lsn 新的数据。

那么,这个 lsn 该如何获取呢?

一种方式是通过上次备份的 STDERR 来获取,在备份完成后,STDERR 会有如下的输出:

xtrabackup: The latest check point (for incremental): '1308181910'
xtrabackup: Stopping log copying thread.
.191108 14:54:10 >> log scanned up to (1308181919)
...
xtrabackup: Transaction log of lsn (1308181910) to (1308181919) was copied.

The latest check point 这行后面的数字就是我们进行下一次增量备份时需要提供给 incremental-lsn 的值

另一种方式是通过备份目录里的 xtrabackup_checkpoints 文件,这个文件的内容如下:

backup_type = full-backuped
from_lsn = 0
to_lsn = 1308181910
last_lsn = 1308181919
compact = 0
recover_binlog_info = 0

或者:

backup_type = incremental
from_lsn = 1308178309
to_lsn = 1308178709
last_lsn = 1308178718
compact = 0
recover_binlog_info = 0

这个文件里的 to_lsn 就是我们需要的值。

通过 incremental-lsn 进行增量备份的命令如下:

$ xtrabackup \
    --password=123456 \
    --user="root" \
    --backup \
    --datadir=/var/lib/mysql/ \
    --socket=/var/run/mysqld/mysqld.sock \
    --target-dir=/data/mysqlbackup/inc1 \
    --incremental-lsn=1308181910

恢复

和全备一样,进行增量的恢复前也需要进行 prepare 操作。对于全备来说,需要进行两个操作使得数据库保持一致:一是重放 redolog,二是将未提交的事务进行回滚。 当此全备后续还需要进行增量备份的 prepare 时,必须跳过回滚未提交事务的阶段。 这是由于当前未提交的事务,有可能在增量备份中会被提交,为了做到这点,需要在进行 prepare 的时候,加入 --apply-log-only 参数。

警告:如果,你在对全备进行 prepare 的时候,没有加上 --apply-log-only 参数,那么后续的增量备份都会变得无用。

假设你有如下备份集

/data/mysqlbackup/base
/data/mysqlbackup/inc1
/data/mysqlbackup/inc2

一个全备,两个增备,需要进行如下操作,使得备份集达到一致:

$ xtrabackup --prepare --apply-log-only --target-dir=/data/mysqlbackup/base
$ xtrabackup --prepare --apply-log-only --target-dir=/data/mysqlbackup/base --incremental-dir=/data/mysqlbackup/inc1
$ xtrabackup --prepare --target-dir=/data/mysqlbackup/base --incremental-dir=/data/mysqlbackup/inc2

除了最后一个增备外,--apply-log-only 应该加到每次 prepare 中。 当然即使最后的增备 prepare 时也加上 --apply-log-only 参数也是没有问题的。 当 MySQL 服务启动时,会自动回滚未提交的事务。

接下来的恢复步骤和全备的恢复一样,这里就不再赘述了。

参考