如何缩小 RDS Postgres 实例的磁盘大小?

问题描述 投票:0回答:1

我有一个超额配置的 4,999GB RDS 实例,其中有 4.6TB 可用磁盘,我想将其缩小到 499GB。这将节省大约 500 美元/月的配置 gp3 存储。

但我无法通过 RDS 门户做到这一点!我还尝试过

pg_dump
pg_restore
这个数据库,但由于表的大小(>250GB),它会导致太多的停机时间。我也不想自己配置复制,因为我不知道自己在做什么。

如何才能做到?

postgresql amazon-rds
1个回答
0
投票

我使用了 Amazon Database Migration Service 中的新 (2023) “同质”迁移功能。

此过程使用

db.m6g.xlarge
实例类型传输约 250GB 数据库大约需要 40 小时。我还同时从 Postgres 12 升级到 到 Postgres 16。

此外:DMS 成功复制了我们的

HSTORE
jsonb
列,而无需像过去使用 DMS 那样进行任何配置。

DMS IAM 角色

DMS 需要承担 IAM 角色才能运行迁移。配置 DMS 的 IAM 角色是 DMS 作业创建过程中最烦人的部分。

我使用此“信任关系”策略创建了一个新角色:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "dms.amazonaws.com",
                    "dms-data-migrations.amazonaws.com",
                    "dms.us-east-1.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}

请注意,您不仅需要

dms.amazonaws.com
,还需要所有这 3 项“服务”。

我继续授予此角色完全管理员权限,因为 YOLO,但如果您担心 DMS 拥有您,您可以以某种方式限制其访问 Secrets Manager 和 DMS 中的机密。

迁移步骤:

  1. 创建具有相同实例类型的新 RDS 实例,但根据需要使用更少的磁盘
    1. 创建您要迁移的实际数据库 (
      CREATE DATABASE...
      )
    2. 创建相同的用户和权限
  2. 为源数据库和目标数据库启用逻辑复制:
    1. 启用参数组中的
      rds.logical_replication
      参数
    2. 将 pglogic 添加到
      shared_preload_libraries
      参数
    3. wal_sender_timeout
      参数设置为 0 -- 复制滞后将过早终止迁移
    4. 重启实例
    5. CREATE EXTENSION pglogical;
  3. 在数据库迁移服务中创建“迁移项目”:
    1. 使用此“信任关系”策略创建 DMS 服务角色(见上文)
    2. 创建“数据提供者” - 一个用于源,一个用于目标数据库。您必须在机密管理器中为这些凭据创建机密。
    3. 创建一个“实例配置文件”,仍然不确定这是什么。
    4. 创建“迁移项目”,启用“完全加载”和“CDC”后
  4. 启动并让它运行几个小时

根据我们的经验,大量数据很快就被复制了,然后其余的表在接下来的两天内逐渐被复制。

我使用这两个查询来监视目标上的进度——其中一个显示磁盘大小,随着表的复制,磁盘大小会慢慢增加,另一个显示第一次加载完成后的行数。

最后,我将我们的网站置于只读模式,并以最小的服务中断切换到新实例。

© www.soinside.com 2019 - 2024. All rights reserved.