在 VM 上升級至 AlloyDB Omni 16.3.0 版

選取說明文件版本:

本頁面說明如何使用 pg_upgrade,將以 PostgreSQL 15 為基礎的 AlloyDB Omni 容器升級至 AlloyDB Omni PostgreSQL 16。本頁的說明介紹如何升級 AlloyDB Omni,包括部署為獨立伺服器,以及設定為複寫待命節點的 AlloyDB Omni。使用 pg_upgrade 可確保升級作業順利完成,不會遺失資料。

如要進一步瞭解 PostgreSQL 升級選項,請參閱 pg_upgrade

事前準備

  • 建議您先完整備份資料庫叢集,再開始升級。
  • 如要確保 AlloyDB Omni 15 服務正在執行,請執行下列指令:

    Docker

    docker exec ALLOYDB15_CONTAINER psql -U postgres -c "SELECT 1;"
    

    Podman

    podman exec ALLOYDB15_CONTAINER psql -U postgres -c "SELECT 1;"
    
  • AlloyDB Omni PostgreSQL 16.3.0 不支援 PostgreSQL 15 中的 pg_squeeze 擴充功能。如果 AlloyDB Omni 15 安裝項目中含有 pg_squeeze,您必須先移除擴充功能,才能升級至 AlloyDB Omni 16。

    如果您在 AlloyDB Omni 上安裝了自訂擴充功能,請務必在 16.3.0 映像檔中也安裝這些自訂擴充功能。執行下列指令,檢查已安裝的擴充功能:

    Docker

    docker exec ALLOYDB15_CONTAINER psql -U postgres -d postgres -c "
    SELECT * FROM pg_extension;"
    

    Podman

    podman exec ALLOYDB15_CONTAINER psql -U postgres -d postgres -c "
    SELECT * FROM pg_extension;
    
  • 如要從 AlloyDB Omni 15.5.2 版或更早版本升級,請先升級至較新的 AlloyDB Omni 15 版。從 AlloyDB Omni 15.5.2 版和更早版本遷移至最新版本

在 Docker 容器環境中升級 AlloyDB Omni

如要在 Docker 或 Podman 容器環境中,將 AlloyDB Omni PostgreSQL 15 升級至 AlloyDB Omni PostgreSQL 16.3.0,請按照下列步驟操作:

