PostgreSQL 12数据库迁移至新服务器:如何实现最小停机?
PostgreSQL 12 无停机/最小停机迁移方案(200GB含分区表场景)
方案一:流复制主从切换(推荐,真正无停机)
这是最适配大实例、分区表场景的无停机方案,基于PostgreSQL物理复制实现,不受表结构、主键缺失影响。
前置准备
- 新服务器安装同版本PostgreSQL 12(版本不一致易引发兼容性问题)
- 主服务器修改
postgresql.conf配置并重启(毫秒级停机,可忽略):wal_level = replica max_wal_senders = 10 # 预留足够同步进程 wal_keep_segments = 64 # 防止备份过程中WAL被覆盖 archive_mode = on archive_command = 'cp %p /data/pg_archive/%f' # 替换为实际归档路径 - 主服务器
pg_hba.conf添加新服务器信任规则:host replication postgres [新服务器IP]/32 md5 - 主服务器执行
SELECT pg_reload_conf()生效配置。
搭建从库同步
- 新服务器停库并清空默认数据目录:
systemctl stop postgresql@12-main rm -rf /var/lib/postgresql/12/main/* - 拉取主库全量数据并自动配置同步:
说明:pg_basebackup -h [主服务器IP] -U postgres -D /var/lib/postgresql/12/main -P -X stream -R-X stream确保备份时同步WAL日志,-R自动生成同步配置文件 - 启动新服务器PostgreSQL,验证同步状态:
-- 在新服务器执行 SELECT pg_is_in_recovery(); -- 返回t表示处于同步状态 SELECT usename, client_addr, state FROM pg_stat_replication; -- 查看主从连接详情
无停机主从切换
- 主服务器设置同步模式,确保所有事务同步到从库:
ALTER SYSTEM SET synchronous_standby_names = '[新服务器主机名]'; SELECT pg_reload_conf(); - 提升从库为主库:
-- 在新服务器执行 SELECT pg_promote(); - 切换应用连接到新主库,确认业务正常后关停旧主库即可。
特殊场景适配
- 分区表:物理复制基于实例块级同步,自动同步所有分区结构与数据,无需额外处理
- 无主键表:物理复制不受主键缺失影响;若后续需逻辑同步,可临时添加非验证主键减少锁表:
ALTER TABLE [表名] ADD CONSTRAINT [主键名] PRIMARY KEY ([字段]) NOT VALID; ALTER TABLE [表名] VALIDATE CONSTRAINT [主键名];
方案二:逻辑备份+增量同步(最小停机,适合需调整结构场景)
若迁移时需修改表结构(如合并分区、新增字段),可采用此方案,停机时间仅为切换应用的几秒。
全量逻辑备份(低峰期执行,无停机)
- 主服务器导出全量数据(并行加速,适配大库):
说明:pg_dump -h [主服务器IP] -U postgres -d [目标库名] -F d -j 8 -f /data/pg_backup-F d为目录格式,-j 8用8个并行进程提升导出速度 - 将备份目录复制到新服务器,导入新库:
pg_restore -h [新服务器IP] -U postgres -d [新库名] -j 8 /data/pg_backup
增量同步(缩小数据差距)
- 主服务器创建逻辑复制槽:
CREATE_REPLICATION_SLOT migrate_slot LOGICAL pgoutput; - 启动增量同步,将备份后的新事务同步到新库:
pg_recvlogical -h [主服务器IP] -U postgres -d [目标库名] -S migrate_slot -f - | psql -h [新服务器IP] -U postgres -d [新库名]
切换与收尾
- 待增量同步无延迟后,切换应用到新库
- 停止同步进程,删除复制槽:
DROP_REPLICATION_SLOT migrate_slot;
无主键表适配
- 逻辑复制要求表有主键/唯一约束,无主键表需先执行:
此操作不锁表,但会增加WAL日志量,需确保主库磁盘充足。ALTER TABLE [表名] REPLICA IDENTITY FULL;
方案选择建议
- 无结构调整需求:优先选方案一,零停机,兼容性最强,适合大实例与分区表场景
- 需调整结构:选方案二,停机时间仅为应用切换的几秒
- 所有操作前必须在测试环境验证备份完整性、同步稳定性,避免生产事故
内容的提问来源于stack exchange,提问作者devaskim
相关产品推荐
相关产品推荐

