暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

三、Percona XtraBackup备份和恢复命令详解

拙人笔谈 2021-04-14
1861

全量备份( --backup)

创建备份,使用xtrabackup --backup
选项运行xtrabackup。还需要指定一个--target-dir
选项,即备份的存储位置。

如果InnoDB数据或日志文件未存储在同一目录中,则可能还需要指定这些文件的位置。

如果目标目录不存在,则xtrabackup 会创建它。如果该目录确实存在且为空,则xtrabackup将成功。

如果存在文件,xtrabackup不会覆盖现有文件,它显示系统错误17并失败。


备份命令

innobackupex --defaults-file=/opt/mysql/my.cnf  --user=root --password=*** ${backup_dir}

该命令将拷贝数据文件(由my.cnf里的变量datadir指定)至备份目录下${backup_dir}。

注意:如果不指定--defaults-file,默认值为/etc/my.cnf。

执行完成后将显示如下命令行执行信息

160906 10:19:17 Finished backing up non-InnoDB tables and files
160906 10:19:17 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '62988944'
xtrabackup: Stopping log copying thread.
.160906 10:19:18 >> log scanned up to (137343534)
160906 10:19:18 Executing UNLOCK TABLES
160906 10:19:18 All tables unlocked
160906 10:19:18 Backup created in directory '${backup_dir}'
160906 10:19:18 [00] Writing backup-my.cnf
160906 10:19:18 [00]       ...done
160906 10:19:18 [00] Writing xtrabackup_info
160906 10:19:18 [00]       ...done
xtrabackup: Transaction log of lsn (26970807) to (137343534) was copied.
160906 10:19:18 completed OK!

看到的最后一行显示类似于以下内容,其中的值LSN
将是一个取决于您的系统的数字:

xtrabackup: Transaction log of lsn (<SLN>) to (<LSN>) was copied.

备份成功后,将在备份目录下创建一个时间戳目录,该目录下存放着备份文件。


恢复准备(--prepare)

使用--backup
选项进行备份后,备份文件在时间点上是不一致的,因为它们是在程序运行时在不同的时间复制的,并且在过程中它们可能已被更改。

如果尝试使用这些数据文件启动InnoDB,它将检测到文件损坏(不一致)并异常退出,防止在损坏(不一致)的数据上运行。

通过xtrabackup --prepare
可以使备份文件在单个时间点保持一致性,操作完成后可以运行InnoDB

prepare
操作过程中,xtrabackup会启动一种嵌入其中的并经过修改的InnoDB。

InnoDB必须进行一些修改才能禁用一些标准安全检查,例如比较日志文件的大小不合适等。

这些修改仅适用于xtrabackup命令;不需要修改的InnoDB即可使用xtrabackup进行备份。

prepare
步骤使用嵌入式InnoDB复制的日志文件对复制的数据文件执行故障恢复操作。

prepare
步骤非常简单:只需运行xtrabackup --prepare
选项并告诉它要准备的目录,例如:

xtrabackup --prepare --target-dir=/data/backups/

完成此操作后,应该看到带有InnoDB shutdown
的消息,其中LSN
的值取决于您的系统。

InnoDB: Shutdown completed; log sequence number 137345046
160906 11:21:01 completed OK!

不建议在prepare
时中断xtrabackup过程,因为可能会导致数据文件损坏并且备份将变得不可用。

备份恢复(--apply-log、--copy-back )

innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --use-memory=4G --apply-log ${backup_dir}/2020-12-29_09-05-25
innobackupex --defaults-file=/opt/mysql/my.cnf --user=root --password=*** --copy-back ${backup_dir}/2020-12-29_09-05-2

恢复分为两个步骤,第一步是apply-log,,一般建议设置--use-memory选项加快速度。

这个步骤完成之后,目录${backup_dir}/2020-12-29_09-05-25下的备份文件已经准备就绪。

第二步是copy-back,即把备份文件拷贝至原数据目录下。

恢复完成之后,需要检查数据目录的所有者和权限是否正确。


