将SQL转储文件导入到PostgreSQL数据库中

677
我们正在更换主机,旧主机提供了我们网站的PostgreSQL数据库的SQL转储文件。
现在,我正在尝试在本地WAMP服务器上设置此数据库以进行测试。
唯一的问题是我不知道如何将这个数据库导入我已经设置好的PostgreSQL 9。
我尝试了pgAdmin III,但似乎找不到“导入”功能。所以我只能打开SQL编辑器,将导出的内容粘贴在那里并执行它,它会创建表格,但在尝试放置数据时会不断出现错误。
ERROR:  syntax error at or near "t"
LINE 474: t 2011-05-24 16:45:01.768633 2011-05-24 16:45:01.768633 view...

The lines:
COPY tb_abilities (active, creation, modtime, id, lang, title, description) FROM stdin;
t   2011-05-24 16:45:01.768633  2011-05-24 16:45:01.768633  view    nl ...  

我也尝试使用命令提示符来完成这个任务,但是我找不到需要的命令。

如果我执行

psql mydatabase < C:/database/db-backup.sql;

我遇到了错误

ERROR:  syntax error at or near "psql"
LINE 1: psql mydatabase < C:/database/db-backu...
        ^

最佳的数据库导入方式是什么?


我遇到了与你第一个错误类似的问题:ERROR: syntax error at or near "t"。后来发现我只导入了部分模式,因此脚本中早期的 CREATE TABLE 语句失败了。请查看完整的导入输出以找到它。 - owensmartin
21个回答

1015

2
我尝试过使用命令 psql mydatabase < C:\database\db-backup.sql ,但出现了错误“无效命令 \database”。我还尝试在其周围加上引号,但结果依然失败。 - dazz
32
你需要在命令提示符中执行这个命令(开始 -> 运行 -> cmd),而不是在postgres提示符中执行。 - Jacob
5
如果我从命令提示符中运行它,会出现“'< ' 运算符是保留用于将来使用的”错误提示。 - dazz
4
你可以使用-f开关(或者--file)进行操作。 - Grzegorz Szpetkowski
71
使用psql命令可以将 data_base_dump.sql 文件中的数据导入到指定的 databasename 数据库中。命令格式为:psql --username=postgres databasename < data_base_dump.sql。其中,--username参数用于指定数据库用户,databasename为目标数据库名称,<符号表示从文件中读取输入数据。 - Maxence
显示剩余12条评论

533

这就是您要寻找的命令。

psql -h hostname -d databasename -U username -f file.sql

50
好的,但最好还要添加“-L logfile.log”参数以便将输出记录到文件中。 - zerologiko
3
输入是一个PostgreSQL自定义格式的转储文件。 使用pg_restore命令行客户端将此转储文件还原到数据库中。 - Wajdan Ali
16
您也可以使用以下命令:pg_restore -h 主机名 -d 数据库名 -U 用户名 文件名.sql - Fábio Araújo
1
如何处理“ERROR: duplicate key value violates unique constraint”?我希望psql在出现重复键时忽略它。 - gogofan
在我的情况下,我正在不同端口上运行postgres,因此我必须在上面的命令中添加 -p <端口号>。 - raj03

163

我认为您希望在psql中运行:

\i C:/database/db-backup.sql

不得不使用这个,因为Emacs的eshell不支持输入重定向。谢谢。 - duma
7
请确保先使用命令 \c <database_name> 切换到指定的数据库。 - hkong
使用 \ir 如果你想要给它一个相对路径。 - Yordan Grigorov
我不知道为什么,但我必须添加引号才能使其工作。test_db =#\ i'C:/ Users / paude / Downloads / event_logic.dump' - Badri Paudel

77

那对我有用:

sudo -u postgres psql db_name < 'file_path'

导入Postgres数据库后,所有表格都出现错误:唯一性冲突:7 ERROR:重复键值违反唯一约束条件。有什么解决方法吗? - N.S
你确定你的记录有唯一的键吗?也许你已经在数据库中有相同键的记录了? - ivanacorovic

68

我不确定这是否适用于提问者的情况,但是我发现在交互式控制台中运行以下命令对我来说是最灵活的解决方案:

\i 'path/to/file.sql'

请确保已经连接到正确的数据库。该命令将执行指定文件中的所有SQL命令。


