生产环境下,面对TB级别的大数据量,我们该如何快速备份,又如何在磁盘空间不足情况下,完成艰巨的备份任务,本文将给出一个经过实战检验的可行性方案。
何为增量备份
针对一段时间以内变化的数据进行备份。具有如下特点: 1、缩小备份数据大小。 2、降低备份时间。
组件版本:
| MySQL | xtrabackup |
|---|---|
| 5.7.42 | 2.4.26 |
增量备份前的准备
开始增量备份之前,必须执行一次全量备份,并拿到本次全量备份的incremental-lsn(如下图)。
#--incremental-lsn=2778819
#为上一次全量备份incremental lsn号
mkdir -p /target_backup/
cd /target_backup/
xtrabackup --no-defaults \
--no-lock \
--binlog-log=off \
--core-file \
--backup \
--incremental-lsn=2778819 \
--compress \
--compress-threads=16 \
--stream=xbstream \
--datadir=/var/lib/mysql \
--socket=/var/lib/mysql/mysql.sock \
--target-dir=/target_backup/ > inc.dat
完成后备份文件即保存在了inc.dat文件中。
在两次全量备份之间,可以有多次增量备份,下面我们进行第二次增量备份。
第二次增量备份
#--incremental-lsn=2793409
#为上一次增量备份的lsn
mkdir -p /target_backup/
cd /target_backup/
xtrabackup --no-defaults \
--no-lock \
--binlog-log=off \
--core-file \
--backup \
--incremental-lsn=2793409 \
--compress \
--compress-threads=16 \
--stream=xbstream \
--datadir=/var/lib/mysql \
--socket=/var/lib/mysql/mysql.sock \
--target-dir=/target_backup/ > inc_2.dat
增量备份恢复
1、增量备份恢复必须有第一次的全量备份,以及中间的多次增量备份。 2、可以把数据恢复到第一次的全量备份或某一次的增量备份。 3、操作的顺序必须按照备份时的顺序来,不可以乱序或跳过。
#对第一次的增量备份进行预处理
mkdir -p /data/backups/inc1
cd /data/backups/inc1
cat /target_backup/inc.dat | xbstream -x -v -p 32
xtrabackup --decompress --parallel 16 --target-dir=.
#对第二次的增量备份进行预处理
mkdir -p /data/backups/inc2
cd /data/backups/inc2
cat /target_backup/inc_2.dat | xbstream -x -v -p 32
xtrabackup --decompress --parallel 16 --target-dir=.
#对全量备份进行预处理
mkdir -p /data/backups/base
cd /data/backups/base
cat /target_backup/backup.dat | xbstream -x -v -p 32
xtrabackup --decompress --parallel 16 --target-dir=.
xtrabackup --prepare --apply-log-only --target-dir=./
#合并第一次增量备份
xtrabackup --prepare \
--apply-log-only \
--target-dir=./ \
--incremental-dir=/data/backups/inc1
#合并第二次增量备份
xtrabackup --prepare \
--target-dir=./ \
--incremental-dir=/data/backups/inc2
#将备份文件从./拷贝到work_dir目录
mkdir -p /work_dir
xtrabackup --copy-back \
--datadir=/work_dir/ \
--target-dir=./
至此通过xtrbackup已经完成了MySQL的增量备份及恢复。
xtrabackup带来的限制:
==必须在MySQL所在的机器执行备份任务,继而引发如下问题:==
1、备份文件通常需要落地本地磁盘,本地磁盘需要为备份文件预留空间。
2、为了安全,备份需要异地存储,需要二次转移。
借助stream的伪远程备份
如上所示,通过设置--stream选项,xtrabackup可以将备份出来的文件以xbstream格式进行打包,文件不落地,直接输出到stdout。在配合其他的工具(socat),即可实现伪远程备份。
当然上述方式还是比较原始。如果进一步自动化,可以借助更完善的工具。
xtrabackup添加了http-server模式,可在任意机器通过curl、wget发送GET请求,既可启动远程备份,并将备份文件下载到本地。