Docker

  1. 複製 bin 並共用要升級的 AlloyDB Omni 容器版本中的目錄:

    mkdir -p TMP/alloydb15_bin TMP/alloydb15_share
    docker cp ALLOYDB15_CONTAINER:/usr/lib/postgresql/15 TMP/alloydb15_bin
    docker cp ALLOYDB15_CONTAINER:/usr/share/postgresql/15 TMP/alloydb15_share
    
  2. 為 AlloyDB Omni PostgreSQL 16 容器建立新的資料目錄,以儲存升級後的資料:

    mkdir -p DATA_PATH/16/data
    chown 999 DATA_PATH/16/data
    
  3. 啟動 AlloyDB Omni PostgreSQL 16 執行中的容器,並在與先前 AlloyDB Omni 容器相同的網路中掛接所有路徑。請參閱以下範例:

    docker run -d --name ALLOYDB16_CONTAINER \
      -e POSTGRES_PASSWORD=PASSWORD -e PGPORT=5433 \
      -v DATA_PATH/16/data:/var/lib/postgresql/data \
      -v DATA_PATH/15/data:/var/lib/postgresql/old_data \
      -v TMP/alloydb15_bin/15:/usr/lib/postgresql/15 \
      -v TMP/alloydb15_share/15:/usr/share/postgresql/15 \
      --network container:ALLOYDB15_CONTAINER \
      google/alloydbomni:IMAGE_TAG /bin/sleep infinity
    
  4. 為升級版容器初始化新的資料目錄。

    docker exec -u postgres ALLOYDB16_CONTAINER bash -c "
      cd /tmp;
      initdb -D /var/lib/postgresql/data --frozen-collations --encoding=UTF8 --locale=C --locale-provider=icu --icu-locale=und-x-icu
    

    如果舊叢集有任何特殊設定 (例如 --data-checksum--locale),您也必須傳遞這些參數,才能建立 AlloyDB Omni 16 容器。

  5. 如果您在舊版容器上啟用重新啟動政策,則必須停用重新啟動政策,如下列範例所示:

    docker update --restart=no ALLOYDB15_CONTAINER
    
  6. 執行 pg_upgrade --check,確認叢集已準備好升級至 AlloyDB Omni 16。

    docker exec -u postgres ALLOYDB16_CONTAINER bash -c "
     cd /tmp;
    
     pg_upgrade -p 5432 -P 5433 --check -v \
                -b /usr/lib/postgresql/15/bin \
                -B /usr/lib/postgresql/16/bin \
                -d /var/lib/postgresql/old_data \
                -D /var/lib/postgresql/data"
    

    pg_upgrade --check 指令執行完畢後,您會看到以 Clusters are compatible 結尾的輸出內容,表示叢集已準備好升級。這項指令也會檢查並關閉 AlloyDB Omni PostgreSQL 15 容器。pg_upgrade --check完成後,應用程式就無法再連線至資料庫或執行任何查詢。

  7. 執行 pg_upgrade,將升級後的資料複製到新的資料目錄,然後確認 pg_upgrade 是否已順利完成,以及 AlloyDB Omni PostgreSQL 15 容器是否已結束:

    docker exec -u postgres ALLOYDB16_CONTAINER bash -c "
      cd /tmp;
      pg_upgrade -v --copy \
           -b /usr/lib/postgresql/15/bin \
           -B /usr/lib/postgresql/16/bin \
           -d /var/lib/postgresql/old_data \
           -D /var/lib/postgresql/data"
    
    docker ps -a
    
  8. 如果 pg_upgrade 失敗,請啟動 PostgreSQL 15 容器,藉此回溯至 AlloyDB Omni PostgreSQL 15 容器:

    docker logs ALLOYDB16_CONTAINER
    docker rm -f ALLOYDB15_CONTAINER ALLOYDB16_CONTAINER
    docker run -d --name ALLOYDB15_CONTAINER -p 5432:5432 \
      -e POSTGRES_PASSWORD=postgres \
      -v DATA_PATH/15/data:/var/lib/postgresql/data \
      google/alloydbomni:15
    

    如要判斷升級失敗的原因,請查看記錄。

  9. 升級成功後,請清理並重新啟動 AlloyDB Omni PostgreSQL 16 容器:

    docker rm -f ALLOYDB16_CONTAINER ALLOYDB15_CONTAINER
    docker run -d --name ALLOYDB16_CONTAINER -p 5432:5432 \
      -e POSTGRES_PASSWORD=postgres \
      -v DATA_PATH/16/data:/var/lib/postgresql/data \
      google/alloydbomni:16
    

