错误:无法在只读事务中执行CREATE TABLE

时间:2015-07-02 13:48:07

标签: postgresql

我正在尝试在本地计算机中设置pgexercises数据。当我运行时:psql -U <username> -f clubdata.sql -d postgres -x我收到错误:psql:clubdata.sql:6: ERROR: cannot execute CREATE SCHEMA in a read-only transaction

为什么在本地计算机上创建只读数据库?我能改变一下吗?

7 个答案:

答案 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文件中ONpostgresql.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 transactioncannot 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 访问,它将返回 truefalse

SELECT pg_is_in_recovery()

true -> 数据库只有读取权限

false -> 数据库具有完全访问权限

如果返回 true,则与 DBA 团队联系以获取完全访问权限,并尝试在 ping 中使用 command prompt 并确保连接。

ping <database hostname or dns>

还要验证您是否有数据库的主节点和备用节点

相关问题