使用命令行恢复postgres备份文件?

Twi*_*Kit 238 postgresql backup command-line restore

我是postgresql的新手,在本地,我使用的是pgadmin3.然而,在远程服务器上,我没有这样的奢侈品.

我已经创建了数据库的备份并将其复制了,但是,有没有办法从命令行恢复备份?我只看到与GUI或pg_dumps相关的东西,所以,如果有人能告诉我如何去做,那就太棒了!

Ste*_*ker 297

根据您创建转储文件的方式,有两种工具可供查看.

您的第一个引用源应该是手册页,pg_dump(1)因为这是创建转储本身的原因.它说:

转储可以以脚本或归档文件格式输出.脚本转储是纯文本文件,包含将数据库重建为保存时所处状态所需的SQL命令.要从这样的脚本恢复,请将其提供给psql(1).即使在其他机器和其他架构上,脚本文件也可用于重建数据库; 即使在其他SQL数据库产品上也有一些修改.

备用存档文件格式必须与pg_restore(1)一起使用才能重建数据库.它们允许pg_restore选择恢复的内容,甚至可以在恢复之前重新排序项目.归档文件格式旨在跨架构移植.

所以取决于它被淘汰的方式.您可以使用优秀的file(1)命令来解决它 - 如果它提到ASCII文本和/或SQL,它应该恢复,psql否则你应该使用pg_restore

恢复非常简单:

psql -U <username> -d <dbname> -1 -f <filename>.sql
Run Code Online (Sandbox Code Playgroud)

要么

pg_restore -U <username> -d <dbname> -1 <filename>.dump
Run Code Online (Sandbox Code Playgroud)

查看他们各自的联机帮助页 - 有很多选项会影响还原的工作方式.在恢复之前,您可能必须清理"实时"数据库或从template0重新创建它们(如注释中所指出的那样),具体取决于转储的生成方式.

  • 你不能同时拥有`-d`和`-f`.`pg_restore:options -d/ - dbname和-f/ - file不能一起使用` (55认同)
  • 在版本9.2中," - f"选项指定输出文件,而不是转储文件(在早期版本中它可能意味着相同). (7认同)
  • 关于`不能一起使用`,请参见此处:/sf/ask/1951744931/ -tog (4认同)
  • IME你几乎总是希望恢复到从template0新创建的数据库.否则,如果您在template1中执行了激活plpgsql之类的操作,则还原过程将尝试再次执行,并且您建议的-1开关意味着整个事务将失败.所以像"createdb -T template0 seo2"后跟"pg_restore -v -d seo2 seo.pg"将seo.pg(由seo数据库制作)恢复到新的seo2数据库.如果您的备份文件只是一个.sql文件,您可以手动修剪它的冲突位. (3认同)
  • @ Alex78191这意味着它作为单个事务执行,可能完全失败和回滚,或者通过.它还会阻止对数据库的一些访问. (3认同)
  • `psql -U USERNAME -d DBNAME -1 -f FILENAME.sql` 因语法错误而失败,而 `psql -U USERNAME -d DBNAME &lt; FILENAME.sql` 有效。 (2认同)

小智 181

创建备份

pg_dump -h localhost -p 5432 -U postgres -F c -b -v -f 
"/usr/local/backup/10.70.0.61.backup" old_db
Run Code Online (Sandbox Code Playgroud)

-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"
Run Code Online (Sandbox Code Playgroud)

设置-h localhost - 选项很重要

  • 我想提一下,在执行这些命令之前,您应该位于 Posgresql **bin** 文件夹中。例如,在 Windows 中(如果您将其安装在默认文件夹中),它将是 **C:\Program Files\PostgreSQL\9.6\bin** (4认同)
  • @juan_carlos_yl 或者确保 bin 目录位于您的 PATH 中 (2认同)
  • &gt;-F c 是自定义格式(压缩,并且能够与 -j N 并行执行) 这是错误的,只有目录格式支持并行转储 (2认同)

Tom*_*art 74

您可能需要登录postgres才能拥有数据库的完全权限.

su - postgres
psql -l                      # will list all databases on Postgres cluster
Run Code Online (Sandbox Code Playgroud)

的pg_dump/pg_restore的

  pg_dump -U username -f backup.dump database_name -Fc 
Run Code Online (Sandbox Code Playgroud)

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

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

恢复备份:

   pg_restore -d database_name -U username -C backup.dump
Run Code Online (Sandbox Code Playgroud)

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

pg_dump的/ PSQL

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

备份:

pg_dump -U username -f backup.sql database_name
Run Code Online (Sandbox Code Playgroud)

恢复:

