使用本地备份在单个服务器中克隆数据库集群

本页介绍了如何使用本地备份在单个服务器中克隆数据库集群。

本页中的步骤假定源 Kubernetes 数据库集群是在 Google Kubernetes Engine 上创建的,并且备份磁盘是 Compute Engine 永久性磁盘。它还假定目标 AlloyDB Omni 单服务器安装在 Compute Engine 虚拟机 (VM) 上。

如果您使用其他环境,请参阅相应文档,在您的环境中复制这些步骤。

以下工作流程介绍了克隆步骤:

  1. 确定源数据库集群备份磁盘的备份磁盘信息,例如永久性卷名称和 Compute Engine 永久性磁盘句柄。
  2. 将源数据库集群的备份磁盘挂载到目标服务器。
  3. 使用 pgBackRest 命令验证是否可以访问源备份。
  4. 使用 pgBackRest 命令将备份恢复到目标数据库集群。

准备工作

  • 确保您有权访问存储源数据库集群备份的备份磁盘。
  • 系统会创建一个单服务器目标 AlloyDB Omni 数据库集群。如需详细了解如何在 Kubernetes 上安装 AlloyDB Omni,请参阅安装 AlloyDB Omni
  • 确保您已以 postgres 用户身份登录数据库。

获取来源备份磁盘信息

在恢复过程中,请确定源数据库集群的备份磁盘永久性卷声明 (PVC) 名称。PVC 在 Kubernetes 中用于管理应用的永久性存储空间。

