pg_readonly
将集群设置为只读
仓库
pierreforstmann/pg_readonly
https://github.com/pierreforstmann/pg_readonly
源码
pg_readonly-1.0.4.tar.gz
pg_readonly-1.0.4.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_readonly | 1.0.4 | ADMIN | PostgreSQL | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 5120 | pg_readonly | 否 | 是 | 是 | 是 | 否 | 否 | - |
| 相关扩展 | pg_permissions pg_upless safeupdate set_user pgaudit noset sepgsql login_hook |
|---|
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | MIXED | 1.0.4 | 1817161514 | pg_readonly | - |
| RPM | PGDG | 1.0.4 | 1817161514 | pg_readonly_$v | - |
| DEB | PIGSTY | 1.0.4 | 1817161514 | postgresql-$v-pg-readonly | - |
构建
您可以使用 pig build 命令构建 pg_readonly 扩展的 DEB 包:
pig build pkg pg_readonly # 构建 DEB 包
安装
您可以直接安装 pg_readonly 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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 在 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 语句层面。