在虚拟机上升级到 AlloyDB Omni 16.3.0 版

选择文档版本:

本页面介绍了如何使用 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

  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 16 映像启动容器。

如果您使用的是逻辑复制,请参阅通过复制升级数据