本页面介绍了如何使用 AlloyDB Omni Kubernetes Operator 备份和恢复 AlloyDB Omni 数据。这需要具备使用清单文件和 kubectl
命令行工具更新 Kubernetes 集群的基础知识。如需详细了解如何在 Kubernetes 集群上安装和运行 AlloyDB Omni,请参阅在 Kubernetes 上安装 AlloyDB。
如需启用 AlloyDB Omni 持续备份和恢复,您必须为每个数据库集群创建备份方案。系统会根据 backupPlan
资源中定义的备份时间表进行备份。如果备份方案中未定义备份时间表,则系统会默认每天进行持续备份。您可以通过恢复时段中的任意时间戳(精确到秒)恢复或克隆备份。
如需了解如何在非 Kubernetes 部署中备份和恢复 AlloyDB Omni 数据,请参阅安装和配置 Barman。
启用和安排备份
当您为数据库集群创建备份方案资源时,系统会启用持续备份。您必须为每个数据库集群创建一个 backupPlan
资源,以便为该集群启用持续备份。此备份方案资源会定义以下参数:
AlloyDB Omni Operator 用于存储备份的位置。这可以是 Kubernetes 集群本地或 Cloud Storage 存储桶。
用于设置多个备份时间表的选项,这些时间表会自动创建
full
、incremental
和differential
备份。您可以随时暂停此时间表,包括在最初定义备份方案时。如果备份方案处于暂停状态,系统不会创建预定备份,但您仍然可以使用相应方案手动创建备份。如果未指定备份时间表,则默认值为“0 0 * * *”,即每天在午夜(本地时间)进行一次完整备份。
存储的备份的保留期限。此期限可以短至 1 天,也可以长至 90 天。默认值为 14。
您的数据库集群可以有多个备份方案,每个备份方案各自有自己的名称和配置。如果您为数据库集群创建了多个具有不同备份时间表的 backupPlan
资源,则必须为每个备份资源都定义唯一的备份位置。
创建在本地存储备份的方案
如需启用在本地存储的备份,请应用以下清单:
apiVersion: alloydbomni.dbadmin.goog/v1
kind: BackupPlan
metadata:
name: BACKUP_PLAN_NAME
namespace: NAMESPACE
spec:
dbclusterRef: DB_CLUSTER_NAME
backupSchedules:
full: "FULL_CRON_SCHEDULE"
differential: "DIFF_CRON_SCHEDULE"
incremental: "INCR_CRON_SCHEDULE"
backupRetainDays: RETENTION_DAYS
paused: PAUSED_BOOLEAN
替换以下内容:
BACKUP_PLAN_NAME
:此备份方案资源的名称,例如backup-plan-1
。NAMESPACE
:此备份方案的 Kubernetes 命名空间。它必须与数据库集群的命名空间一致。DB_CLUSTER_NAME
:您的数据库集群的名称(您在创建数据库集群时分配该名称)。FULL_CRON_SCHEDULE
:备份时间表,用于创建包含所有数据的完整备份,以cron
格式表示。例如,设置为“0 0 * * 0”可在每周日 00:00 进行完整备份。DIFF_CRON_SCHEDULE
:备份时间表,用于创建最初是完整备份的备份。后续备份是差分备份,基于对数据的干预更改,以cron
格式表示。例如,设置为“0 22 * * 3”可在每周三 22:00 进行差分备份。INCR_CRON_SCHEDULE
:备份时间表,用于创建包含相对于上次完整备份、差分备份或增量备份发生变化的数据的备份。它以cron
格式表示。例如,设置为“0 21 * * *”可在每天 21:00 进行增量备份。RETENTION_DAYS
:AlloyDB Omni 操作器保留此备份的天数。它必须是介于1
到90
之间的整数。默认值为14
。PAUSED_BOOLEAN
:指定备份方案是否暂停。请提供以下值之一:true
:备份暂停,不会创建任何预定备份。false
:AlloyDB Omni 操作器会根据cronSchedule
指定的时间表创建备份。这是默认值(如果未明确设置为true
)。
默认值为
false
。
创建将备份存储在 Cloud Storage 中的方案
如需启用在 Cloud Storage 中存储的备份,请按以下步骤操作:
创建 Cloud Storage 存储分区。记下您为此存储桶分配的名称;您在后续步骤中需要用到它。
创建服务账号以便向存储桶添加备份。
向服务账号授予
storage.objectAdmin
Identity and Access Management 角色。为服务账号创建密钥。这会将私钥下载到您的本地环境。
将下载的密钥文件重命名为
key.json
。创建包含私钥的 Kubernetes Secret:
kubectl create secret generic SECRET_NAME --from-file=KEY_PATH -n NAMESPACE
替换以下内容:
SECRET_NAME
:您所创建的 Kubernetes Secret 的名称,例如gcs-key
。KEY_PATH
:您在前面步骤中下载的key.json
文件的本地文件系统路径。NAMESPACE
:数据库集群的命名空间。
应用以下清单:
apiVersion: alloydbomni.dbadmin.goog/v1 kind: BackupPlan metadata: name: BACKUP_PLAN_NAME namespace: NAMESPACE spec: dbclusterRef: DB_CLUSTER_NAME backupSchedules: full: "FULL_CRON_SCHEDULE" differential: "DIFF_CRON_SCHEDULE" incremental: "INCR_CRON_SCHEDULE" backupRetainDays: RETENTION_DAYS paused: PAUSED_BOOLEAN backupLocation: type: GCS gcsOptions: bucket: BUCKET_URL key: BACKUP_PATH secretRef: name: SECRET_NAME namespace: NAMESPACE
替换以下内容:
BACKUP_PLAN_NAME
:此备份方案资源的名称,例如backup-plan-1
。NAMESPACE
:此备份方案的 Kubernetes 命名空间。它必须与数据库集群的命名空间一致。DB_CLUSTER_NAME
:您的数据库集群的名称(您在创建数据库集群时分配该名称)。FULL_CRON_SCHEDULE
:备份时间表,用于创建包含所有数据的完整备份,以cron
格式表示。例如,设置为“0 0 * * 0”可在每周日 00:00 进行完整备份。DIFF_CRON_SCHEDULE
:备份时间表,用于创建最初是完整备份的备份。后续备份是差分备份,基于对数据的干预更改,以cron
格式表示。例如,设置为“0 22 * * 3”可在每周三 22:00 进行差分备份。INCR_CRON_SCHEDULE
:备份时间表,用于创建包含相对于上次完整备份、差分备份或增量备份发生变化的数据的备份。它以cron
格式表示。例如,设置为“0 21 * * *”可在每天 21:00 进行增量备份。RETENTION_DAYS
:AlloyDB Omni 操作器保留此备份的天数。它必须是介于1
到90
之间的整数。默认值为14
。PAUSED_BOOLEAN
:指定备份方案是否暂停。请提供以下值之一:true
:备份暂停,不会创建任何预定备份。false
:AlloyDB Omni 操作器会根据cronSchedule
指定的时间表创建备份。这是默认值(如果未明确设置为true
)。
默认值为
false
。
BUCKET_URL
:您在前面步骤中创建的 Cloud Storage 存储桶的名称。这不是存储桶的完整网址;请勿在存储桶名称前添加前缀gs://
。BACKUP_PATH
:AlloyDB Omni 操作器在 Cloud Storage 存储桶中写入备份的目录的路径。路径必须是绝对路径,以/
开头。SECRET_NAME
:您为前面步骤中创建的 Kubernetes Secret 选择的名称。
手动创建备份
您可以随时使用已应用于数据库集群的任何备份方案手动创建备份资源。AlloyDB Omni Operator 会将所选备份方案的存储位置和保留期限应用于新的手动备份。
如需手动创建备份,请应用以下清单:
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Backup
metadata:
name: BACKUP_NAME
namespace: NAMESPACE
spec:
dbclusterRef: DB_CLUSTER_NAME
backupPlanRef: BACKUP_PLAN_NAME
manual: true
physicalBackupSpec:
backupType: BACKUP_TYPE
替换以下内容:
BACKUP_NAME
:此备份的名称,例如backup-1
。NAMESPACE
:此恢复操作的 Kubernetes 命名空间。它必须与数据库集群的命名空间一致。BACKUP_PLAN_NAME
:此备份所属的备份方案资源的名称。它必须与您在创建备份方案时选择的名称一致。DB_CLUSTER_NAME
:您的数据库集群的名称(您在创建数据库集群时分配该名称)。BACKUP_TYPE
:指定您要创建的手动备份的类型。从以下值中选择一个值:full
:创建包含所有数据的完整备份。diff
:创建依赖于上次完整备份的差分备份。后续备份是差分备份,基于对数据的干预更改。incr
:创建增量备份,该备份依赖于以前的完整备份或差分备份,以包含相对于上次完整备份、差分备份或增量备份发生变化的数据。
监控和列出备份
您的备份方案和备份都是 Kubernetes 集群中的资源。如需查看相关信息,请使用 kubectl
get
命令。
查看备份方案摘要
如需查看数据库集群的备份方案的相关信息,请运行以下命令:
kubectl get backupplan.alloydbomni.dbadmin.goog -n NAMESPACE
将 NAMESPACE
替换为数据库集群的命名空间。
输出类似以下内容:
NAME PHASE LASTBACKUPTIME NEXTBACKUPTIME
backup-plan-prod Ready 2023-10-26T17:26:43Z 2023-10-27T00:00:00Z
查看备份列表
如需查看可用于数据库集群的备份的列表,请运行以下命令:
kubectl get backup.alloydbomni.dbadmin.goog -n NAMESPACE
将 NAMESPACE
替换为数据库集群的命名空间。
输出类似以下内容:
NAME PHASE COMPLETETIME
backup-plan-prod-20231026172643 Succeeded 2023-10-26T17:26:53Z
manual-backup-1 Succeeded 2023-10-26T18:15:27Z
manual-backup-2 InProgress
输出表中的每一行都代表一个备份资源,具有以下属性:
- 备份的名称。
- 备份的状态,使用
Succeeded
标记已准备好用于恢复的备份。 - 备份创建时间的时间戳。
使用备份进行恢复
借助 AlloyDB,您可以从单个备份进行恢复,也可以使用特定时间点的备份克隆集群。
从已命名备份进行恢复
如需从备份进行恢复(将数据库集群中的数据替换为备份中的数据),请按以下步骤操作。
列出阶段为
Succeeded
的所有备份。kubectl get backup.alloydbomni.dbadmin.goog -n NAMESPACE | grep Succeeded
将
NAMESPACE
替换为数据库集群的命名空间。如果存在至少一个状态良好的备份候选项,输出会类似于以下内容:
backup-plan-prod-20231026172643 Succeeded 2023-10-26T17:26:53Z manual-backup-1 Succeeded 2023-10-26T18:15:27Z
选择上一步中列出的某个备份作为要用于恢复的备份。记下其名称,您会在后续步骤中使用。
应用以下清单:
apiVersion: alloydbomni.dbadmin.goog/v1 kind: Restore metadata: name: RESTORE_NAME namespace: NAMESPACE spec: sourceDBCluster: DB_CLUSTER_NAME backup: BACKUP_NAME
替换以下内容:
RESTORE_NAME:用于此清单创建的数据恢复资源的名称,例如
restore-1
。DB_CLUSTER_NAME:您的数据库集群的名称(您在创建数据库集群时分配该名称)。
BACKUP_NAME:您在上一步中选择的备份的名称。
从某个时间点克隆集群
借助 AlloyDB Omni Operator,您可以从恢复时段内的任何时间点克隆集群的数据。恢复时段的长度直接由保留期限决定。
例如,如果您的保留期限设置为 14 天,则您无法恢复 14 天之前的数据。您可以恢复到恢复时段内的任何时间点。AlloyDB Omni Operator 保留备份和日志的时间会比指定值延长一天。
监控恢复时段,以确定恢复时间点:
kubectl get backupplan.alloydbomni.dbadmin.goog BACKUP_NAME -n NAMESPACE -o json | jq .status.recoveryWindow
以下示例展示了响应示例:
recoveryWindow: begin: "2024-01-31T02:54:35Z"
恢复资源中使用采用 RFC 3339 时间戳格式的时间戳值。
创建并应用以下恢复资源清单:
apiVersion: alloydbomni.dbadmin.goog/v1 kind: Restore metadata: name: RESTORE_NAME namespace: NAMESPACE spec: sourceDBCluster: DB_CLUSTER_NAME pointInTime: "DATE_AND_TIME_STAMP" clonedDBClusterConfig: dbclusterName: NEW_DB_CLUSTER_NAME
替换以下内容:
RESTORE_NAME:用于此清单创建的数据恢复资源的名称,例如
restore-1
。DB_CLUSTER_NAME:您的数据库集群的名称(您在创建数据库集群时分配该名称)。
DATE_AND_TIME_STAMP:您要用于恢复的持续备份的 RFC 3339 时间戳(精确到分钟),例如
2024-03-05T15:32:10Z
。NEW_DB_CLUSTER_NAME:新数据库集群的名称。
查看恢复状态
查看恢复操作的进度:
kubectl get restore.alloydbomni.dbadmin.goog -n NAMESPACE
将
NAMESPACE
替换为数据库集群的命名空间。如需持续运行命令,请添加标志
-Aw
。输出类似以下内容:
NAME PHASE COMPLETETIME RESTOREDPOINTINTIME restore-1 RestoreInProgress
当输出表中的
PHASE
列的值显示为ProvisionSucceeded
时,表示恢复已完成。查看恢复或克隆的数据库集群上线的进度:
kubectl get dbclusters -A -n NAMESPACE
将
NAMESPACE
替换为数据库集群的命名空间。如需持续运行命令,请添加标志
-Aw
。输出类似以下内容:
NAMESPACE NAME PRIMARYENDPOINT PRIMARYPHASE DBCLUSTERPHASE default db-cluster-1 10.128.0.55 Ready DBClusterReady
当输出表中的
DBCLUSTERPHASE
列的值显示为DBClusterReady
时,表示恢复或克隆的数据库集群已可供使用。
删除备份
通常,您无需手动删除备份。AlloyDB Omni Operator 会自动删除早于您在创建备份方案时指定的保留期限的备份。
如果您确实想手动删除备份,则相应备份必须满足以下要求:
备份不是为其备份方案存储的唯一备份。AlloyDB Omni Operator 要求对于每个备份方案,至少存在一个备份。
备份没有其他备份依赖于它。例如,完整备份以及依赖于它的差分备份或增量备份;或是增量备份以及依赖于它的差分备份。
如需删除备份,请运行以下命令:
kubectl delete backup.alloydbomni.dbadmin.goog/BACKUP_NAME -n NAMESPACE
替换以下内容:
BACKUP_NAME
:要删除的备份的名称。NAMESPACE
:数据库集群的命名空间。
更新备份方案
每个备份方案都是一个 Kubernetes 资源。如需更新其配置,请执行以下操作之一:
修改备份方案的清单文件并重新应用。
使用
kubectl patch
命令。
例如,如需暂停正在运行的备份方案,请将其清单的 paused
属性更改为 true
,然后重新应用清单。
删除备份方案
如需删除备份方案并移除其所有备份资源,请运行以下命令:
kubectl delete backupplan.alloydbomni.dbadmin.goog/BACKUP_PLAN_NAME -n NAMESPACE
替换以下内容:
BACKUP_PLAN_NAME
:要删除的备份方案的名称。NAMESPACE
:数据库集群的命名空间。
如需暂停备份方案而不删除它,请将备份方案资源的 paused
属性设置为 true
。暂停的备份方案会继续存储备份,并允许手动创建备份。