以下示例命令可帮助您使用备份磁盘 PVC 名称确定底层 PV 名称和 Compute Engine 永久性磁盘处理程序。

  1. 连接到您创建 AlloyDB Omni 源数据库集群的 GKE 集群:

     kubectl get pvc -n DB_CLUSTER_NAMESPACE | grep DB_CLUSTER_NAME | grep backupdisk

    替换以下内容:

    • DB_CLUSTER_NAMESPACE:此备份的 Kubernetes 命名空间。它必须与数据库集群的命名空间一致。

    • DB_CLUSTER_NAME:此数据库集群的名称,例如 my-db-cluster

    以下是示例响应。

      backupdisk-al-fe8c-dbcluster-sample-0   Bound
      pvc-36d8f05d-ef1a-4750-ac01-9bb330c15b3a   10Gi       RWO            standard-rwo   5d21h
      ```
  2. 使用上一步中的备份磁盘名称(例如 backupdisk-al-fe8c-dbcluster-sample-0)查找底层 PV 名称:

      kubectl get pvc/PVC_NAME -n DB_CLUSTER_NAMESPACE -o jsonpath={.spec.volumeName}

    替换以下内容:

    • PVC_NAME:上一步中响应的备份磁盘的 PVC 名称,例如 backupdisk-al-fe8c-dbcluster-sample-0
  3. 查找底层 Compute Engine 永久性磁盘处理程序:

      kubectl get pv/$PV_NAME -o json | jq -r .spec.csi.volumeHandle

    替换以下内容:

    • PV_NAME:上一步中响应的备份磁盘的 PV 名称。

    以下是示例响应:

      projects/my-project/zones/us-central1-a/disks/pvc-89f91fba-6cd2-4bfa-84ed-cb5969b446c3
  4. 将备份磁盘名称导出为后续部分中使用的变量:

      export BACKUP_DISK=pvc-89f91fba-6cd2-4bfa-84ed-cb5969b446c3

将备份磁盘挂载到目标服务器

假设目标服务器是安装在 Compute Engine 虚拟机上的 AlloyDB Omni 服务器,请将备份磁盘挂载到该服务器。

  1. 运行 gcloud compute instances attach-disk 命令以装载磁盘:

      gcloud compute instances attach-disk GCE_INSTANCE_NAME \
      --disk ${BACKUP_DISK} \
      --zone=$GCE_ZONE

    替换以下内容:

    • GCE_INSTANCE_NAME:在 Compute Engine 虚拟机中安装目标服务器的实例的名称。

    • GCE_ZONE:Compute Engine 虚拟机实例所在的区域。

  2. 将备份磁盘装载到目标服务器:

       lsblk
       mkdir -p /mnt/disks/backupdisk
       mount -o discard,defaults /dev/sdb /mnt/disks/backupdisk
  3. 将自定义绑定挂载添加到 /var/alloydb/config 目录中的 AlloyDB Omni dataplane.conf 文件:

      PG_BIND_MOUNTS=/mnt/disks/backupdisk:/mnt/disks/backups:rshared

如需详细了解 Docker 中的绑定挂载,请参阅绑定挂载

  1. 重启目标服务器:

Docker

  docker restart CONTAINER_NAME

CONTAINER_NAME 替换为新的 AlloyDB Omni 容器的名称,例如 my-omni-1

Podman

  podman restart CONTAINER_NAME

CONTAINER_NAME 替换为新的 AlloyDB Omni 容器的名称,例如 my-omni-1

更新 pgBackRest 配置文件

使用新的代码库路径更新备份磁盘目录中的现有 pgBackRest 文件。

  1. 在目标服务器中,前往 /mnt/disks/backupdisk 目录:

      cd /mnt/disks/backupdisk
  2. pgbackrest.conf 文件中将 pg1-path 路径更新为临时目录,以免覆盖现有数据。系统会在恢复过程中自动创建 data-restored 目录:

      sudo sed -i 's|.*pg1-path.*|pg1-path=/mnt/disks/pgsql/data-restored|' pgbackrest.conf
  3. pgbackrest.conf 文件中将 repo1-path 路径更新为临时目录:

      sudo sed -i 's|.*repo1-path.*|repo1-path=/mnt/disks/backups/repo|' conf.d/repo1-local-backupplan.conf

在目标数据库集群中验证源备份

登录目标服务器,然后运行 pgBackRest 命令,以验证目标服务器上是否可以访问源数据库集群备份:

Docker

  sudo docker exec CONTAINER_NAME pgbackrest --config-path=/mnt/disks/backups --stanza=db --repo=1 info

Podman

  sudo podman exec CONTAINER_NAME pgbackrest --config-path=/mnt/disks/backups --stanza=db --repo=1 info

以下是示例响应:

    stanza: db
    status: ok
    cipher: none
    db (current)
        wal archive min/max (15): 000000010000000000000002/00000001000000000000000D
        full backup: 20240213-231400F
            timestamp start/stop: 2024-02-13 23:14:00+00 / 2024-02-13 23:17:14+00
            wal start/stop: 000000010000000000000003 / 000000010000000000000003
            database size: 38.7MB, database backup size: 38.7MB
            repo1: backup set size: 4.6MB, backup size: 4.6MB
        incr backup: 20240213-231400F_20240214-000001I
            timestamp start/stop: 2024-02-14 00:00:01+00 / 2024-02-14 00:00:05+00
            wal start/stop: 00000001000000000000000D / 00000001000000000000000D
            database size: 38.7MB, database backup size: 488.3KB
            repo1: backup set size: 4.6MB, backup size: 84.2KB
            backup reference list: 20240213-231400F

响应中的时间戳用于恢复完整备份,或从恢复期限内的时间点恢复。

在目标服务器中恢复备份

确定要恢复的备份或要恢复的时间点后,请在目标服务器中运行 pgBackRest 命令。如需详细了解这些命令,请参阅恢复命令

以下是一些 pgBackRest 恢复命令示例:

  • 使用备份进行恢复

    pgbackrest --config-path=/mnt/disks/backups --stanza=db --repo=1 restore --set=20240213-231400F --type=immediate --target-action=promote --delta --link-all --log-level-console=info
  • 从某个时间点开始恢复

    pgbackrest --config-path=/mnt/disks/backups --stanza=db --repo=1 restore --target="2024-01-22 11:27:22" --type=time --target-action=promote --delta --link-all --log-level-console=info

将数据复制到目标服务器

恢复命令成功完成后,您可以将数据从 data-restored 临时目录复制到当前 AlloyDB 数据目录。

  1. 在目标服务器中,停止数据库服务:

    Docker

    docker stop CONTAINER_NAME

    Podman

    podman stop CONTAINER_NAME
  2. 最佳实践是将当前数据目录重命名为其他名称:

      mv ~/alloydb-data/data  ~/alloydb-data/data-old
  3. data-restored 临时目录重命名为当前数据目录:

      mv ~/alloydb-data/data-restored ~/alloydb-data/data
  4. 更新 postgresql.auto.conf 文件中的 pg1-path 值以加载已恢复的数据:

        vim ~/alloydb-data/data/postgresql.auto.conf
        # Verify postgresql.auto.conf.
        # Do not edit this file manually!
        # It will be overwritten by the ALTER SYSTEM command.
        # Recovery settings generated by pgBackRest restore on 2024-03-13 20:47:11
        restore_command = 'pgbackrest --config-path=/mnt/disks/pgsql --pg1-path=/mnt/disks/pgsql/data --repo=1 --stanza=db archive-get %f "%p"'
        recovery_target = 'immediate'
        recovery_target_action = 'promote'
        recovery_target_timeline = 'current'
  5. 在目标服务器中,启动数据库服务:

    Docker

    docker start CONTAINER_NAME

    Podman

    podman start CONTAINER_NAME

数据库服务启动后,您可以连接到主实例并运行查询,以验证数据是否已从备份中恢复。如需了解详情,请参阅连接到单个服务器上的 AlloyDB Omni

后续步骤