如何为AWS RDS Postgres主库搭建无需DMS的本地Postgres复制实例
不使用AWS DMS创建RDS Postgres本地完全一致副本的可行方案
根据你的场景(已打通本地与AWS网络、验证过pg_dump可行性、禁止使用DMS),以下是三种经过验证的实现方案:
方案1:基于pg_basebackup的物理副本(适合需要字节级完全一致、大数据量场景)
物理备份直接复制源库的数据文件,默认保证副本和源RDS实例某一时刻的完全一致,备份恢复速度远快于逻辑备份:
- 前置准备:确认源RDS Postgres参数组中
wal_level设置为replica或logical,max_wal_senders参数值大于等于2,所使用的数据库账号具备replication权限 - 本地安装与源RDS完全相同大版本的Postgres(小版本尽量保持一致避免兼容性问题)
- 执行备份命令,直接将RDS数据拉取到本地数据目录:
pg_basebackup -h [RDS实例访问域名] -U [具备复制权限的数据库账号] -D [本地Postgres数据目录路径] -P -X stream - 备份完成后修改本地Postgres的
postgresql.conf、pg_hba.conf适配本地网络配置,启动本地实例即可获得完全一致的副本
方案2:基于pg_dump+pg_restore的逻辑副本(适合仅需要某一时刻静态一致副本的场景)
你已经验证过pg_dump的可行性,调整参数即可保证副本完全一致:
- 执行全库一致性备份命令,添加
--serializable-deferrable参数保证备份的事务一致性,无需锁库:pg_dump -h [RDS实例访问域名] -U [数据库账号] -d [源数据库名] -Fc -v -f [本地备份文件存储路径.dump] --serializable-deferrable - 本地创建版本与源RDS一致的空Postgres实例,执行恢复命令:
pg_restore -h localhost -U [本地数据库账号] -d [本地空数据库名] -v [本地备份文件存储路径.dump] - 恢复完成后可通过对比两端表结构、表行数、关键数据哈希值的方式校验一致性
方案3:基于原生逻辑复制的持续同步副本(适合需要本地副本和RDS主库实时同步的场景)
如果需要本地副本持续和RDS主库保持一致,可使用Postgres原生逻辑复制能力,无需额外服务:
- 调整源RDS参数组,将
wal_level设置为logical,重启RDS实例生效 - 连接源RDS执行命令创建发布:
CREATE PUBLICATION rds_to_local FOR ALL TABLES; - 本地提前创建和源库表结构完全一致的空数据库,执行命令创建订阅:
CREATE SUBSCRIPTION local_subscribe CONNECTION 'host=[RDS实例访问域名] port=5432 dbname=[源数据库名] user=[数据库账号] password=[数据库密码]' PUBLICATION rds_to_local; - 订阅启动后会自动完成初始数据全量同步,后续自动同步所有增量变更,保证两端数据一致
注意:所有操作前请确认本地与AWS RDS的5432端口连通性正常,操作所用账号具备对应操作权限,避免因权限、网络问题导致操作失败。
内容的提问来源于stack exchange,提问作者Niki
相关产品推荐
相关产品推荐

