我有一个超额配置的 4,999GB RDS 实例,其中有 4.6TB 可用磁盘,我想将其缩小到 499GB。这将节省大约 500 美元/月的配置 gp3 存储。
但我无法通过 RDS 门户做到这一点!我还尝试过
pg_dump
和 pg_restore
这个数据库,但由于表的大小(>250GB),它会导致太多的停机时间。我也不想自己配置复制,因为我不知道自己在做什么。
如何才能做到?
我使用了 Amazon Database Migration Service 中的新 (2023) “同质”迁移功能。
此过程使用
db.m6g.xlarge
实例类型传输约 250GB 数据库大约需要 40 小时。我还同时从 Postgres 12 升级到 到 Postgres 16。
此外:DMS 成功复制了我们的
HSTORE
和 jsonb
列,而无需像过去使用 DMS 那样进行任何配置。
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 中的机密。
CREATE DATABASE...
)rds.logical_replication
参数shared_preload_libraries
参数wal_sender_timeout
参数设置为 0 -- 复制滞后将过早终止迁移CREATE EXTENSION pglogical;
根据我们的经验,大量数据很快就被复制了,然后其余的表在接下来的两天内逐渐被复制。
我使用这两个查询来监视目标上的进度——其中一个显示磁盘大小,随着表的复制,磁盘大小会慢慢增加,另一个显示第一次加载完成后的行数。
最后,我将我们的网站置于只读模式,并以最小的服务中断切换到新实例。