psql -d database_name -f backup.sql
Run Code Online (Sandbox Code Playgroud)

  • 我使用“psql -d database_name -f backup.sql”命令来恢复我从 DigitalOcean 上的 dokku 转储的数据库。效果很好。 (2认同)
  • 在使用 psql 时,如果您的用户(例如 `postgres`)设置了密码,则应该使用 `-W` 选项。例如,在 Ubuntu 上,无需在终端的任何地方执行 `su postgres`,$ psql -h localhost -U postgres -W -d DB_NAME &lt; DB_BACKUP.sql` 是对我有用的命令,可以在我的本地主机上恢复我的备份。请注意,需要`-h` 选项。 (2认同)

Nat*_*ros 49

POSTGRESQL 9.1.12

倾倒:

pg_dump -U user db_name > archive_name.sql
Run Code Online (Sandbox Code Playgroud)

输入用户密码并按Enter键.

恢复:

psql -U user db_name < /directory/archive.sql
Run Code Online (Sandbox Code Playgroud)

输入用户密码并按Enter键.


Yah*_*r M 30

以下是我pg_dump用来恢复数据库的版本:

pg_restore -h localhost -p 5432 -U postgres -d my_new_database my_old_database.backup
Run Code Online (Sandbox Code Playgroud)

或使用psql:

psql -h localhost -U postgres -p 5432 my_new_database < my_old_database.backup
Run Code Online (Sandbox Code Playgroud)

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

  • Govind Singh,你为什么编辑我的答案?你的改变没有什么新东西.. (2认同)
  • 使用“psql”时“my_new_database”应该已经存在,不是吗? (2认同)

小智 22

这对我有用:

pg_restore --verbose --clean --no-acl --no-owner --host=localhost --dbname=db_name --username=username latest.dump
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,“--no-owner”真的帮助了我。 (2认同)

Sar*_* Ak 14

使用GZIP备份和恢复

对于更大尺寸的数据库,这是非常好的

备用

pg_dump -U user -d mydb | gzip > mydb.pgsql.gz
Run Code Online (Sandbox Code Playgroud)

resore

gunzip -c mydb.pgsql.gz | psql dbname -U user
Run Code Online (Sandbox Code Playgroud)

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

  • 对于 ubuntu,你可以使用:`gunzip -c mydb.pgsql.gz | sudo -u postgres psql` 获取对数据库进行操作的权限。转储时还要考虑“--clean”标志,这将擦除所有现有数据,可能会派上用场。 (2认同)

Aar*_*ier 9

Backup:  $ pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}

Restore: $ psql -U {user-name} -d {desintation_db} -f {dumpfilename.sql}
Run Code Online (Sandbox Code Playgroud)


Har*_*jah 8

恢复转储文件

psql -d [Dbname] -U [UserName] -p 5432 < [FileLocation]
Run Code Online (Sandbox Code Playgroud)

恢复 .SQL 文件

pg_restore -U [Username] -d [Dbname] -1 [FileLocation]
Run Code Online (Sandbox Code Playgroud)

如果出现用户身份验证错误,请转到程序文件中 PSQL/data 文件夹中的 pg_hba.conf 文件,并将“METHOD”更改为“Trust”。在 Windows 服务中重新启动 psql 服务器(Win + R --> services.msc)。


Hen*_*l B 8

如果您正在使用 docker,这个答案可能会有所帮助。

  1. 启动容器
    docker start <postgres_container_id>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 访问容器内的 bash
    docker exec -it <postgres_container_id> bash
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将备份文件复制.tar到docker容器(在另一个窗口中)
    docker cp postgres_dump.tar <postgres_container_id>:/
    
    Run Code Online (Sandbox Code Playgroud)
  4. 恢复备份
    pg_restore -c -U <postgres-user> -d <database-name>  -v "postgres_dump.tar" -W
    
    Run Code Online (Sandbox Code Playgroud)
  5. 输入密码


小智 7

尝试这个:

psql -U <username> -d <dbname> -f <filename>.sql
Run Code Online (Sandbox Code Playgroud)

从 .sql 文件恢复 DB psql


小智 7

尝试:

pg_restore -h localhost -p 5432 -U <username> -d <dbname> -1 <filename>
Run Code Online (Sandbox Code Playgroud)


Din*_*nka 6

打开终端.

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

3.删除mydb.backup文件到目的地.

您的目标服务器 - localhost

目标数据库名称 - mydatabase

create database for restore backup.

/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密码--clean"/家/迪内希/ DB/MYDB.备份"


小智 6

如果您使用 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. 检查恢复过程


Vai*_*sai 6

1) 打开 psql 终端。

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

3) 创建一个空数据库。

4)使用以下命令恢复.dump文件

<database_name>-# \i <path_to_.dump_file>
Run Code Online (Sandbox Code Playgroud)


Igr*_* Pn 6

我没有看到这里提到转储文件扩展名 (*.dump)。

这个解决方案对我有用:

我有一个转储文件,需要恢复它。

首先,我尝试这样做pg_restore并得到:

pg_restore: error: input file appears to be a text format dump. Please use psql.
Run Code Online (Sandbox Code Playgroud)

我做到了psql并且运行良好:

psql -U myUser -d myDataBase < path_to_the_file/file.dump
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

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

备份和恢复 Postgres 数据库的 9 种方法


Dev*_*hon 5

备份和恢复

这是我用来备份、删除、创建和恢复我的数据库的组合(在 macOS 和 Linux 上):

sudo -u postgres pg_dump -Fc mydb > ./mydb.sql
sudo -u postgres dropdb mydb
sudo -u postgres createdb -O db_user mydb
sudo -u postgres pg_restore -d mydb < ./mydb.sql
Run Code Online (Sandbox Code Playgroud)

杂项

  • -Fc将压缩的数据库(˚F ORMAT Ç ustom
  • 列出 PostgreSQL 用户: sudo -u postgres psql -c "\du+"
  • 您可能希望将主机名日期添加到./mydb.sql,然后通过以下方式更改它:
    ./`hostname`_mydb_`date +"%Y%m%d_%H%M"`.sql
    
    Run Code Online (Sandbox Code Playgroud)


Mas*_*iri 5

无密码提示的最短方式

psql "postgresql://<db_user>:<db_pass>@<ip>:<port>/<db_name>" < "backup.sql"
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 Windows 操作系统

psql.exe "postgresql://<db_user>:<db_pass>@<ip>:<port>/<db_name>" < "backup.sql"
Run Code Online (Sandbox Code Playgroud)