PostgreSQL 主从同步
原创 已于 2026-06-28 15:49:14 修改 · 粉丝可见 · 45 阅读 · 0 · 0 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/162365310
简介
PostgreSQL主从复制是数据库高可用、读写分离、数据容灾的核心技术,通过将主数据库(主库)的数据变更实时同步至从数据库(备库),实现数据冗余备份、读请求负载分担、故障快速切换,是生产环境中保障数据库稳定运行的基础架构。本文将系统讲解其核心原理、复制模式、实操搭建流程、关键优化方案及常见问题解决方案。
PostgreSQL的WAL(预写式日志)是主服务器上更改/活动的记录,并可视为数据库中发生的更改的日志或账本。下图展示了在一个本地主PostgreSQL实例和一个远程热备实例中的WAL传播流程。

上述图表展示了全部五个主要阶段。
实验步骤
将本地数据库作为 主 ,服务器数据库作为从。
内网穿透
将本地数据库端口外露,使得服务器数据库可以进行联通。具体实现,可以查看我之前的学习笔记: frp搭建内网穿透工具-CSDN博客
搭建主数据库
1 2 3 4 5 6
| docker run --name postgres \ -e POSTGRES_PASSWORD=123456 \ -p 5432:5432 \ -v /home/angindem/postgre/data:/var/lib/postgresql \ --restart=always \ -d postgres
|
建立数据的连接
去到data目录下找到 postgresql.conf 配置进行配置从数据库的连接
这是我的挂载的目录路径可以做一下参考:/home/angindem/postgre/data/18/docker
1 2 3
| cat >> /home/angindem/postgre/data/18/docker/postgresql.conf <<-'EOF' primary_conninfo = 'host=172.20.0.2 port=5432 user=repl password=repl' EOF
|
host:可访问主数据库IP地址(注意服务器这里的外网IP)
port:连接端口(注意服务器这里的外网端口)
user:登录用户
password:登录密码
设置数据库访问白名单
1 2 3 4
| cat >> /home/angindem/postgre/data/18/docker/pg_hba.conf <<-'EOF' host replication repl 172.20.0.2/32 md5 host replication repl 172.20.0.3/32 md5 EOF
|
主数据库新建用户repl可复制用户
进入容器:
1
| docker exec -it postgres /bin/bash
|
登录用户:
创建可登录可复制数据权限的用户:
1 2
| set synchronous_commit =off; create role repl login replication encrypted password 'repl';
|
设置同步参数
1 2 3 4 5
| vim /home/angindem/postgre/data/18/docker/postgresql.conf wal_level = replica max_wal_senders = 2
|

重启主数据库加载配置
1
| docker restart postgres && docker logs -f postgres
|
搭建从数据库
1 2 3 4 5 6
| docker run --name postgres \ -e POSTGRES_PASSWORD=xIulKv6ZU9dXfHt3wqR \ -p 5432:5432 \ -v /root/postgres/backup:/var/lib/backup \ --restart=always \ -d postgres
|
拉取主库数据文件
1 2
| docker exec -it postgres bash pg_basebackup -h 192.168.5.54 -D /var/lib/backup -p 5432 -U repl -Fp -Xs -Pv -R --checkpoint=fast
|
输入密码开始拷贝

成功拷贝整个数据库并映射到挂载目录:

停止从数据库
从库同步主库数据
1 2
| rm -rf /root/postgres/data/18/docker/* cp -rf /root/postgres/backup/* /root/postgres/data/18/docker/
|
配置从库同步参数
由于从库数据文件是从主库拉取过来,需要先删除主库同步相关的参数,然后新增从库同步参数:
1 2 3 4 5
| vim /data/db/postgresql/postgresql.conf primary_conninfo = 'host=192.168.179.134 port=5432 user=replica password=wsx-123' recovery_target_timeline = latest hot_standby = on
|

启动从库
1
| docker start postgres && docker logs -f postgres
|
测试主从同步
在主数据库中插入一条数据:

从数据库查看:

成功动态同步