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

时间:2018-06-16 01:19:14

标签: postgresql pg-restore

我尝试学习如何将a database导入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仅使用它来发出CREATE DATABASE   命令为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 dvdrental.tar有效?

请注意,我有一个有效的解决方案:

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

template1=# CREATE DATABASE dvdrental;
CREATE DATABASE

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

1 个答案:

答案 0 :(得分:3)

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

pg_restore -C尝试以与原始系统相同的方式创建数据库,这是不可能的。显式创建数据库是有效的,因为它使用了存在的语言环境。

除了让语言环境存在外,没有办法让CREATE DATABASE命令成功,所以如果不可能,你必须运行两个命令来恢复转储。