pg_readonly

将集群设置为只读

概览

扩展包名版本分类许可证语言
pg_readonly1.0.4ADMINPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
5120pg_readonly-
相关扩展pg_permissions pg_upless safeupdate set_user pgaudit noset sepgsql login_hook

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.0.41817161514pg_readonly-
RPMPGDG1.0.41817161514pg_readonly_$v-
DEBPIGSTY1.0.41817161514postgresql-$v-pg-readonly-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
d13.x86_64
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
d13.aarch64
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
u22.x86_64
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
u22.aarch64
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
u24.x86_64
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
u24.aarch64
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4
PIGSTY 1.0.4

构建

您可以使用 pig build 命令构建 pg_readonly 扩展的 DEB 包:

pig build pkg pg_readonly         # 构建 DEB 包

安装

您可以直接安装 pg_readonly 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_readonly;          # 当前活跃 PG 版本安装
pig ext install -y pg_readonly -v 18  # PG 18
pig ext install -y pg_readonly -v 17  # PG 17
pig ext install -y pg_readonly -v 16  # PG 16
pig ext install -y pg_readonly -v 15  # PG 15
pig ext install -y pg_readonly -v 14  # PG 14
dnf install -y pg_readonly_18       # PG 18
dnf install -y pg_readonly_17       # PG 17
dnf install -y pg_readonly_16       # PG 16
dnf install -y pg_readonly_15       # PG 15
dnf install -y pg_readonly_14       # PG 14
apt install -y postgresql-18-pg-readonly   # PG 18
apt install -y postgresql-17-pg-readonly   # PG 17
apt install -y postgresql-16-pg-readonly   # PG 16
apt install -y postgresql-15-pg-readonly   # PG 15
apt install -y postgresql-14-pg-readonly   # PG 14

预加载配置

shared_preload_libraries = 'pg_readonly';

创建扩展

CREATE EXTENSION pg_readonly;

用法

pg_readonly: 将集群数据库设置为只读

pg_readonly 在 SQL 层面将 PostgreSQL 集群中的所有数据库设置为只读模式。必须通过 shared_preload_libraries 加载。只读状态在共享内存中通过全局标志管理(重启后不保留)。

检查只读状态

SELECT get_cluster_readonly();
-- 返回 false(可读写)或 true(只读)

设置集群为只读

SELECT set_cluster_readonly();

在只读模式下,SELECT 语句被允许(除非调用了写入函数),但 DML(INSERT、UPDATE、DELETE)、DDL(包括 TRUNCATE)和 DCL(GRANT、REVOKE)被阻止:

SELECT * FROM t;              -- 允许
UPDATE t SET x = 33;          -- ERROR: pg_readonly: invalid statement because cluster is read-only
CREATE TABLE tmp(c text);     -- ERROR: pg_readonly: invalid statement because cluster is read-only

注意:set_cluster_readonly() 会终止所有打开的事务。

设置集群为可读写

SELECT unset_cluster_readonly();

注意:后台进程(checkpointer、bgwriter、walwriter、autovacuum)在只读模式下继续运行——限制仅在 SQL 语句层面。


最后修改 2026-03-14: update extension metadata (953cbd0)