PostgreSQL 只读模式
通常我们谈到关于 PostgreSQL 的只读连接时都是在从节点的环境中。但是,在某些情况下您可能需要在主节点建立只读连接。PostgreSQL 提供了 default_transaction_read_only
参数来控制事务读写属性。
当全局设置 default_transaction_read_only
为 on
时,此时所有的连接都不能修改数据库,该参数是可重新加载的,因此您不需要重新启动数据库实例,使用 SELECT pg_reload_conf();
即可使修改生效。
示例
下面是一个简单的示例,首先需要确保你没有修改 default_transaction_read_only
。
1 | postgres=# SHOW default_transaction_read_only; |
目前都是按照预期进行的:我们创建了一张 test
表,并插入了一条数据。现在我们尝试将 default_transaction_read_only
设置为 on
。
1 | postgres=# ALTER SYSTEM SET default_transaction_read_only TO on; |
接着验证一下修改是否被拒绝:
1 | postgres=# INSERT INTO test VALUES (2, 'Hi, PostgreSQL!') RETURNING *; |
注意
虽然可以通过 default_transaction_read_only
控制连接的读写属性,但是该参数是会话级别的,这就意味着用户可以在会话级别对其进行修改,例如:
1 | postgres=# SET default_transaction_read_only TO off; |
此外,当开启 default_transaction_read_only
时,并不意味着它不能写入,对于临时表而言,它是可以写入的,如下所示:
1 | postgres=# CREATE TEMPORARY TABLE tmp_table (id int, info text); |
需要注意的是,虽然您可以对临时表进行写入操作,但是您没法在只读连接中创建临时表。
1 | postgres=# CREATE TEMPORARY TABLE tmp (id int); |
参考
[1] https://jkatz05.com/post/postgres/postgres-read-only/
一官到任,出票要唤兄弟三人。一胖子、一长子、一矮子备用。异姓者不许进见。
一家有兄弟四人,仅有一胖三矮。
私相计议曰:“四人之中,胖矮俱有,单少一长人。只得将二矮缝一长裤。两个接起充作长人,便觉全备。”
如计行之。官见大喜,簪花赏酒。三人一时荣宠。下矮压得受苦,在内哓哓,大有怨词。
官听见,问:“下面甚响?”
众慌禀曰:“这是长卵叹气。”