Postgresql 如何仅通过运行一个命令导入数据库?

Postgresql 如何仅通过运行一个命令导入数据库?,postgresql,pg-restore,Postgresql,Pg Restore,我试图学习如何导入PostgreSQL 我的尝试失败了,我使用了pg_restore-C-d…要在一个命令中将创建新数据库和从文件导入新数据库结合起来,请执行以下操作: $ sudo -u postgres pg_restore -C -d postgres dvdrental.tar pg_restore: [archiver (db)] Error while PROCESSING TOC: pg_restore: [archiver (db)] Error from TOC entry

我试图学习如何导入PostgreSQL

我的尝试失败了,我使用了
pg_restore-C-d…
要在一个命令中将创建新数据库和从文件导入新数据库结合起来,请执行以下操作:

$ sudo -u postgres pg_restore -C -d postgres dvdrental.tar 
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2194; 1262 17355 DATABASE pagila postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  invalid locale name: "English_United States.1252"
    Command was: CREATE DATABASE pagila WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'English_United States.1252' LC_CTYPE = 'English_United States.1252';            
pg_restore: [archiver (db)] could not execute query: ERROR:  database "pagila" does not exist
    Command was: ALTER DATABASE pagila OWNER TO postgres;        
pg_restore: [archiver (db)] could not reconnect to database: FATAL:  database "pagila" does not exist
我的问题是:

  • 我想知道为什么我的第一次尝试失败了

  • 有没有办法只运行一个命令

文件说:

-C --创造

在还原到数据库之前创建数据库。如果还指定了--clean,请在之前删除并重新创建目标数据库 连接到它

甚至提供一个例子:

假设我们已将名为mydb的数据库转储为自定义格式 转储文件:

$ pg_dump -Fc mydb > db.dump
要删除数据库并从转储重新创建它,请执行以下操作:

$ dropdb mydb
$ pg_restore -C -d postgres db.dump
在-d开关中命名的数据库可以是中存在的任何数据库 集群;pg_restore仅用于发出创建数据库的命令 用于mydb的命令。使用-C时,数据总是恢复到 出现在转储文件中的数据库名称

谢谢


更新:

再次感谢。我发现转储文件中的二进制文件
toc.dat
包含

CREATE DATABASE pagila WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'English_United States.1252' LC_CTYPE = 'English_United States.1252';`
是否可以修改它使sudo-u postgres pg_restore-C-d postgres dvdreent.tar工作


请注意,我有一个工作解决方案:

psql
中单独创建新数据库,并从文件导入新数据库:

template1=# CREATE DATABASE dvdrental;
CREATE DATABASE

$ sudo -u postgres pg_restore -d dvdrental dvdrental.tar
$

您的导入失败,因为您尝试导入转储的操作系统不知道区域设置
English_UnitedStates.1252
。操作系统不是Windows,或者Windows没有安装该区域设置

pg_restore-C
尝试以与原始系统相同的方式创建数据库,这是不可能的。显式创建数据库是有效的,因为它使用的是现有的区域设置


要使
CREATE DATABASE
命令成功,除了存在区域设置外,没有其他方法,因此如果不可能,您必须运行两个命令来恢复转储。

谢谢。“目标操作系统”是指运行postgresql server并进行恢复的操作系统吗?如果是,则操作系统为Lubuntu 18.04。为什么这两种命令方式没有语言环境问题?是的,这就是我对“目标操作系统”的意思。我扩展了答案以解决您的不确定性。谢谢。是否可以修改toc.dat中的
CREATE DATABASE
,使
sudo-u postgres pg\u restore-C-d postgres dvdreast.tar
工作?请参阅我的更新。无法修改转储文件的目录。谢谢。“显式创建数据库之所以有效,是因为它使用了一个存在的区域设置。”在
创建数据库dvdreart
之后,
sudo-u postgrestore-d dvdreart dvdreart.tar
是否在tar转储中读取并执行
toc.dat
?如果执行了
toc.dat
,则在使用TEMPLATE=template0 ENCODING='UTF8'LC_COLLATE='English_used.1252'LC_CTYPE='English_used.1252'到达
CREATE DATABASE pagila时,应该会出现相同的错误。如果未执行
toc.dat
,则转储将根本不会加载到新创建的数据库中。