有些时候,我们可能需要将数据库变成只读模式,或者提供一些只读账号。
比如需要给开发人员一些自由查询功能的账号,或者当数据库用了多少空间后,将其锁定为只读模式。
让数据库进入只读有几种方法,
弱只读的方法,设置默认事务为只读,这种方法只能实现弱只读,因为用户可以在会话中改成写模式。
进入recovery模式,并开启hot_standby。
如果要让某个用户只读,建议使用权限控制的方法,比如只赋予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