使用本機備份,在單一伺服器中複製資料庫叢集

選取說明文件版本:

本頁面說明如何使用本機備份,在單一伺服器中複製資料庫叢集。

本頁的步驟假設來源 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」。

後續步驟