ChatGPT解决这个技术问题 Extra ChatGPT

将 SQL 转储导入 PostgreSQL 数据库

我们正在切换主机,旧主机提供了我们站点 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 语句失败了。查看导入的完整输出以找到它。

M
Matthias Braun
psql databasename < data_base_dump

这就是您要查找的命令。

注意:必须在导入前创建 databasename。看看PostgreSQL Docs Chapter 23. Backup and Restore


我试过 psql mydatabase < C:\database\db-backup.sql 但我收到错误 Invalid command \database。我也试过用“”围绕它。
@Dazz您必须从命令提示符 (Start -> Run -> cmd) 执行此命令,而不是从 postgres 提示符执行此命令。
如果我从 cmd 运行它,我会得到“'<' 运算符保留供将来使用。”
@Dazz:您也可以使用 -f 开关(或 --file
psql --username=postgres 数据库名 < data_base_dump.sql
G
Gabriel Ramirez

这是您要查找的命令。

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

很好,但最好还附加“-L logfile.log”参数以将输出记录在文件中。
得到这个“输入是 PostgreSQL 自定义格式转储。使用 pg_restore 命令行客户端将此转储恢复到数据库。”
您还可以:pg_restore -h hostname -d dbname -U username filename.sql
如何处理ERROR: duplicate key value violates unique constraint?当有重复键时,我希望 psql 忽略
在我的情况下,我在不同的端口上运行 postgres,所以我必须添加 -p 以及上面的命令
j
j0k

我相信你想在 psql 中运行:

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

不得不使用这个,因为 Emacs 的 eshell 不支持输入重定向。谢谢。
请务必先使用 \c 更改为数据库
如果你想给它一个相对路径,请使用 \ir。
我不知道为什么,但我不得不添加引号它有效。 test_db=# \i 'C:/Users/paude/Downloads/event_logic.dump'
k
kenorb

这对我有用:

sudo -u postgres psql db_name < 'file_path'

r
rockusbacchus

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

\i 'path/to/file.sql'

只要确保您已经连接到正确的数据库。此命令执行指定文件中的所有 SQL 命令。


这个解决方案对我有用,而投票最多的解决方案产生了“stdin is not a tty”错误。
正是我正在寻找的 - 一种从 psql 命令行内部执行脚本的方法。谢谢!
只是想感谢你这个。应包含在正确答案中。
这是正确的,不要在 Windows 的路径中使用反斜杠!
也适用于 Windows,您需要双斜杠
F
Feuda

效果很好,在命令行中,所有参数都是必需的,-W 用于密码

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

经过几次尝试,这个解决方案对我有用,指出了执行工作所需的所有信息:去哪里、数据库名称、用户、密码,当然还有文件。
N
Nemo

只是为了好玩,如果您的转储被压缩,您可以执行类似的操作

gunzip -c filename.gz | psql dbname

正如 Jacob 所提到的,PostgreSQL docs 很好地描述了这一切。


V
Vincent Tang

我尝试了许多不同的解决方案来恢复我的 postgres 备份。我在 MacOS 上遇到了权限被拒绝的问题,似乎没有解决方案有效。

这是我如何让它工作的:

Postgres 带有 Pgadmin4。如果您使用 macOS,您可以按 CMD+SPACE 并输入 pgadmin4 来运行它。这将在 chrome 中打开一个浏览器选项卡。

如果您在让 pgadmin4 工作时遇到错误,请在终端中尝试 killall pgAdmin4,然后重试。

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

1. 创建备份

通过右键单击数据库->“备份”来执行此操作

https://i.stack.imgur.com/2hQt9.png

2. 给文件命名。

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

https://i.stack.imgur.com/FyEZm.png

3.查看下载位置

屏幕右下角应该有一个弹出窗口。单击“更多详细信息”页面以查看您的备份下载到的位置

https://i.stack.imgur.com/5cXqM.png

4.找到下载文件的位置

在这种情况下,它是 /users/vincenttang

https://i.stack.imgur.com/vJiyy.png

5.从pgadmin恢复备份

假设您正确执行了步骤 1 到 4,您将拥有一个还原二进制文件。有时您的同事可能想在他们的本地计算机上使用您的还原文件。说过人去 pgadmin 并恢复

通过右键单击数据库->“恢复”来执行此操作

https://i.stack.imgur.com/bAUhb.png

6.选择文件查找器

确保手动选择文件位置,不要将文件拖放到 pgadmin 中的上传器字段中。因为你会遇到错误权限。相反,找到您刚刚创建的文件:

https://i.stack.imgur.com/0FL3F.png

7.找到所说的文件

您可能需要将右下角的过滤器更改为“所有文件”。之后从第 4 步开始查找文件。现在点击右下角的“选择”按钮进行确认

https://i.stack.imgur.com/woFcW.png

8.恢复所述文件

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

https://i.stack.imgur.com/i7cTv.png

9. 成功

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

10. 如果不成功:

如果第 9 步失败,请尝试删除数据库上的旧公共架构。转到“查询工具”

https://i.stack.imgur.com/bqmyP.png

执行此代码块:

DROP SCHEMA public CASCADE; CREATE SCHEMA public;

https://i.stack.imgur.com/BaHyr.png

现在再次尝试步骤 5 到 9,它应该可以解决

概括

当我遇到错误权限问题并且无法以超级用户身份登录时,这就是我必须在 Postgres 上备份/恢复备份的方式。或者使用 chmod 为文件夹设置读/写凭据。此工作流程适用于来自 pgadmin 的二进制文件转储默认值“自定义”。我假设 .sql 是相同的方式,但我还没有测试过


r
rubo77

确保创建了要导入的数据库,然后可以使用

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;"

A
AConsumer

按照步骤:

转到 psql shell \c db_name \i path_of_dump [eg:-C:/db_name.pgsql]


V
Vajira Lasantha

我用:

cat /home/path/to/dump/file | psql -h localhost -U <user_name> -d <db_name>

希望这会对某人有所帮助。


d
davidauza.engineer

如果您使用的是带有 .dump 扩展名的文件,请使用:

pg_restore -h hostname -d dbname -U username filename.dump


K
Kiryl Plyashkevich

我注意到许多示例对于 localhost 来说过于复杂,其中在许多情况下只存在没有密码的 postgres 用户:

psql -d db_name -f dump.sql

V
Vanessa MacDougal

您可以在 pgadmin3 中执行此操作。删除您的转储包含的架构。然后右键单击数据库并选择还原。然后您可以浏览转储文件。


但即使在选择 .sql 文件后,“恢复”按钮也无法点击。该软件似乎需要某种其他类型的文件 - 具有 *.backup 格式的文件。单击该导入框上的“帮助”是指 pg_restore -“...用于从 pg_dump 创建的非纯文本格式之一的存档中恢复 PostgreSQL 数据库的实用程序。” OP 引用的 sql 文件是纯文本格式。
b
burney

PostgreSQL12

来自 sql 文件:pg_restore -d 数据库 < file.sql

来自自定义格式文件:pg_restore -Fc 数据库 < file.dump


M
Mohd Tauovir Khan

我有超过 100MB 的数据,因此我无法使用 Pgadmin4 恢复数据库。

我只使用了 postgres 客户端,并在下面写了命令。

postgres@khan:/$ pg_restore -d database_name /home/khan/Downloads/dump.sql

它工作得很好,花了几秒钟。您可以查看下面的链接以获取更多信息。 https://www.postgresql.org/docs/8.1/app-pgrestore.html