数据库备份和还原
本文介绍bika 自建 PostgreSQL 和 MongoDB 数据库备份与还原方案
备份工具(默认已安装):
pgBackRest: 使用 (支持全备、增量备份,并可直接备份到 S3)
Percona Backup for MongoDB: PBM,支持全备和增量备份,并可将备份存储到 S3)
备份目标: S3 存储
备份规则: 每天全备一次
还原方式: 从 S3 存储中恢复备份数据
参考:
https://docs.percona.com/percona-operator-for-postgresql/2.0/backups.html
https://docs.percona.com/percona-operator-for-mongodb/backups.html
备份
以minio 作为示例, 确保您的存储有足够的资源来存储备份,这对于大型数据库来说尤其重要。显然,您需要足够的存储空间。
s3准备
创建aws 存储, 生成 ak 和 sk
backup-s3.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: backup-s3
annotations:
for: "mongodb"
type: Opaque
data:
AWS_ACCESS_KEY_ID: UkVQTEFDRS1XSVRILUFXUy1BQ0NFU1MtS0VZ
AWS_SECRET_ACCESS_KEY: UkVQTEFDRS1XSVRILUFXUy1TRUNSRVQtS0VZ
---
apiVersion: v1
kind: Secret
metadata:
name: backup-s3-pgrest
annotations:
for: "postgresql"
type: Opaque
data:
s3.conf: W2dsb2JhbF0KcmVwbzEtczMta2V5PTx5b3VyLWFrPgpyZXBvMS1zMy1rZXktc2VjcmV0PTx5b3VyLXNrPgoKW2dsb2JhbDphcmNoaXZlLWdldF0KcHJvY2Vzcy1tYXg9MgoKW2dsb2JhbDphcmNoaXZlLXB1c2hdCnByb2Nlc3MtbWF4PTQ=
您可以使用以下命令从纯文本获取 base64 编码的字符串:
$ echo -n 'plain-text-string' | base64 --wrap=0编辑完成后,创建 Kubernetes Secret 对象,如下所示:
kubectl apply -f backup-s3.yaml -n bika-app配置备份
在
bika-values.yaml填写备份信息如下示例已创建每天定时备份任务和备份存储信息
postgres:
backup:
enabled: true
pgbackrest:
configuration:
- secret:
name: backup-s3-pgrest
repos:
- name: repo1
# 默认保留7天备份
schedules:
full: "0 0 * * *"
differential: "0 */6 * * *"
s3:
bucket: "bika-postgresql"
endpoint: http://minio:9000
region: "local"
mongo:
backup:
enabled: true
# 开启时间节点备份
pitr:
enabled: true
# Number of minutes between the uploads of oplogs.
oplogSpanMin: 60
tasks:
- name: "daily-backup"
enabled: true
schedule: "0 0 * * *" # 每24小时
# 默认保留7天备份
keep: 7
storageName: daily-backup-s3
storages:
daily-backup-s3:
type: s3
s3:
bucket: bika-db-backup
region: 'local'
credentialsSecret: backup-s3
endpointUrl: http://minio:9000
prefix: "bika-daily-mongo"执行配置并生效
helm upgrade --install -f bika-values.yaml bika-release oci://registry-1.docker.io/vikadata/bika-helm-chart -n bika-app执行手动备份(可选)
备份postgres
要手动进行按需备份,您需要一个备份配置文件。您可以使用备份配置文件 backup-pg.yaml 的示例:
apiVersion: pgv2.percona.com/v2
kind: PerconaPGBackup
metadata:
name: backup-full-1
spec:
pgCluster: bika-pg
repoName: repo1
options:
- --type=full-
开始之前,请确保您已配置备份存储。
-
在 backup-pg.yaml 配置文件中,指定集群名称和用于备份的存储库名称。存储库名称必须与您在备份存储配置中定义的名称相同。它还必须与
bika-values.yaml文件的postgres.backups.pgbackrest.repos子节中指定的存储库名称匹配。 -
如果需要,您可以添加任何 pgBackRest 命令行选项。
-
使用以下命令进行备份(如果您的数据库集群位于不同的命名空间中,请修改 -n bika-app 参数):
kubectl apply -f deploy/backup-pg.yaml -n bika-app-
备份需要时间。您可以使用 kubectl get pg-backup 命令跟踪该过程。完成后,备份应获得成功状态:
kubectl get pg-backup backup-full-1 -n bika-app
当备份过程结束时,它应该显示为 Succeeded 状态。

