我正在尝试在本地计算机中设置pgexercises数据。当我运行时:psql -U <username> -f clubdata.sql -d postgres -x
我收到错误:psql:clubdata.sql:6: ERROR: cannot execute CREATE SCHEMA in a read-only transaction
。
为什么在本地计算机上创建只读数据库?我能改变一下吗?
答案 0 :(得分:13)
通常,出现此类错误的最可能原因是:
在只读副本上尝试创建语句(整个实例是只读的)。
<username>
将default_transaction_read_only
设为开启
数据库已将default_transaction_read_only
设置为ON
提到的脚本的第一行:
CREATE DATABASE exercises;
\c exercises
CREATE SCHEMA cd;
并且您在第6行报告错误发生在CREATE SCHEMA
,而不是之前。
这意味着CREATE DATABASE
在<username>
运行时确实有效。
如果上述任何原因直接适用,它就不会起作用。
从技术上解释这一点的一种可能性是default_transaction_read_only
文件中ON
为postgresql.conf
,数据库OFF
设置为postgres
,psql调用连接到的那个,通过取代配置文件的ALTER DATABASE
语句。
这就是为什么CREATE DATABASE
有效,但是一旦它与\c
连接到不同的数据库,会话的default_transaction_read_only
设置将转为ON
但当然这将是一个非常奇怪和不寻常的配置。
答案 1 :(得分:7)
前往pgexercises.com,他们能够帮助我。
我运行了这些命令(单独):
psql -U <username> -d postgres
begin;
set transaction read write;
alter database exercises set default_transaction_read_only = off;
commit;
\q
然后我从终端dropdb exercises
中删除了数据库并再次运行脚本psql -U <username> -f clubdata.sql -d postgres -x -q
答案 2 :(得分:0)
我遇到了cannot execute CREATE TABLE in a read-only transaction
,cannot execute DELETE TABLE in a read-only transaction
和其他人。
他们都跟随cannot execute INSERT in a read-only transaction
。就像在我的批处理过程中,连接已将自身切换为只读一样。
结果是,我的存储空间用完了!当数据库无法再写任何内容时,将禁用写访问权限。我在Azure上使用Postgres。我不知道如果在专用服务器上是否也会产生相同的效果。
答案 3 :(得分:0)
这种情况是在我在本地还原生产数据库时发生的,该数据库仍在从WAL记录进行联机恢复。
有些意外,因为我以为pgbackgrest正在创建可立即恢复的还原,也许不是。
91902 postgres 20 0 1445256 14804 13180 D 4.3 0.3 0:28.06 postgres: startup recovering 000000010000001E000000A5
答案 4 :(得分:0)
在我的例子中,我有一个主节点和复制节点,主节点变成了复制节点,我相信它将它切换到 hot_standby
模式。所以我试图将数据写入一个仅用于读取的节点,因此存在“只读”问题。
您可以使用 SELECT pg_is_in_recovery()
查询有问题的节点,如果它返回 True
,则它是“只读”的,我想您应该切换到使用您现在拥有的任何主节点。
我从:https://serverfault.com/questions/630753/how-to-change-postgresql-database-from-read-only-to-writable 获得此信息。 非常感谢克雷格林格!
答案 5 :(得分:0)
如果像我一样,您正在尝试在 heroku 上创建数据库并且在此消息显示在数据剪辑选项卡上时被卡住
我做到了,
Choose Resources from(Overview Resources Deploy Metrics Activity Access Settings)
Choose Settings out of (Overview, Durability, Settings, Dataclip)
Then in Administration->Database Credentials choose View Credentials...
然后打开终端并在此处填写该信息并输入
psql --host=***************.amazonaws.com --port=5432 --username=*********pubxl --password --dbname=*******lol
然后它会要求输入密码,从那里复制粘贴,然后你就可以运行 Postgres cmds。
答案 6 :(得分:0)
我对 Postgre
更新语句有同样的问题
SQL Error: 0, SQLState: 25006 ERROR: cannot execute UPDATE in a read-only transaction
通过运行以下查询验证 Database
访问,它将返回 true
或 false
SELECT pg_is_in_recovery()
true
-> 数据库只有读取权限
false
-> 数据库具有完全访问权限
如果返回 true,则与 DBA 团队联系以获取完全访问权限,并尝试在 ping
中使用 command prompt
并确保连接。
ping <database hostname or dns>
还要验证您是否有数据库的主节点和备用节点