PG cannot execute 一些dml,ddl语句的时候报:in a read-only transaction

这种情况有可能是以下原因引起的:

1 可能发生了主备切换:查看/data/pg_hba.conf

  select pg_is_in_recovery(); 备机返回T

2 show default_transaction_read_only 查看是否参数值为ON

会话级别: set default_transaction_read_only = off;

DB级别: alter database xxxxx set default_transaction_read_only = off;

系统级别:

alter system set default_transaction_read_only=off; select pg_reload_conf();

一些参数(其实是看pg_settings 的context字段),是可以不用重启postgres cluster 就可以生效

pg_ctl -D /var/lib/pgsql/data reload select pg_reload_conf()

internal:这类参数为只读参数。有的是postgres程序写死的,有些是在安装数据库时intdb时设置好的。

postmaster:这类参数需要重启数据库才能生效。

sighup:不需要重启数据库,但要向postmaster进程发送sighup信号,即需要pg_ctl reload命令。

backend:无需重启数据库,只需向postmaster进程发送sighup信号。但新的配置值只能在之后的新连接中生效,已有连接中这些参数值不会改变。

superuser:这类参数可以由超级用户使用set修改。参数设置后只会影响超级用户自身的session配置,不会影响其他用户。

user:普通用户使用set设置,这类参数修改后和superuser类参数一样,也是只影响自身session。仅当没有通过set 设置会话本地值时,postgresql.conf中的改变才会影响现有的会话