pg_upgrade,將 AlloyDB Omni PostgreSQL 15 容器升級至 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.13.0 不支援 PostgreSQL 15 中的
pg_squeeze擴充功能。如果 AlloyDB Omni 15 安裝項目中有pg_squeeze,請先移除擴充功能,再升級至 AlloyDB Omni 16。如果您在 AlloyDB Omni 上安裝了自訂擴充功能,請確認 16.13.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.13.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 伺服器,請按照下列高階步驟操作:
- 升級 Active 節點前,請先停止待命 AlloyDB Omni 容器。
- 升級使用中節點後,請使用 rsync,將升級後的資料目錄從新的使用中節點同步至待命節點。如要進一步瞭解如何升級串流複製待命伺服器,請參閱
pg_upgrade。 - 使用相同的資料目錄,透過 AlloyDB for PostgreSQL PostgreSQL 16 映像檔啟動容器。
如果您使用邏輯複製,請參閱「透過複製功能升級資料」。