增量备份(--incremental)

注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。

增量备份需要基于全量备份, xtrabackup备份时写入一个名为xtrabackup_checkpoints
到备份的目标目录。该文件包含一行显示 to_lsn
,这是备份结束时数据库的LSN

例如,全备的信息如下:

backup_type = full-backuped
from_lsn = 0
to_lsn = 563759005914
last_lsn = 563759005914

假设已经有了一个全备目录(${backup_dir}/2020-12-29_09-05-25)。

innobackupex --defaults-file=/opt/mysql/my.cnf  --user=root --password=*** --incremental-basedir=${backup_dir}/2020-12-29_09-05-25 --incremental ${backup_dir}

其中--incremental-basedir指向全备目录,--incremental指向增量备份的目录。

上面语句执行成功后,会在--incremental执行的目录下创建一个时间戳子目录(本例中为:${backup_dir}/2020-12-29_09-52-37)。

在该目录下存放着增量备份的所有文件。

基于该全备的增量备份的信息如下:

backup_type = incremental
from_lsn = 563759005914
to_lsn = 574765133284
last_lsn = 574765133284

从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。


还可以在增量备份的基础上再做增量备份,只要把--incremental-basedir执行上一次增量备份的目录即可,如下所示:

innobackupex --defaults-file=/opt/mysql/my.cnf  --user=root --password=*** --incremental-basedir=${backup_dir}/2020-12-29_09-52-37 --incremental ${backup_dir}

它的xtrabackup_checkpoints记录着备份信息如下:

backup_type = incremental
from_lsn = 574765133284
to_lsn = 574770200380
last_lsn = 574770200950

可以看到,该增量备份的from_lsn是从上一次增量备份的to_lsn开始的。


增量备份准备(--apply-log-only)

增量备份的 --prepare步骤与完全备份的步骤不同。

在完全备份中,将执行两种的操作来保证数据库一致:一是对已提交的事务,相对于数据文件从日志文件中重放,二是未提交的事务被回滚。

在准备增量备份恢复时,需要跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,并且很有可能将在下一个增量备份中提交。

可以使用xtrabackup --apply-log-only
选项来防止回滚。

要准备基本备份,只需要照常运行xtrabackup --prepare

要防止回滚阶段,需执行类似以下命令:

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

输出应以类似于以下内容的文本结尾:

InnoDB: Shutdown completed; log sequence number 1626007
161011 12:41:04 completed OK!


将第一个增量备份应用于完整备份,请运行以下命令:

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


这会将增量文件应用于中的文件/data/backups/base
,从而将它们及时向前滚动到增量备份的时间。

然后,它像往常一样将重做日志应用于结果。最终数据在中 /data/backups/base
,而不在增量目录中。

您应该看到类似于以下内容的输出:

incremental backup from 1626007 is enabled.
xtrabackup: cd to data/backups/base
xtrabackup: This target seems to be already prepared with --apply-log-only.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(4124244)
...
xtrabackup: page size for tmp/backups/inc1/ibdata1.delta is 16384 bytes
Applying tmp/backups/inc1/ibdata1.delta to ./ibdata1...
...
161011 12:45:56 completed OK!

增量备份恢复(--apply-log)

增量备份的恢复比全备要复杂很多,第一步是在所有备份目录下重做已提交的日志:

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

其中BASE-DIR是指全备目录,INCREMENTAL-DIR-1是指第一次的增量备份,INCREMENTAL-DIR-2是指第二次的增量备份,以此类推。

这里要注意的是:最后一步的增量备份并没有--redo-only选项!还有,可以使用--use_memory提高性能。

以上语句执行成功之后,最终数据在BASE-DIR(即全备目录)下。

第二步:回滚未完成的日志:

innobackupex --apply-log BASE-DIR

上面执行完之后,BASE-DIR里的备份文件已完全准备就绪。

最后一步是拷贝:

innobackupex --copy-back BASE-DIR

同样地,拷贝结束之后,记得检查下数据目录的权限是否正确。


文章转载自拙人笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论