我想将本地计算机的内容复制到远程计算机(在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都无法在事务块中运行"无论我尝试什么。即使我把自动提交设置为" on"。
这是我的问题:我不知道交易块是什么。而且我不明白为什么将一个数据库复制到另一个数据库需要非常痛苦:我的远程数据库是空的。那么为什么有这么多大惊小怪为什么psql不能强迫我想要的呢?
我的目标只是将我的本地数据库复制到远程数据库。
答案 0 :(得分:2)
这里发生的事情是:您使用CREATE DATABASE
密钥添加-C
语句,然后尝试使用psql
运行--single-transaction
,因此脚本的内容将包装到{{ 1}},您无法使用BEGIN;...END;
因此,请删除CREATE DATABASE
并针对现有数据库运行-C
,或删除psql
--single-transaction
。根据你真正需要的东西做出决定......
来自psql
:
-C
- 创建
使用命令开始输出以创建数据库本身并重新连接到创建的数据库。 (用这个脚本 表单,目标安装中的哪个数据库并不重要 你以前连接过 运行脚本。)如果还指定了--clean,脚本将在重新连接之前删除并重新创建目标数据库 它
来自man pg_dump
:
- 单交易
此选项只能与一个或多个-c和/或-f选项组合使用。它导致psql发出BEGIN命令 在第一个这样的选项之前和最后一个之后的COMMIT命令,从而将所有命令包装成一个 交易。这可以确保所有命令都成功完成,或者不应用任何更改。