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.3.0 不支持 PostgreSQL 15 中的
pg_squeeze
扩展程序。如果pg_squeeze
包含在您的 AlloyDB Omni 15 安装中,您必须先移除该扩展程序,然后再升级到 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 16 映像启动容器。
如果您使用的是逻辑复制,请参阅通过复制升级数据。