Ubuntu 上常用的 PostgreSQL 数据同步方案与选型
物理流复制 一主一从实操步骤 Ubuntu 20.04/22.04
listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
wal_keep_size = 128MB
hot_standby = on
host replication replicator 192.168.1.11/32 md5
sudo -u postgres psql -c "CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'YourStrongPwd';"
sudo systemctl restart postgresql
sudo systemctl stop postgresql
sudo -u postgres rm -rf /var/lib/postgresql/14/main/*
sudo -u postgres pg_basebackup -h 192.168.1.10 -U replicator -D /var/lib/postgresql/14/main -P -R --wal-method=stream
sudo systemctl start postgresql
primary_conninfo = 'host=192.168.1.10 port=5432 user=replicator password=YourStrongPwd'
# 主库
sudo -u postgres psql -c "SELECT client_addr, state, sync_state FROM pg_stat_replication;"
# 从库
sudo -u postgres psql -c "SELECT pg_is_in_recovery();" -- 返回 t 表示处于备库恢复状态
提示:PostgreSQL 12+ 使用 standby.signal 与 primary_conninfo;9.6/10/11 使用 recovery.conf 的 standby_mode = on 与 primary_conninfo。逻辑复制 选择性表同步
-- 创建发布(示例:发布 public 模式下所有表)
CREATE PUBLICATION pub_all FOR ALL TABLES;
-- 或仅发布指定表
CREATE PUBLICATION pub_sales FOR TABLE public.orders, public.customers;
-- 在目标库创建与源库一致的结构(表、索引、约束等)
-- 创建订阅(示例)
CREATE SUBSCRIPTION sub_from_prod
CONNECTION 'host=192.168.1.10 port=5432 user=replicator password=YourStrongPwd dbname=yourdb'
PUBLICATION pub_all;
-- 发布端
\dRp
-- 订阅端
\dRs
注意:逻辑复制以表为单位,DDL 需单独处理;冲突与回放需业务侧评估。备份恢复与工具同步
# 导出
pg_dump -h 192.168.1.10 -U postgres -F c -b -v -f db.dump yourdb
# 导入
pg_restore -h 192.168.1.11 -U postgres -d yourdb -v db.dump
高可用与故障切换方案
常见问题与排查要点