【问题标题】:how can I import a database by running just one command?如何只运行一个命令来导入数据库?
【发布时间】:2018-06-16 01:19:14
【问题描述】:

我尝试学习如何将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
$

【问题讨论】:

    标签: postgresql pg-restore


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。 “目标操作系统”是指运行 postgresql 服务器并且正在进行恢复的操作系统吗?如果是,则操作系统为 Lubuntu 18.04。为什么双命令方式没有语言环境问题?
    • 是的,这就是我所说的“目标操作系统”。我扩展了答案以解决您的不确定性。
    • 谢谢。是否可以修改 toc.dat 中的CREATE DATABASE 以使sudo -u postgres pg_restore -C -d postgres dvdrental.tar 工作?查看我的更新。
    • 转储文件的目录不能修改。
    • 谢谢。 “显式创建数据库是可行的,因为它使用了存在的语言环境。”在CREATE DATABASE dvdrental 之后,sudo -u postgres pg_restore -d dvdrental dvdrental.tar 是否在 tar 转储中读取并执行 toc.dat?如果执行toc.dat,那么到达CREATE DATABASE pagila WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'English_United States.1252' LC_CTYPE = 'English_United States.1252'; 时应该会出现同样的错误。如果不执行toc.dat,则转储将根本不会加载到新创建的数据库中。
    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 2015-08-29
    • 2017-09-22
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多