使用 mariadb-backup 进行增量备份与恢复

mariadb-backup 可以制作全量备份或增量备份。全量备份把完整数据复制到一个空目录;增量备份保存相对于已有备份的新变化。本文依次说明如何建立增量链、准备备份和恢复数据。

mariadb-backup 以前名为 mariabackup。使用命令前应核对已安装工具的版本与命令名;不同版本的元数据文件名也可能不同。完整参数见 mariadb-backup 选项,工作原理见 mariadb-backup 概览。

InnoDB 页面中包含日志序列号(LSN)。数据库中的 InnoDB 表发生行修改时,相关日志序列号随之推进。制作增量备份时,mariadb-backup 比较已有备份的最新 LSN 与数据库中的 LSN,保存落后页面对应的变化。因此增量备份依赖基准备份和中间增量,不能单独恢复。

下文 $ 是命令提示符,不是输入内容。mariadb-backup 用户、mypassword、目录与 LSN 数值均是官方示例,不是当前环境的账号、秘密或执行结果。执行前须用自己的已授权配置替换示例;直接把密码写在命令行会增加历史记录和进程参数暴露风险。本文未运行备份或恢复命令。

备份数据库服务器:先建立全量备份

增量备份必须先有全量基准。--backup 表示执行备份,--target-dir 指定备份目录。全量备份的目标目录必须为空,或者尚不存在:

$ mariadb-backup --backup \
   --target-dir=/var/mariadb/backup/ \
   --user=mariadb-backup --password=mypassword

这个示例把全部数据库备份到 /var/mariadb/backup/。查看其中的 mariadb_backup_checkpoints 可以看到 InnoDB 的 LSN 元数据。官方示例如下,实际数字取决于自己的数据库:

backup_type = full-backuped
from_lsn = 0
to_lsn = 1635102
last_lsn = 1635102
recover_binlog_info = 0

from_lsn = 0 表明这是全量起点;后续增量通过 LSN 与基准衔接。不要把这些演示数值写回真实备份元数据。

备份增量变化

完成全量备份后,可以按需要继续制作增量。仍使用 --backup,并用 --target-dir 指向新的空目标目录;--incremental-basedir 指定上一个基准备份的目录。第一次增量的基准是上面的全量目录:

$ mariadb-backup --backup \
   --target-dir=/var/mariadb/inc1/ \
   --incremental-basedir=/var/mariadb/backup/ \
   --user=mariadb-backup --password=mypassword

命令在 /var/mariadb/inc1/ 中创建保存增量变化的 delta 文件。这里也有记录 LSN 的检查点文件。

版本说明:官方文档指出,MariaDB 11.0 及更早版本使用文件名 xtrabackup_checkpoints,并注明新名称可作为旧版本备份的回退名称识别。处理实际备份时应核对工具版本和真实文件名,不应靠重命名文件来替代版本兼容性检查。

第一次增量的检查点示例:

backup_type = incremental
from_lsn = 1635102
to_lsn = 1635114
last_lsn = 1635114
recover_binlog_info = 0

它的 from_lsn 与前一个备份的 to_lsn 相接。继续做第二次增量时,可以把第一次增量的目录作为下一次的基准:

$ mariadb-backup --backup \
   --target-dir=/var/mariadb/inc2/ \
   --incremental-basedir=/var/mariadb/inc1/ \
   --user=mariadb-backup --password=mypassword

这形成全量 → inc1 → inc2 的链。保存全部目录,并记录顺序;某个中间增量缺失时,后续增量不能凭空补上它。

使用备份历史表

也可以借助备份历史表管理链,以逻辑名称引用之前的备份,而不是只用目录路径。

第一步,用 --history 制作并记录全量基准:

mariadb-backup --backup --target-dir=/full \
  --history=full_backup_1

第二步,用 --incremental-history-name 指定基准备份的逻辑名称。建议也用 --history 记录新的增量:

mariadb-backup --backup --target-dir=/inc1 \
  --incremental-history-name=full_backup_1 \
  --history=inc_backup_1

查找基准备份需要对历史表拥有 SELECT 权限,记录新备份需要 INSERT 权限。若更适合按唯一标识引用,也可以使用 --incremental-history-uuid 指向 mariadb-backup 生成的 UUID。

历史表中的记录不是备份文件本身。逻辑名称帮助定位基准,但仍必须妥善保留备份链中的实际数据与元数据。

配合 –stream 输出

