【发布时间】: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