MariaDB 数据库备份与恢复

Kolla Ansible 可以促进托管在 MariaDB 中的数据进行完全或增量备份。它使用 Mariabackup 实现这一点,Mariabackup 是一种旨在允许“热备份”的工具——这种方法意味着可以在不使数据库或云停机的情况下进行一致的备份。

注意

默认情况下,备份将在您的 Galera 集群中的第一个节点上执行,或者如果您只有一个节点,则在 MariaDB 节点本身上执行。备份文件保存到专用的 Docker 卷 - mariadb_backup - 您应该将此卷的内容作为目标来转移备份到其他地方。

启用备份功能

为了使备份工作,需要对 MariaDB 进行一些重新配置——这是为了为备份客户端启用适当的权限,并创建额外的数据库以存储备份信息。

首先,通过 globals.yml 启用备份

enable_mariabackup: "yes"

然后,启动 MariaDB 的重新配置

kolla-ansible reconfigure -i INVENTORY -t mariadb

运行成功后,您应该能够执行下面描述的完全和增量备份。

备份流程

要执行完全备份,请运行以下命令

kolla-ansible mariadb_backup -i INVENTORY

或者要执行增量备份

kolla-ansible mariadb_backup  -i INVENTORY --incremental

Kolla 目前不管理这些备份的计划,因此您需要配置适当的计划程序(例如 cron)来代表您运行这些命令,如果您需要定期快照您的数据。建议的计划是

  • 每日完全备份,保留两周

  • 每小时增量备份,保留一天

备份将代表您在配置步骤期间定义的权限下在指定数据库节点上执行;调用这些命令不需要密码。

此外,备份操作可以从安装了 Kolla Ansible 的最小化节点触发,特别是那些不需要 passwords.yml 副本的节点。如果您希望通过 cron 作业安排自动备份,这一点值得注意。

恢复备份

由于 Mariabackup 执行热备份的方式,在将数据复制到位以供 MariaDB 使用之前,必须执行一些步骤来准备数据。此过程目前是手动操作,但 Kolla Mariabackup 镜像包含成功准备备份所需的工具。下面给出了两个示例。

完全备份

对于完全备份,请在第一个数据库节点上使用以下选项启动新的容器

docker run --rm -it --volumes-from mariadb --name dbrestore \
   --volume mariadb_backup:/backup \
   quay.io/openstack.kolla/mariadb-server:2025.2-rocky-10 \
   /bin/bash
(dbrestore) $ cd /backup
(dbrestore) $ rm -rf /backup/restore
(dbrestore) $ mkdir -p /backup/restore/full
(dbrestore) $ gunzip mysqlbackup-04-10-2018.qp.xbc.xbs.gz
(dbrestore) $ mbstream -x -C /backup/restore/full/ < mysqlbackup-04-10-2018.qp.xbc.xbs
(dbrestore) $ mariabackup --prepare --target-dir /backup/restore/full

停止所有节点上的 MariaDB 实例

kolla-ansible stop -i multinode -t mariadb --yes-i-really-really-mean-it

删除旧数据文件(或将其移动到其他位置),并将备份复制到位,同样在第一个节点上

docker run --rm -it --volumes-from mariadb --name dbrestore \
   --volume mariadb_backup:/backup \
   quay.io/openstack.kolla/mariadb-server:2025.2-rocky-10 \
   /bin/bash
(dbrestore) $ rm -rf /var/lib/mysql/*
(dbrestore) $ rm -rf /var/lib/mysql/\.[^\.]*
(dbrestore) $ mariabackup --copy-back --target-dir /backup/restore/full

然后您可以重新启动 MariaDB,恢复的数据就已到位。

对于单节点部署

docker start mariadb
docker logs mariadb
81004 15:48:27 mysqld_safe WSREP: Running position recovery with --log_error='/var/lib/mysql//wsrep_recovery.BDTAm8' --pid-file='/var/lib/mysql//scratch-recover.pid'
181004 15:48:30 mysqld_safe WSREP: Recovered position 9388319e-c7bd-11e8-b2ce-6e9ec70d9926:58

对于多节点部署恢复,应运行 MariaDB 恢复角色,指向集群的第一个节点

kolla-ansible mariadb_recovery -i multinode -e mariadb_recover_inventory_name=controller1

上述过程也适用于灾难恢复场景。在这种情况下,首先将 MariaDB 备份文件从外部源复制到集群第一个节点的 mariadb_backup 卷中。然后,使用上述过程中的相同步骤。

增量备份

这与上面的完全备份恢复过程类似,但我们必须首先应用来自增量备份的日志,然后才能进行最终的恢复前准备。在下面的示例中,我有一个完全备份 - mysqlbackup-06-11-2018-1541505206.qp.xbc.xbs,和一个增量备份,incremental-11-mysqlbackup-06-11-2018-1541505223.qp.xbc.xbs

docker run --rm -it --volumes-from mariadb --name dbrestore \
   --volume mariadb_backup:/backup --tmpfs /backup/restore \
   quay.io/openstack.kolla/mariadb-server:2025.2-rocky-10 \
   /bin/bash
(dbrestore) $ cd /backup
(dbrestore) $ rm -rf /backup/restore
(dbrestore) $ mkdir -p /backup/restore/full
(dbrestore) $ mkdir -p /backup/restore/inc
(dbrestore) $ gunzip mysqlbackup-06-11-2018-1541505206.qp.xbc.xbs.gz
(dbrestore) $ gunzip incremental-11-mysqlbackup-06-11-2018-1541505223.qp.xbc.xbs.gz
(dbrestore) $ mbstream -x -C /backup/restore/full/ < mysqlbackup-06-11-2018-1541505206.qp.xbc.xbs
(dbrestore) $ mbstream -x -C /backup/restore/inc < incremental-11-mysqlbackup-06-11-2018-1541505223.qp.xbc.xbs
(dbrestore) $ mariabackup --prepare --target-dir /backup/restore/full
(dbrestore) $ mariabackup --prepare --incremental-dir=/backup/restore/inc --target-dir /backup/restore/full

此时,备份已准备好并可以复制回原位,如前面的示例所示。