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
複製
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
為 AlloyDB Omni PostgreSQL 16 容器建立新的資料目錄,以儲存升級後的資料:
mkdir -p DATA_PATH/16/data chown 999 DATA_PATH/16/data
啟動 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
為升級版容器初始化新的資料目錄。
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 容器。如果您在舊版容器上啟用重新啟動政策,則必須停用重新啟動政策,如下列範例所示:
docker update --restart=no ALLOYDB15_CONTAINER
執行
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
完成後,應用程式就無法再連線至資料庫或執行任何查詢。執行
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
如果
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
如要判斷升級失敗的原因,請查看記錄。
升級成功後,請清理並重新啟動 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
複製
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
為 AlloyDB Omni PostgreSQL 16 容器建立新的資料目錄,以儲存升級後的資料:
mkdir -p DATA_PATH/16/data chown 999 DATA_PATH/16/data
啟動 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
為升級版容器初始化新的資料目錄。
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 容器。如果您在舊版容器上啟用重新啟動政策,則必須停用重新啟動政策,如下列範例所示:
podman update --restart=no ALLOYDB15_CONTAINER
執行
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
完成後,應用程式就無法再連線至資料庫或執行任何查詢。執行
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
如果
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
如要判斷升級失敗的原因,請查看記錄。
升級成功後,請清理並重新啟動 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 伺服器,請按照下列高階步驟操作:
- 升級作用中節點前,請先停止備用 AlloyDB Omni 容器。
- 升級現用節點後,請使用 rsync,將新現用節點的升級資料目錄同步至待命節點。如要進一步瞭解如何升級串流複製待命伺服器,請參閱
pg_upgrade
。 - 使用相同的資料目錄,透過 AlloyDB for PostgreSQL PostgreSQL 16 映像檔啟動容器。
如果您使用邏輯複製功能,請參閱「透過複製功能升級資料」。