postgresql的备用库是通过流复制或者归档恢复方式从主库同步数据的节点,其核心设计目标是保障高可用与数据冗余。在默认配置下,备用库并不支持读写操作,而是以只读副本的形式存在。

postgresql备用库为什么不可写
备用库在启动后会进入持续恢复状态,不断应用主库传来的wal日志。在此状态下,数据库引擎禁止任何产生wal的写事务,这是为了维护主备数据一致性。如果尝试在备用库执行写语句,系统会直接抛出异常。
-- 在备用库执行如下写操作
INSERT INTO t_user(name) VALUES ('test');
-- 报错信息类似:cannot execute INSERT in a read-only transaction
只读副本的工作机制
postgresql利用wal(预写日志)传输实现主备同步。主库将wal发送给备用库,备用库重放日志达到数据一致。备用库可同时处理只读查询,这便是只读副本机制。
- 主库:处理读写,生成wal
- 备用库:接收wal,重放数据,提供只读查询
- 同步方式:异步流复制或同步流复制
常见备用库参数
| 参数名 | 作用 |
|---|---|
| hot_standby | 是否允许备用库接受只读连接 |
| primary_conninfo | 备用库连接主库的信息 |
| restore_command | 从归档获取wal的命令 |
如何让备用库提供读写能力
若业务确实需要备用库可写,可采用逻辑复制或级联架构,但标准物理备用库本身不支持。另一种方式是使用postgresql_fdw扩展将写请求路由回主库,但这不属于备用库原生读写。
-- 使用postgresql_fdw将本地写操作转发到主库示例 CREATE EXTENSION postgresql_fdw; CREATE SERVER main_db FOREIGN DATA WRAPPER postgresql_fdw OPTIONS (host '192.168.0.1', dbname 'mydb', port '5432'); CREATE USER MAPPING FOR CURRENT_USER SERVER main_db OPTIONS (user 'replicator', password 'pwd'); -- 之后可通过外部表将写操作发往主库
总结
postgresql备用库默认是只读副本,不可直接读写。其只读副本机制通过wal重放保障数据一致,并分担主库查询负载。写请求必须指向主库,误用备用库写操作会引发事务错误。合理运用只读副本能提升系统整体稳定性与性能。
postgresqlstandby_databaseread_only_replica修改时间:2026-07-25 22:27:09