使用 --stream 并交给外部工具压缩或加密时,mariadb_backup_checkpoints 通常也进入压缩或加密输出,默认不能直接从目录读取。下次增量仍需要从它取得基准 LSN。

--extra-lsndir 可以在另一个目录保存检查点副本;下一次增量用 --incremental-basedir 指向该目录。下面是原文的 gzip 示例:

# initial full backup
$ mariadb-backup --backup --stream=mbstream \
  --user=mariadb-backup --password=mypassword \
  --extra-lsndir=backup_base | gzip > backup_base.gz

# incremental backup
$ mariadb-backup --backup --stream=mbstream \
  --incremental-basedir=backup_base \
  --user=mariadb-backup --password=mypassword \
  --extra-lsndir=backup_inc1 | gzip > backup-inc1.gz

backup_base 与 backup_inc1 是额外 LSN 元数据目录,.gz 文件才是流式备份数据。LSN 目录不能代替完整备份,也不等于已经完成解压和准备。此例说明备份流与增量基准的关系;后续目录式恢复命令要求已经取得正确的备份目录,不能直接把 gzip 文件当作 --target-dir。

准备备份

前面目录式示例产生一个全量目录和两个增量目录。恢复前,需要把增量依次应用到全量基准。这个过程使用 --prepare。

先准备全量备份:

$ mariadb-backup --prepare \
   --target-dir=/var/mariadb/backup

这一步把 /var/mariadb/backup 中的数据与备份时收集的 InnoDB redo 日志中的变化同步起来。

再把第一次增量应用到同一个全量目录:

$ mariadb-backup --prepare \
   --target-dir=/var/mariadb/backup \
   --incremental-dir=/var/mariadb/inc1

这一步把全量目录推进到 inc1 的状态。对剩余增量重复此步骤,按链的先后顺序逐个应用。为明确前述 inc2 的处理方式,下面把原文“重复最后一步”展开;这是补充命令,目录来自前面的示例:

$ mariadb-backup --prepare \
   --target-dir=/var/mariadb/backup \
   --incremental-dir=/var/mariadb/inc2

每次 --target-dir 都指向合并后的全量基准,不是增量目录。准备过程会改变该基准的状态;若要保留尚未合并的原始材料,先建立独立的可恢复副本。这里没有声称检查或应用过任何真实 LSN。

恢复备份

全部增量应用到基准后,可以用 --copy-back 或 --move-back 恢复。

--copy-back 复制备份文件,保留原备份;--move-back 将备份文件移动到 datadir,原备份目录中的文件会被移走。选择前应确认是否仍需要保留备份。

恢复顺序如下:

  1. 停止 MariaDB Server 进程,方法见 启动和停止 MariaDB。
  2. 确认配置中真正的 datadir,并确保该目录为空;不要把演示路径当成自己环境的目录。
  3. 用选择的恢复选项把已经准备好的基准还原。以下是原文的复制示例:
$ mariadb-backup --copy-back \
   --target-dir=/var/mariadb/backup/

恢复后可能还需要调整文件权限。mariadb-backup 保留备份中的文件和目录权限位,但落盘文件的所有者可能是执行恢复的用户和组。应核对 MariaDB Server 实际运行的用户和组;原文中通常为 mysql:mysql:

$ chown -R mysql:mysql /var/lib/mysql/

这条递归所有权命令仅针对确认过的数据库目录;实际路径、用户和组必须按环境选择,本文未执行它。完成权限核对后,再启动 MariaDB Server。

使用边界

恢复不是把任意一个增量目录直接复制回数据库。需要匹配的全量基准、完整且顺序正确的增量链、相容的工具版本、成功完成的准备步骤,以及停机、空目标目录和文件所有权条件。本文只根据官方材料完成静态说明,没有验证备份可恢复性、压缩流完整性或数据库启动结果。

来源与许可

原文:MariaDB 文档团队,Incremental Backup and Restore (mariadb-backup)。完整源码见 官方文档仓库。

官方原页的许可声明为 CC BY-SA / GNU FDL。该声明允许在履行相关条件时复制和改编;原页未注明精确版本,本稿不擅自指定版本或链接到猜测的某一版许可。本文完整汉化全部章节、保留 12 个原始代码与元数据片段,补充 inc2 准备命令及使用边界,未执行命令。修改日期:2026-10-03。

本稿仅离线存放。后续对外发布前,需确认原声明对应的精确许可版本、署名与相同方式共享等履行义务,并选择满足条件的许可路径;目前不能视为已经满足上线所需全部条件。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容