备份mongodb
要手动进行按需备份,您需要一个备份配置文件。您可以使用备份配置文件 backup-mongo.yaml 的示例:
apiVersion: psmdb.percona.com/v1
kind: PerconaServerMongoDBBackup
metadata:
finalizers:
- percona.com/delete-backup
name: backup-full-1
spec:
clusterName: bika-mongo
storageName: daily-backup-s3
type: logical-
开始之前,请确保您已配置备份存储。
-
在 backup-pg.yaml 配置文件中,指定集群名称和用于备份的存储库名称。存储库名称必须与您在备份存储配置中定义的名称相同。它还必须与
bika-values.yaml文件的mongodb.backup.storages子节中指定的存储库名称匹配。 -
使用以下命令进行备份(如果您的数据库集群位于不同的命名空间中,请修改 -n bika-app 参数):
kubectl apply -f deploy/backup-mongo.yaml -n bika-app-
备份需要时间。您可以使用 kubectl get pg-backup 命令跟踪该过程。完成后,备份应获得成功状态:
kubectl get psmdb-backup backup-full-1 -n bika-app
注: 当备份过程结束时,它应该显示为 READY 状态。

还原
还原postgres
该操作员支持对 PostgreSQL 集群执行完整恢复以及时间点恢复的功能。有两种方法可以恢复集群:
- 使用 dataSource.postgresCluster 子部分恢复到新集群,
- 就地恢复到现有集群(请注意,这是破坏性的)。
还原当前postgres 实例
要恢复之前保存的备份,请使用备份恢复 配置文件。备份配置文件的示例为 restore-pg.yaml:
apiVersion: pgv2.percona.com/v2
kind: PerconaPGRestore
metadata:
name: restore1
spec:
pgCluster: bika-pg
repoName: repo1
options:
- --type=time
- --target="2025-02-12 12:00:11+03"以下键是最重要的:
-
pgCluster指定集群的名称,
-
repoName指定已经在小节中配置的 4 个 pgBackRest 存储库之一的名称
backups.pgbackrest.repos -
options传递任何pgBackRest 命令行选项。
要启动恢复过程,请运行以下命令(-n bika-ap如果数据库集群位于不同的命名空间,请修改参数):
kubectl apply -f restore-pg.yaml -n bika-app还原mongodb
参考: https://docs.percona.com/percona-operator-for-mongodb/backups-restore.html
恢复以前保存的备份需要以下内容:
-
确保集群正在运行。
-
找出备份和集群的正确名称。可以使用以下命令列出可用的备份:
$ kubectl get psmdb-backup -n bika-app以下命令将列出可用的集群:
$ kubectl get psmdb -n bika-app
还原当前mongo 实例
-
在restore-mongo.yaml 中设置适当的键文件。
-
将 key设置
spec.clusterName为要恢复备份的目标集群的名称
-
将 key设置
spec.backupName为备份的名称
-
将额外的恢复参数添加到该
pitr部分:
-
typekey 可以是下列选项之一
- date- 回滚至特定日期
- latest- 恢复到最新的可能交易
-
datekey 与 option 一起使用
type=date,包含日期时间格式的值,生成的
restore.yaml文件可能如下所示:
-
apiVersion: psmdb.percona.com/v1 kind: PerconaServerMongoDBRestore metadata: name: restore1 spec: clusterName: bika-mongo backupName: backup1 pitr: type: date date: YYYY-MM-DD hh:mm:ss该
kubectl get psmdb-backup命令提供的完整备份对象在选择要恢复的备份时有一个方便的“最新可恢复时间”信息字段。您可以按如下方式轻松查询备份以获取此信息:$ kubectl get psmdb-backup <backup_name> -o jsonpath='{.status.latestRestorableTime}' -n bika-app -
-
运行实际的恢复过程:
$ kubectl apply -f deploy/backup/restore-mongo.yaml可以通过将其内容传递给命令来替换将备份设置存储在单独的文件中,
kubectl apply如下所示:$ cat <<EOF | kubectl apply -f- apiVersion: psmdb.percona.com/v1 kind: PerconaServerMongoDBRestore metadata: name: restore1 spec: clusterName: bika-mongo backupName: backup1 pitr: type: date date: YYYY-MM-DD hh:mm:ss EOF
\