以下是在Ubuntu上使用PostgreSQL复制功能的步骤(以流复制为例):
192.168.1.10
,从库IP为192.168.1.11
。修改配置文件
/etc/postgresql/15/main/postgresql.conf
:wal_level = replica # 启用WAL日志
max_wal_senders = 5 # 允许最大复制连接数
wal_keep_size = 128MB # 保留WAL日志大小
hot_standby = on # 允许从库只读
listen_addresses = '*' # 监听所有IP
/etc/postgresql/15/main/pg_hba.conf
:host replication replicator 192.168.1.11/32 md5 # 允许从库IP通过复制用户连接
sudo systemctl restart postgresql
创建复制用户
sudo -u postgres psql
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'your_password';
\q
清空数据目录并拉取主库数据
sudo systemctl stop postgresql
sudo rm -rf /var/lib/postgresql/15/main/*
sudo -u postgres pg_basebackup -h 192.168.1.10 -D /var/lib/postgresql/15/main -U replicator -P --wal-method=stream
(需输入复制用户密码)
配置postgresql.conf
hot_standby = on
(PostgreSQL 12+无需recovery.conf
,参数直接写入主配置文件)
启动从库
sudo systemctl start postgresql
sudo -u postgres psql
SELECT * FROM pg_stat_replication; # 查看从库连接信息
wal_level = logical
max_replication_slots = 5
-- 主库:创建发布
CREATE PUBLICATION pub_all FOR ALL TABLES;
-- 从库:创建订阅
CREATE SUBSCRIPTION sub_all CONNECTION 'host=192.168.1.10 port=5432 dbname=postgres user=replicator password=your_password'
PUBLICATION pub_all;
(逻辑复制需在从库手动创建表结构,仅同步数据变更)archive_mode
和WAL归档,防止数据丢失。synchronous_commit = on
和synchronous_standby_names
,但可能影响主库性能。参考来源: