55

我有一个带有.SQL扩展名的转储文件(实际上它是一个纯文本 SQL 文件)。我想将它恢复到我创建的数据库中。我正在使用pgAdmin III,当我使用它的“恢复向导”时,它不会突出显示“恢复”按钮。相反,它需要一个.backup文件扩展名。

我尝试使用 shell 命令来恢复转储,但它仍然不起作用。

我是这方面的新手。如果有人可以帮助我,我将不胜感激。

编辑

当我坐在 newTestDB 时,我对 PostGres 的 Shell SQL 窗格使用了以下命令。

newTestDB-# \i E:\db-rbl-restore-20120511_Dump-20120514.sql

它仍然给出了同样的错误(“权限被拒绝”)。

提升权限后,它只显示 PostgreSQL 的默认表:

      List of tablespaces
Name       |  Owner   | Location
-----------+----------+----------
pg_default | postgres |
pg_global  | postgres |

(2 rows)

我不知道如何从 SQL 文件导入/恢复数据库。

4

7 回答 7

56

你没有提到你的备份是如何制作的,所以一般的答案是:通常使用该psql工具。

根据pg_dump指示转储的内容,SQL 文件可以有不同的 SQL 命令集。例如,如果您指示pg_dump使用--cleanand转储数据库--schema-only,则不能指望能够从该转储中恢复数据库,因为不会有用于 COPYing(或 INSERTing,如果--inserts使用)表中的实际数据的SQL 命令. 像这样的转储将只包含 DDL SQL 命令,并且能够重新创建模式但不能重新创建实际数据。

使用以下命令恢复典型的 SQL 转储psql

psql (connection options here) database  < yourbackup.sql

或者从psql会话中,

psql (connection options here) database
database=# \i /path/to/yourbackup.sql

对于使用pg_dump -Fc(“自定义格式”)进行的备份,它不是普通的 SQL 文件而是压缩文件,您需要使用该pg_restore工具。

如果您正在使用类 unix,请尝试以下操作:

man psql
man pg_dump
man pg_restore

否则,请查看html 文档。祝你好运!

于 2012-05-25T20:46:33.580 回答
23

您在命令行尝试的问题psql是斜线的方向:

newTestDB-# /i E:\db-rbl-restore-20120511_Dump-20120514.sql   # incorrect
newTestDB-# \i E:/db-rbl-restore-20120511_Dump-20120514.sql   # correct

需要明确的是,psql命令以反斜杠开头,因此您应该使用 put\i代替。由于您的错字而发生的事情是psql忽略了所有内容,直到找到第一个\,恰好是紧随其后的db,并且\db恰好是列出表空间psql的命令,因此输出是表空间列表。正如您所说,它不是“PostgreSQL 的默认表”列表。

此外,无论操作系统如何,似乎都psql希望filepath参数使用正斜杠分隔目录(因此在 Windows 上这将是违反直觉的)。

值得注意的是,您“提升权限”的尝试与您尝试执行的命令的结果无关。此外,您没有说明是什么导致了所谓的“权限被拒绝”错误。

最后,转储文件的扩展名无关紧要,实际上您甚至不需要扩展名。确实,在选择备份文件名时pgAdmin会建议.backup扩展名,但实际上您可以将其设置为您想要的任何内容,包括根本没有扩展名。问题是pgAdmin似乎只允许“恢复”“自定义或 tar”或“目录”转储(至少在应用程序的 MAC OS X 版本中是这种情况),所以只需使用psql \i如上所示的命令。

于 2013-05-10T18:23:59.703 回答
20

通过使用pg_restore命令,您可以恢复 postgres 数据库

首开终端类型

sudo su postgres

创建新数据库

createdb [数据库名称] -O [所有者]

createdb test_db [-O openerp]

pg_restore -d [数据库名称] [转储文件的路径]

pg_restore -d test_db /home/sagar/Download/sample_dbump

等待数据库恢复完成。

请记住,转储文件应该具有读取、写入、执行权限,因此您可以应用 chmod 命令

于 2014-11-18T12:35:54.040 回答
8

1.打开终端。

2.使用以下命令备份您的数据库

你的 postgres bin - /opt/PostgreSQL/9.1/bin/

您的源数据库服务器 - 192.168.1.111

您的备份文件位置和名称 - /home/dinesh/db/mydb.backup

您的源数据库名称 - mydatabase

/opt/PostgreSQL/9.1/bin/pg_dump --host '192.168.1.111' --port 5432 --username "postgres" --no-password --format custom --blobs --file "/home/dinesh/db /mydb.backup" "我的数据库"

3.restore mydb.backup 文件到目的地。

您的目标服务器 - 本地主机

您的目标数据库名称 - mydatabase

创建用于恢复备份的数据库。

/opt/PostgreSQL/9.1/bin/psql -h 'localhost' -p 5432 -U postgres -c "CREATE DATABASE mydatabase"

恢复备份。

/opt/PostgreSQL/9.1/bin/pg_restore --host 'localhost' --port 5432 --username "postgres" --dbname "mydatabase" --no-password --clean "/home/dinesh/db/mydb.备份”

于 2013-10-11T06:19:33.810 回答
6

结合 MartinP 和 user664833 的建议,我也能够让它工作。需要注意的是,通过选择插件从 pgAdmin GUI 工具输入 psql...PSQL 控制台设置 psql 会话的凭据和权限级别,因此您必须对表具有管理员或 CRUD 权限,并且可能还对数据库具有管理员权限(不要肯定知道)。然后在 psql 控制台中的命令将采用以下形式:

postgres=# \i driveletter:/folder_path/backupfilename.backup

其中postgres=#是 psql 提示符,不是命令的一部分。

.backup 文件将包含用于创建表的命令,因此您可能还会在文件中获得“ALTER TABLE ...”命令,这些命令会被执行但报告为错误。我想您总是可以在运行还原之前删除这些命令,但是将它们保留在那里可能比抱歉更安全,因为这些不太可能导致数据还原失败。但请始终检查以确保您想要恢复的数据确实到达那里。(对不起,如果这看起来像是对任何人的傲慢的建议,但无论他们从事这些事情多久,任何人都可能会发生疏忽——同事、电话等的片刻分心,而且很容易忘记这一步。我在职业生涯的早期使用其他数据库自己完成过,并且想知道“哎呀,

于 2014-03-10T15:53:12.273 回答
0

You might need to set permissions at the database level that allows your schema owner to restore the dump.

于 2012-07-29T22:21:18.743 回答
0

我发现 psql.exe 对斜线方向非常挑剔,至少在 Windows 上(如上图所示)。

这是一个例子。在 cmd 窗口中:

C:\Program Files\PostgreSQL\9.2\bin>psql.exe -U postgres
psql (9.2.4)
Type "help" for help.

postgres=# \i c:\temp\try1.sql    
c:: Permission denied
postgres=# \i c:/temp/try1.sql
CREATE TABLE
postgres=#

当我在通话中使用“普通”窗口斜杠时,您会看到它失败了\i。但是,如果您将它们作为输入参数传递给 ,则两种psql.exe斜线样式都可以工作,例如:

C:\Program Files\PostgreSQL\9.2\bin>psql.exe -U postgres -f c:\TEMP\try1.sql
CREATE TABLE

C:\Program Files\PostgreSQL\9.2\bin>psql.exe -U postgres -f c:/TEMP/try1.sql
CREATE TABLE

C:\Program Files\PostgreSQL\9.2\bin>
于 2013-05-14T18:10:14.060 回答