使用命令行还原Postgres备份文件?


294

我是Postgresql的新手,在本地,我使用pgadmin3。但是,在远程服务器上,我没有那么奢侈。

我已经创建了数据库的备份并将其复制,但是,有没有办法从命令行恢复备份?我只看到与GUI或pg_dumps相关的内容,因此,如果有人可以告诉我该怎么做,那就太好了!

Answers:


365

有两种工具可供选择,具体取决于创建转储文件的方式。

您的第一个参考来源应该是手册页,pg_dump(1)因为手册页是创建转储本身的原因。它说:

转储可以脚本或存档文件格式输出。脚本转储是纯文本文件,其中包含将数据库重建到保存时所处状态所需的SQL命令。要从此类脚本还原,请将其提供给psql(1)。脚本文件甚至可以在其他机器和其他体系结构上用于重建数据库。甚至在其他SQL数据库产品上也进行了一些修改。

备用存档文件格式必须与pg_restore(1)一起使用才能重建数据库。它们允许pg_restore对恢复什么有选择性,甚至可以在恢复之前对项目进行重新排序。存档文件格式设计为可跨体系结构移植。

因此,取决于转储的方式。您可能可以使用出色的file(1)命令来弄清楚-如果它提到ASCII文本和/或SQL,则应使用还原它,psql否则您应该使用pg_restore

恢复非常容易:

psql -U username -d dbname < filename.sql

-- For Postgres versions 9.0 or earlier
psql -U username -d dbname -1 -f filename.sql

要么

pg_restore -U username -d dbname -1 filename.dump

查阅各自的联机帮助页-有很多影响还原工作方式的选项。在还原之前,您可能必须清理“活动”数据库或从template0(如注释中指出)重新创建它们,具体取决于转储的生成方式。


3
您几乎总是要将IME还原到从template0新创建的数据库中。否则,如果您执行了诸如激活template1中的plpgsql之类的操作,则还原过程将再次尝试执行此操作,并且建议使用-1开关表示整个事务将失败。因此,类似“ createdb -T template0 seo2”和“ pg_restore -v -d seo2 seo.pg”的操作将seo.pg(由seo数据库制成)还原到新的seo2数据库中。如果您的备份文件只是一个.sql文件,则可以手动修剪其中的冲突位。
araqnid 2010年

61
你不能-d-f在同一时间。pg_restore: options -d/--dbname and -f/--file cannot be used together
CppLearner

8
在9.2版中,“-f”选项指定输出文件,而不是转储文件(在较早的版本中含义可能相同)。
大卫·瑞斯尼克

4
关于cannot be used together,请参阅此处:stackoverflow.com/questions/27882070/…–
阿卜杜勒

3
@ Alex78191表示它作为单个事务执行,这可能会完全失败并回滚,或者通过。它还将阻止对数据库的某些访问。
ATN

216

创建备份

pg_dump -h localhost -p 5432 -U postgres -F c -b -v -f 
"/usr/local/backup/10.70.0.61.backup" old_db

-F c是自定义格式(已压缩,并且可以与-j N并行执行)-b是blob,-v是详细信息,-f是备份文件名

从备份还原

pg_restore -h localhost -p 5432 -U postgres -d old_db -v 
"/usr/local/backup/10.70.0.61.backup"

设置-h localhost-选项很重要


2
我想提一提,在执行这些命令之前,您应该位于Posgresql bin文件夹中。例如,在Windows中(如果您将其安装在默认文件夹中)将为C:\ Program Files \ PostgreSQL \ 9.6 \ bin
juan_carlos_yl

90

您可能需要以身份登录postgres才能在数据库上拥有全部权限。

su - postgres
psql -l                      # will list all databases on Postgres cluster

pg_dump / pg_restore

  pg_dump -U username -f backup.dump database_name -Fc 

切换-F指定备份文件的格式:

  • c 将使用自定义的PostgreSQL格式,该格式将被压缩并导致最小的备份文件大小
  • d 用于每个文件是一个表的目录
  • t 用于TAR存档(大于自定义格式)
  • -h/ --host指定运行服务器的计算机的主机名
  • -W/ --password强制pg_dump在连接数据库之前提示输入密码

恢复备份:

   pg_restore -d database_name -U username -C backup.dump

参数-C应在导入数据之前创建数据库。如果它不起作用,您可以随时创建数据库,例如。使用命令(作为postgres具有创建数据库权限的用户或其他帐户)createdb db_name -O owner

pg_dump / psql

如果您未指定参数,-F则使用默认的纯文本SQL格式(或-F p)。那你就不能使用pg_restore。您可以使用导入数据psql

备用:

pg_dump -U username -f backup.sql database_name

恢复:

psql -d database_name -f backup.sql

我使用“ psql -d database_name -f backup.sql”命令恢复了我从DigitalOcean上的dokku转储的数据库。很棒。
NineBlindEyes

1
当使用psql时,如果您的用户(例如postgres)设置了密码,-W则应使用option。例如,在Ubuntu上无需在su postgres终端上执行任何操作,$ psql -h localhost -U postgres -W -d DB_NAME < DB_BACKUP.sql该命令对我有用,可在本地主机上还原备份。请注意,该-h选项是必需的。
Jignesh Gohel

@JiggneshhGohel正如手册所述:-W选项从来都不是必不可少的。pg_dump如果服务器要求密码验证,将自动提示输入密码。PGPASSWORD如果您使用的是纯文本密码,也可以使用env变量。-h如果默认设置PGHOST不适用,则为必需。这些选项对于许多PostgreSQL utils都是通用的,因此对于回答这个问题不是必需的(它在很大程度上取决于您的设置)。
Tombart

