You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    

无主键表适配

  • 逻辑复制要求表有主键/唯一约束,无主键表需先执行:
    ALTER TABLE [表名] REPLICA IDENTITY FULL;
    
    此操作不锁表,但会增加WAL日志量,需确保主库磁盘充足。

方案选择建议

  • 无结构调整需求:优先选方案一,零停机,兼容性最强,适合大实例与分区表场景
  • 需调整结构:选方案二,停机时间仅为应用切换的几秒
  • 所有操作前必须在测试环境验证备份完整性、同步稳定性,避免生产事故

内容的提问来源于stack exchange,提问作者devaskim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 04:17:09