Podman

  1. 複製 bin 並共用要升級的 AlloyDB Omni 容器版本中的目錄:

    mkdir -p TMP/alloydb15_bin TMP/alloydb15_share
    podman cp ALLOYDB15_CONTAINER:/usr/lib/postgresql/15 TMP/alloydb15_bin
    podman cp ALLOYDB15_CONTAINER:/usr/share/postgresql/15 TMP/alloydb15_share
    
  2. 為 AlloyDB Omni PostgreSQL 16 容器建立新的資料目錄,以儲存升級後的資料:

    mkdir -p DATA_PATH/16/data
    chown 999 DATA_PATH/16/data
    
  3. 啟動 AlloyDB Omni PostgreSQL 16 執行中的容器,並在與先前 AlloyDB Omni 容器相同的網路中掛接所有路徑。請參閱以下範例:

    podman run -d --name ALLOYDB16_CONTAINER \
      -e POSTGRES_PASSWORD=PASSWORD -e PGPORT=5433 \
      -v DATA_PATH/16/data:/var/lib/postgresql/data \
      -v DATA_PATH/15/data:/var/lib/postgresql/old_data \
      -v TMP/alloydb15_bin/15:/usr/lib/postgresql/15 \
      -v TMP/alloydb15_share/15:/usr/share/postgresql/15 \
      --network container:ALLOYDB15_CONTAINER \
      google/alloydbomni:16 /bin/sleep infinity
    
  4. 為升級版容器初始化新的資料目錄。

    podman exec -u postgres ALLOYDB16_CONTAINER bash -c "
      cd /tmp;
      initdb -D /var/lib/postgresql/data --frozen-collations --encoding=UTF8 --locale=C --locale-provider=icu --icu-locale=und-x-icu
    

    如果舊叢集有任何特殊設定 (例如 --data-checksum--locale),您也必須傳遞這些參數,才能建立 AlloyDB Omni 16 容器。

  5. 如果您在舊版容器上啟用重新啟動政策,則必須停用重新啟動政策,如下列範例所示:

    podman update --restart=no ALLOYDB15_CONTAINER
    
  6. 執行 pg_upgrade --check,確認叢集已準備好升級至 AlloyDB Omni 16。

    podman exec -u postgres ALLOYDB16_CONTAINER bash -c "
     cd /tmp;
    
     pg_upgrade -p 5432 -P 5433 --check -v \
                -b /usr/lib/postgresql/15/bin \
                -B /usr/lib/postgresql/16/bin \
                -d /var/lib/postgresql/old_data \
                -D /var/lib/postgresql/data"
    

    pg_upgrade --check 指令執行完畢後,您會看到以 Clusters are compatible 結尾的輸出內容,表示叢集已準備好升級。這項指令也會檢查並關閉 AlloyDB Omni PostgreSQL 15 容器。pg_upgrade --check完成後,應用程式就無法再連線至資料庫或執行任何查詢。

  7. 執行 pg_upgrade,將升級後的資料複製到新的資料目錄,然後確認 pg_upgrade 是否已順利完成,以及 AlloyDB Omni PostgreSQL 15 容器是否已結束:

    podman exec -u postgres ALLOYDB16_CONTAINER bash -c "
      cd /tmp;
      pg_upgrade -v --copy \
           -b /usr/lib/postgresql/15/bin \
           -B /usr/lib/postgresql/16/bin \
           -d /var/lib/postgresql/old_data \
           -D /var/lib/postgresql/data"
    
    podman ps -a
    
  8. 如果 pg_upgrade 失敗,請啟動 PostgreSQL 15 容器,藉此回溯至 AlloyDB Omni PostgreSQL 15 容器:

    podman logs ALLOYDB16_CONTAINER
    podman rm -f ALLOYDB15_CONTAINER ALLOYDB16_CONTAINER
    podman run -d --name ALLOYDB15_CONTAINER -p 5432:5432 \
      -e POSTGRES_PASSWORD=postgres \
      -v DATA_PATH/15/data:/var/lib/postgresql/data \
      google/alloydbomni:15
    

    如要判斷升級失敗的原因,請查看記錄。

  9. 升級成功後,請清理並重新啟動 AlloyDB Omni PostgreSQL 16 容器:

    podman rm -f ALLOYDB16_CONTAINER ALLOYDB15_CONTAINER
    podman run -d --name ALLOYDB16_CONTAINER -p 5432:5432 \
      -e POSTGRES_PASSWORD=postgres \
      -v DATA_PATH/16/data:/var/lib/postgresql/data \
      google/alloydbomni:16
    

升級待命節點上的 AlloyDB Omni 伺服器

如果 AlloyDB Omni 伺服器部署時,使用中的複寫待命設定正在串流,您就無法在待命節點上執行 pg_upgrade。如要在待命節點上升級 AlloyDB Omni 伺服器,建議您先確認待命節點上沒有任何複寫延遲,再升級作用中節點上的 AlloyDB Omni。

如要升級待命 AlloyDB Omni 伺服器,請按照下列高階步驟操作:

  1. 升級作用中節點前,請先停止備用 AlloyDB Omni 容器。
  2. 升級現用節點後,請使用 rsync,將新現用節點的升級資料目錄同步至待命節點。如要進一步瞭解如何升級串流複製待命伺服器,請參閱 pg_upgrade
  3. 使用相同的資料目錄,透過 AlloyDB for PostgreSQL PostgreSQL 16 映像檔啟動容器。

如果您使用邏輯複製功能,請參閱「透過複製功能升級資料」。