PostgreSQL 只读模式 , hot standby recovery 模式等介绍,以及如何建立只读账号

1 minute read

背景

有些时候,我们可能需要将数据库变成只读模式,或者提供一些只读账号。

比如需要给开发人员一些自由查询功能的账号,或者当数据库用了多少空间后,将其锁定为只读模式。

让数据库进入只读有几种方法,

1. 弱只读的方法,设置默认事务为只读,这种方法只能实现弱只读,因为用户可以在会话中改成写模式。

2. 进入recovery模式,并开启hot_standby。

3. 如果要让某个用户只读,建议使用权限控制的方法,比如只赋予select的权限,同时使用事件触发器,规避掉 CREATE, 等DDL操作。

弱只读设置方法

让数据库变成只读模式,目前PostgreSQL没有严格意义上的只读模式(如临时表在只读事务中还是可以使用的)。

通过调整参数或设置事务模式可以将后续登录的SESSION或者当前事务设置为只读模式。

在只读模式下, PostgreSQL不允许如下SQL:

When a transaction is read-only, the following SQL commands are disallowed:   
  
INSERT, UPDATE, DELETE, and COPY FROM if the table they would write to is not a temporary table;   
  
all CREATE, ALTER, and DROP commands;   
  
COMMENT, GRANT, REVOKE, TRUNCATE;   
  
and EXPLAIN ANALYZE and EXECUTE if the command they would execute is among those listed.   
  
This is a high-level notion of read-only that does not prevent all writes to disk.   

在SQL模式下进入只读事务的方法:

digoal=> begin;  
BEGIN  
digoal=> set transaction read only;  
SET  

参数配置 :

default_transaction_read_only = on  

配置完后pg_ctl reload -D $PGDATA

配置完参数后,不影响已经连接的SESSION,仅仅对后续连接上来的SESSION生效。新建的SESSION进来后事务就是read only模式。

digoal=> show default_transaction_read_only  
digoal-> ;  
 default_transaction_read_only   
-------------------------------  
 on  
digoal=> delete from tbl_test;  
ERROR:  cannot execute DELETE in a read-only transaction  

可以设置事务级WRITE覆盖这个默认值

digoal=> begin;  
BEGIN  
digoal=> set transaction read write;  
SET  
digoal=> delete from tbl_test;  
DELETE 1008  

或者设置SESSION级参数,覆盖之

digoal=> set session default_transaction_read_only=off;  
SET  
digoal=> delete from tbl_test;  
DELETE 1008  

强只读设置方法

PostgreSQL进入强只读的方法很简单,创建recovery.conf文件,并打开hot_standby模式。重启即可。

Oracle进入只读模式可以在启动数据库时通过startup mount ; alter database open read only ;

ORACLE进入只读模式后要回到读写模式需要重启数据库,原因是数据库智能OPEN一次。

Oracle还有两个不需要重启数据库也进入到只读模式的命令如:

alter system SUSPEND | RESUME  
alter system QUIESCE RESTRICTED and UNQUIESCE  

具体的细节可以参考ORACLE官方文档。

只读用户

只读用户的设置也很简单,对于需要访问的表或者SCHEMA,设置只读权限。

同时使用事件触发器规避DDL

参考

《PostgreSQL 事件触发器 - PostgreSQL 9.3 Event Trigger》

《PostgreSQL 事件触发器 - DDL审计 , DDL逻辑复制 , 打造DDL统一管理入》

《PostgreSQL 事件触发器 - 实现类似Oracle的回收站功能》

《DBA专供 冈本003系列 - 数据库安全第一,过个好年》

Flag Counter

digoal’s 大量PostgreSQL文章入口