gpt4 book ai didi

postgresql - psql,无法将数据库内容复制到另一个 - 无法在事务 block 内运行 -

转载 作者:行者123 更新时间:2023-11-29 14:32:27 27 4
gpt4 key购买 nike

我想将本地机器的内容复制到远程机器(在 docker 中)。出于某种原因,它比我预期的要复杂:当我尝试将数据复制到远程数据时,我得到了这个 "ERROR: CREATE DATABASE cannot run inside a transaction block".

好的...所以我进入我的 docker 容器,在里面添加规则 \set AUTOCOMMIT。但我仍然收到此错误。

这是我执行的命令:

// backup
pg_dump -C -h localhost -U postgres woof | xz >backup.xz

然后在我的远程计算机上:

xz -dc backup.xz | docker exec -i -u postgres waf-postgres psql --set ON_ERROR_STOP=on --single-transaction

但是无论我尝试什么,每次我都得到这个“CREATE DATABASE cannot run inside a transaction block”。即使我将自动提交设置为“打开”。

这是我的问题:我不知道什么是事务 block 。而且我不明白为什么将一个数据库复制到另一个数据库需要如此痛苦:我的远程数据库是空的。那么,为什么会有这么多大惊小怪,为什么 psql 不能强制执行我想要的?

我的目标只是将本地数据库复制到远程数据库。

最佳答案

这里发生的事情是:您使用 -C 键添加 CREATE DATABASE 语句,然后尝试使用 运行 psql --单事务,所以脚本内容被包裹到BEGIN;...END;,这里不能使用CREATE DATABASE

因此 iether 删除 -C 并针对现有数据库运行 psql,或者删除 --single-transaction for psql。根据您真正需要的做出决定...

来自 man pg_dump:

-C

--create

Begin the output with a command to create the database itself and reconnect to the created database. (With a script of this form, it doesn't matter which database in the destination installation you connect to before running the script.) If --clean is also specified, the script drops and recreates the target database before reconnecting to it.

来自 man psql:

--single-transaction

This option can only be used in combination with one or more -c and/or -f options. It causes psql to issue a BEGIN command before the first such option and a COMMIT command after the last one, thereby wrapping all the commands into a single transaction. This ensures that either all the commands complete successfully, or no changes are applied.

关于postgresql - psql,无法将数据库内容复制到另一个 - 无法在事务 block 内运行 -,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49688128/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com