2
这个解决方案对我有效,而得票最高的解决方案却出现了“stdin不是tty”的错误。 - 김민준
正是我所需要的 - 一种从psql命令行内执行脚本的方法。谢谢! - anaotha
只是想感谢您的这个回答。应该包含在正确的答案中。 - PKHunter
这是正确的,不要在Windows路径中使用反斜杠! - Erdinc Ay
同样适用于Windows,你需要使用双斜杠。 - CMAS
这重复了@ArranUbels三年前的答案。 - questionto42

58

工作得相当不错,在命令行中,所有参数都是必需的,-W 用于密码

psql -h localhost -U user -W -d database_name -f path/to/file.sql

1
经过几次尝试,这个解决方案为我工作了,指出了执行作业所需的所有信息:目标位置、数据库名称、用户、密码和当然文件。 - eduardosufan

28

只是为了好玩,如果您的数据转储文件被压缩了,您可以执行以下操作:

gunzip -c filename.gz | psql dbname

正如Jacob所提到的,PostgreSQL文档对此进行了详细描述。


21
我尝试了多种不同的方法来恢复我的postgres备份。在MacOS上,我遇到了权限被拒绝的问题,没有任何解决方案似乎起作用。
这是我让它工作的方法:
Postgres附带了Pgadmin4。如果您使用macOS,可以按下CMD+SPACE并键入pgadmin4来运行它。这将在Chrome浏览器中打开一个选项卡。
如果在使用pgadmin4时遇到错误,请尝试在终端中运行killall pgAdmin4,然后再次尝试。

获取pgadmin4 + 备份/恢复的步骤

1. 创建备份

右键单击数据库,选择“备份”进行备份。

enter image description here

2. 给文件命名。

例如test12345。点击备份。这将创建一个二进制文件转储,不是.sql格式。

enter image description here

3. 查看下载位置

屏幕右下角应该会弹出一个弹窗。点击“更多详情”页面,查看您的备份下载到哪里了。

enter image description here

4. 查找已下载文件的位置

在此情况下,它是 /users/vincenttang

enter image description here

5. 从pgadmin还原备份

假设您已正确执行步骤1到4,那么您将拥有一个还原二进制文件。也许会有一天,您的同事想在他们的本地计算机上使用您的还原文件。请让该人前往pgadmin并进行还原操作。

右键单击数据库,选择“还原”即可。

enter image description here

6. 选择文件查找器

请务必手动选择文件位置,不要将文件拖放到pgadmin的上传字段中。否则,您可能会遇到权限错误。相反,请查找您刚创建的文件:

enter image description here

7. 寻找所需文件

你可能需要在右下角更改筛选器为“所有文件”。从第4步开始寻找所需文件。现在点击右下角的“选择”按钮以确认选择。

enter image description here

8. 恢复所述文件

您将再次看到此页面,并选择文件的位置。请继续恢复它。

enter image description here

9. 成功

如果一切顺利,右下角应该会弹出一个指示器,显示恢复成功。您可以转到表格查看每个表格上的数据是否已正确恢复。

10. 如果没有成功:

如果第9步失败,请尝试删除数据库中的旧公共模式。前往“查询工具”。

enter image description here

执行此代码块:

DROP SCHEMA public CASCADE; CREATE SCHEMA public;

enter image description here

现在请再尝试一遍第5至9步骤,应该会成功。

总结

当我在Postgres上备份/恢复备份时遇到权限问题而无法以超级用户身份登录或使用chmod为文件夹设置读/写凭据时,我必须按照以下流程操作。此工作流适用于pgadmin默认的“定制”二进制文件转储。我认为.sql也是同样的方式,但我还没有测试过。


那不是大型数据库文件的好解决方案。 - Bruno Ribeiro

20

确保你想要导入的数据库已经被创建,然后你可以使用

<import>

命令来导入该文件。


sudo -u postgres -i psql testdatabase < db-structure.sql

如果你想完全覆盖数据库,首先要删除数据库。

# be sure you drop the right database !!!
#sudo -u postgres -i psql -c "drop database testdatabase;"

然后使用相同的方法重新创建

sudo -u postgres -i psql -c "create database testdatabase;"

这个命令中的-i选项有什么功能? - Hamid Rasti
请查看man sudo,它与--login是相同的。 - rubo77

18

按照以下步骤操作:

  1. 进入psql shell
  2. \c 数据库名称
  3. \i 导入文件路径 [例如:-C:/数据库名称.pgsql]

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