@Tombart您的第二个选择pg_dump/psql部分对我有用。但是第一部分pg_dump/pg_restore对我来说无法恢复。谢谢。
安妮·比斯瓦斯

@AnjanBiswas第一个选择是使用压缩存档,这将需要更多的CPU,但是备份文件将占用更少的磁盘空间。您只需要选择适当的压缩率即可,例如-Fc
Tombart

60

PostgreSQL 9.1.12

倾倒:

pg_dump -U user db_name > archive_name.sql

输入用户密码,然后按Enter。

恢复:

psql -U user db_name < /directory/archive.sql

输入用户密码,然后按Enter。


31

以下是我pg_dump用来还原数据库的版本:

pg_restore -h localhost -p 5432 -U postgres -d my_new_database my_old_database.backup

或使用psql

psql -h localhost -U postgres -p 5432 my_new_database < my_old_database.backup

其中,-h主机,-p端口,-u登录用户名,-d数据库的名称


2
Govind Singh,您为什么要编辑我的答案?更改..带来什么新东西
Yahor中号

1
my_new_database使用时应该已经存在psql,不是吗?
Elmex80s

22

使用GZIP备份和还原

对于较大的数据库,这非常好

后备

pg_dump -U user -d mydb | gzip > mydb.pgsql.gz

恢复

gunzip -c mydb.pgsql.gz | psql dbname -U user

https://www.postgresql.org/docs/9.1/static/backup-dump.html


1
对于ubuntu,您可以使用:gunzip -c mydb.pgsql.gz | sudo -u postgres psql获得对数据库进行操作的权限。--clean在转储时还要考虑该标志,该标志将擦除所有现有数据,可能会派上用场。
塞巴斯蒂安

为我工作出色而整洁的解决方案。谢谢!
Nam G VU


8

这为我工作:

pg_restore --verbose --clean --no-acl --no-owner --host=localhost --dbname=db_name --username=username latest.dump

谢谢,--no-owner真的帮助了我。
bonafernando

7

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”-无密码--format custom --blobs --file“ / home / dinesh / db /mydb.backup“” mydatabase“

3.将mydb.backup文件恢复到目标位置。

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

您的目标数据库名称-mydatabase

创建用于还原备份的数据库。

/opt/PostgreSQL/9.1/bin/psql -h'localhost'-p 5432 -U postgres -c“创建数据库mydatabase”

恢复备份。

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


4

如果使用pg_dump创建备份,则可以通过以下方式轻松还原它:

  1. 打开命令行窗口
  2. 转到Postgres bin文件夹。例如: cd "C:\ProgramFiles\PostgreSQL\9.5\bin"
  3. 输入命令以还原数据库。 For example: psql.exe -U postgres -d YourDatabase -f D:\Backup\.sql
  4. 为您的postgres用户输入密码
  5. 检查还原过程

4

1)打开psql终端。

2)解压/解压转储文件。

3)创建一个空数据库。

4)使用以下命令还原.dump文件

<database_name>-# \i <path_to_.dump_file>




2

恢复postgres备份文件取决于您首先如何进行备份。

如果您将pg_dump与-F c或-F d一起使用,则需要使用pg_restore,否则可以使用

psql -h localhost -p 5432 -U postgres <备份文件

9种备份和还原Postgres数据库的方法


您是否意识到您错过了数据库名称部分,并且会抱怨目标数据库不存在?
佩雷


2

对不起,死灵邮筒,但是这些解决方案对我不起作用。我正在使用postgres10。在Linux上:

  1. 我必须将目录更改为pg_hba.conf。
  2. 我不得不从同行到MD5编辑该文件以改变方法说明这里
  3. 重新启动服务: service postgresql-10 restart
  4. 更改目录到我的backup.sql所在的位置并执行:
    psql postgres -d database_name -1 -f backup.sql

    -database_name是我的数据库的名称

    -backup.sql是我的.sql备份文件的名称。


1

我在运行pg_dump时遇到身份验证问题,所以我移动了转储文件

mv database_dump /tmp

进入临时目录,然后运行

su -u postgres
cd /tmp
pg_restore database_dump

如果您的数据库转储很大,则可能只想创建另一个目录,您的当前用户和postgres用户可以访问该目录,并将数据库转储文件放入其中。


1

如果您有备份SQL文件,则可以轻松还原它。只需按照下面的说明进行操作

1. At first, create a database using pgAdmin or whatever you want (for example my_db is our created db name)
2. Now Open command line window
3. Go to Postgres bin folder. For example:  cd "C:\ProgramFiles\PostgreSQL\pg10\bin"
4. Enter the following command to restore your database: psql.exe -U postgres -d my_db -f D:\Backup\backup_file_name.sql 

如果需要,为您的postgres用户键入密码,然后让Postgres完成其工作。然后,您可以检查还原过程。


0

如果要备份数据或从备份还原数据,则可以运行以下命令:

  1. 要创建数据备份,请转到您的postgres \ bin \目录C:\programfiles\postgres\10\bin\,然后键入以下命令:

    pg_dump -FC -U ngb -d ngb -p 5432 >C:\BACK_UP\ngb.090718_after_readUpload.backup
  2. 要从备份恢复数据,请转到您的postgres \ bin \目录C:\programfiles\postgres\10\bin\,然后键入以下命令:

    C:\programFiles\postgres\10\bin> pg_restore -Fc -U ngb -d ngb -p 5432 <C:\ngb.130918.backup

    请确保备份文件存在。


-3

参见下面的示例

C:/ Program Files / PostgreSQL / 9.4 / bin \ pg_restore.exe --host localhost --port 5432 --username“ postgres” --dbname“ newDatabase” --no-password --verbose

C:\ Users \ Yogesh \ Downloads \ new Download \ DB.backup

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.