将本地postgresql数据库复制到远程数据库(两者都有密码)- 错误:选项“locale”无法识别。

18

使用 Postgres 12 / Windows 10 工作。

尝试使用以下命令将远程数据库复制到本地主机:

pg_dump -C -h remotehost -p 5432 -U postgres remotedb | psql -h localhost -p 5432 -U postgres localdb

CMD 请求输入密码两次。

Password for user postgres: Password:

我首先输入了 localhost,按 ENTER,然后再输入 remotehost 并再次按 ENTER。

我收到了下面的错误信息:

SET
SET
SET
SET
SET
 set_config
------------

(1 row)

SET
SET
SET
SET
ERROR:  option "locale" not recognized
LINE 1: ...ting" WITH TEMPLATE = template0 ENCODING = 'UTF8' LOCALE = '...
                                                             ^
ERROR:  database "remotedb" does not exist
\connect: FATAL:  database "remotedb" does not exist
pg_dump: error: could not write to output file: Broken pipe
  • 如何解决第一个错误:“选项“locale”未被识别”?
  • 第二个错误是否与我输入密码的方式有关?当两个数据库都要求密码时,我该如何操作?

1
谢谢@Abelisto!救了我的一天!!!删除“-C”并手动创建数据库完美地解决了问题,这与我输入密码的方式无关。 - rodolfo_r
3个回答

19

您不需要手动创建数据库。
您可以使用sedLOCALE替换为LC_COLLATE来编写一行命令:

您的命令应该像这样:
注意!仅当您使用脚本(纯文本)文件格式备份时,此方法才有效

pg_dump -C -h remotehost -p 5432 -U postgres remotedb |  sed 's/LOCALE/LC_COLLATE/' | psql -h localhost -p 5432 -U postgres localdb

解释:

脚本转储是包含用于重建数据库所需的 SQL 命令的纯文本文件。当您在 pg_dump 命令中添加 -C 标志时,转储文件将包含以下语句:

  • PostgreSQL 12 及更早版本

说明:

脚本转储是一种包含重建数据库所需 SQL 命令的纯文本文件。当您在 pg_dump 命令中添加 -C 标志时,此转储文件将包含以下语句:

  • PostgreSQL 12 和更早版本
CREATE DATABASE yourdb WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';
  • Postgres 13(数据库软件的版本号)
CREATE DATABASE yourdb WITH TEMPLATE = template0 ENCODING = 'UTF8' LOCALE = 'en_US.UTF-8';
通过使用sed,我们将LOCALE一词替换为LC_COLLATE在pg_dump流中,因此psql将能够在本地还原数据库。
即使缺少LC_CTYPE = 'en_US.UTF-8',这也可以正常工作。

太棒了,@Codrut! - rodolfo_r

7

这是由于我使用版本号为13.x的 pg_restore 连接到了11.x(目标)和10.x(来源)的数据库。

因此,我只需安装 pg_restore 10.x 版本即可。

brew install postgresql@10
/usr/local/opt/postgresql@10/bin/pg_restore --all-the-args-here

下次我会更加小心地使用 pg_restore 命令的 --create--clean 参数。

4

在测试了Abelisto的建议后,我找到了两个问题的答案:

问题1的答案

根据Abelisto的信息,postgres 12没有create database选项中的locale选项,而postgres 13有。

Postgres 12:postgresql.org/docs/12/sql-createdatabase.html

Postgres 13:postgresql.org/docs/13/sql-createdatabase.html

然后,在目标数据库上手动创建数据库并从命令中删除-C就可以解决这个问题。这是最终的命令:

pg_dump -h remotehost -p 5432 -U postgres remotedb | psql -h localhost -p 5432 -U postgres localdb

一个观察结果是,我安装了postgres 12和13,但是psql路径设置为postgres 13。因此,无论我尝试在postgres 12之间pg-dump,我都会得到locale错误,因为psql使用postgres 13运行命令。

问题2的答案

输入两个密码的过程是正确的:

  1. 目标数据库密码
  2. 按Enter键
  3. 源数据库密码
  4. 按Enter键

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接