ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


S
Steve Chambers

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

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

转储可以脚本或存档文件格式输出。脚本转储是纯文本文件,其中包含将数据库重建到保存时的状态所需的 SQL 命令。要从这样的脚本中恢复,请将其提供给 psql(1)。即使在其他机器和其他架构上,脚本文件也可用于重建数据库;甚至在其他 SQL 数据库产品上也进行了一些修改。替代归档文件格式必须与 pg_restore(1) 一起使用来重建数据库。它们允许 pg_restore 选择要恢复的内容,甚至可以在恢复之前重新排序项目。存档文件格式旨在跨架构移植。

所以取决于它被丢弃的方式。如果使用 Linux/Unix,您可能可以使用出色的 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 重新创建它们(如评论中指出的那样),具体取决于转储的生成方式。


您实际上总是希望将 IME 恢复到从 template0 新创建的数据库中。否则,如果您在 template1 中执行了诸如激活 plpgsql 之类的操作,则还原过程将尝试再次执行此操作,并且您建议的 -1 开关意味着整个事务将失败。所以像“createdb -T template0 seo2”后跟“pg_restore -v -d seo2 seo.pg”之类的东西可以将 seo.pg(由 seo 数据库制作)恢复到一个新的 seo2 数据库中。如果您的备份文件只是一个 .sql 文件,您可以手动删除其中的冲突部分。
您不能同时拥有 -d-fpg_restore: options -d/--dbname and -f/--file cannot be used together
在 9.2 版中,“-f”选项指定了一个输出文件,而不是转储文件(在早期版本中可能意味着相同)。
关于 cannot be used together,请参见此处:stackoverflow.com/questions/27882070/…
@Alex78191 这意味着它作为单个事务执行,可能会完全失败并回滚,或者通过。它也会阻止对数据库的一些访问。
E
Eduardo Cuomo

创建备份

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详细< /em>,-f备份文件名

从备份恢复

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

重要的是设置 -h localhost - 选项


我想提一下,在执行这些命令之前,您应该位于 Posgresql bin 文件夹中。例如在 Windows 中(如果您将其安装在默认文件夹中),它将是 C:\Program Files\PostgreSQL\9.6\bin
@juan_carlos_yl 或者确保 bin 目录在您的 PATH 上
>-F c 是自定义格式(压缩后可以和 -j N 并行)这是错误的,只有目录格式支持并行转储
T
Tombart

您可能需要以 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 格式,该格式被压缩并导致最小的备份文件大小

表示每个文件是一个表的目录

用于 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 转储的数据库。工作得很好。
在使用 psql 时,如果您的用户(例如 postgres)设置了密码,则应使用 -W 选项。例如,在 Ubuntu 上,没有在终端 $ psql -h localhost -U postgres -W -d DB_NAME < DB_BACKUP.sql 的任何地方执行 su postgres 的命令对我有用,可以在我的本地主机上恢复我的备份。请注意,需要 -h 选项。
@JiggneshhGohel 正如手册所说:-W 选项从来都不是必需的。如果服务器要求密码验证,pg_dump 将自动提示输入密码。如果您使用纯文本密码,您也可以使用 PGPASSWORD 环境变量。如果默认的 PGHOST 不适用,则需要 -h。这些选项对于许多 PostgreSQL 实用程序都很常见,因此对于回答这个问题不是必需的(这在很大程度上取决于您的设置)。
@Tombart 您的第二个选项 pg_dump/psql 部分对我有用。但第一部分 pg_dump/pg_restore 不适用于我的恢复。谢谢你。
@AnjanBiswas 第一个选项是使用压缩存档,这将需要更多 CPU,但备份文件将占用更少的磁盘空间。您只需要选择适当的压缩方式,例如 -Fc
A
Aamir

PostgreSQL 9.1.12

倾倒:

pg_dump -U user db_name > archive_name.sql

输入用户密码并按回车。

恢复:

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

输入用户密码并按回车。


我如何捕获恢复日志文件而不是在屏幕上打印?请让我知道我尝试了 >>, 2>> ,但没有工作,谢谢。
E
Eduardo Cuomo

下面是我用来恢复数据库的 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 数据库名称


Govind Singh,你为什么编辑我的答案?你的改变没有带来任何新的东西..
使用 psqlmy_new_database 应该已经存在,不是吗?
S
Sarath Ak

使用 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/14/backup-dump.html


对于 ubuntu,您可以使用:gunzip -c mydb.pgsql.gz | sudo -u postgres psql 获取操作数据库的权限。转储时还要考虑 --clean 标志,它将擦除所有现有数据,可能会派上用场。
为我工作伟大而整洁的解决方案。谢谢!
对于Windows,很难配置所有例如。 gungip 命令 ;)
A
Andreas Baumgart

这对我有用:

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

谢谢,--no-owner 真的帮助了我。
A
Aaron Lelevier
Backup:  $ pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}

Restore: $ psql -U {user-name} -d {desintation_db} -f {dumpfilename.sql}

E
Ehsan

尝试这个:

psql -U <username> -d <dbname> -f <filename>.sql

从 .sql 文件恢复数据库 psql


psql -U <用户名> -d <数据库名> -f <文件名>.sql
佚名

如果您使用 pg_dump 创建备份,您可以通过以下方式轻松恢复它:

打开命令行窗口转到 Postgres bin 文件夹。例如: cd "C:\ProgramFiles\PostgreSQL\9.5\bin" 输入命令来恢复你的数据库。例如: psql.exe -U postgres -d YourDatabase -f D:\Backup\.sql 输入您的 postgres 用户的密码 检查恢复过程


I
Igr Pn

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

这个解决方案对我有用:

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

首先,我尝试使用 pg_restore 执行此操作并得到:

pg_restore: error: input file appears to be a text format dump. Please use psql.

我用 psql 做到了,效果很好:

psql -U myUser -d myDataBase < path_to_the_file/file.dump

K
Kayvan Mazaheri

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

3. 将 mydb.backup 文件恢复到目的地。

您的目标服务器-> localhost

您的目标数据库名称 -> 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.backup"

V
Vaibhav Desai

1) 打开 psql 终端。

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

3) 创建一个空数据库。

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

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

D
DevonDahon

备份和恢复

这是我用来备份、删除、创建和恢复我的数据库的组合(在 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

杂项

-Fc 将压缩数据库(格式自定义)

列出 PostgreSQL 用户: sudo -u postgres psql -c "\du+"

您可能希望将主机名和日期添加到 ./mydb.sql,然后通过以下方式更改它:./`hostname`_mydb_`date +"%Y%m%d_%H%M"`.sql


好东西@DevonDahon,4 个直截了当的命令 &不需要 psql shell。我能够成功地使用您的答案,但在带有 postgres 10.13 的 Ubuntu 18.04 上收到警告 pg_restore: [custom archiver] WARNING: ftell mismatch with expected position -- ftell used,所以我不知道那是什么意思...
H
Harrish Selvarajah

恢复转储文件

psql -d [Dbname] -U [UserName] -p 5432 < [FileLocation]

恢复 .SQL 文件

pg_restore -U [Username] -d [Dbname] -1 [FileLocation]

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


C
Cristhian Gonzalez

尝试:

pg_restore -h localhost -p 5432 -U <username> -d <dbname> -1 <filename>

P
Prashant Kumar

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

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

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

9 ways to backup and restore postgres databases


您是否意识到您错过了数据库名称部分并且它会抱怨目标数据库不存在?
M
Maryam Saeidi

如下链接所述,您可以使用 psql 命令恢复转储文件:

https://www.postgresql.org/docs/8.1/static/backup.html#BACKUP-DUMP-RESTORE

psql dbname < infile

如果您需要设置用户名,只需在命令后添加用户名,例如:

psql dbname < infile username

F
Fabien

尝试查看以下命令是否可以帮助您:

sudo su - yourdbuser
psql
\i yourbackupfile

T
Tim

对不起,necropost,但这些解决方案对我不起作用。我在 postgres 10 上。在 Linux 上:

我不得不将目录更改为我的 pg_hba.conf。我必须编辑文件以将方法从 peer 更改为 md5,如此处所述重新启动服务:service postgresql-10 restart 将目录更改为我的 backup.sql 所在的位置并执行:psql postgres -d database_name -1 -f backup.sql -database_name 是我的数据库的名称 -backup.sql 是我的 .sql 备份文件的名称。


M
Masih Jahangiri

无密码提示的最短路径

psql "postgresql://<db_user>:<db_pass>@<ip>:<port>/<db_name>" < "backup.sql"

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

psql.exe "postgresql://<db_user>:<db_pass>@<ip>:<port>/<db_name>" < "backup.sql"

u
user1876508

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

mv database_dump /tmp

进入临时目录,然后运行

su -u postgres
cd /tmp
pg_restore database_dump

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


O
Omar

如果您有备份 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 完成其工作。然后您可以检查还原过程。


R
Ramesh Ponnusamy

备份==>

选项1:在cmd中使用密码备份
1.PGPASSWORD="mypassword" pg_dump -U postgres -h localhost --inserts mydb>mydb.sql
选项2:在cmd中使用没有密码的备份
2. pg_dump -U postgres -h localhost --inserts mydb>mydb.sql
选项3:以gzip格式备份(如果数据库很大)
3. pg_dump -U postgres -h localhost mydb --inserts | gzip > mydb.gz

恢复:
1. psql -h localhost -d mydb -U postgres -p 5432 < mydb.sql


J
Johnny Chacon

此解决方案仅适用于 Windows。

首先,确保您已经将 postgres bin 文件夹添加到“路径”环境变量中(在我的例子中,这个文件夹是 C:\Program Files\PostgreSQL\12\bin)。

然后,打开 Windows 命令解释器 (cmd),转到您拥有 .sql 文件的文件夹并执行以下命令:

pg_restore -U 用户名 -d database-1 backupfile.sql

例如:

pg_restore -U sam -d SamDataBase -1 SamDataBaseBackup.sql

(它可以要求您输入用户的密码,因此请确保输入正确,然后单击输入)

普拉维达!


A
All Іѕ Vаиітy

如果您创建了一个名为 mydb 的新数据库,要使用 psql 将 .sql 转储恢复到该数据库,

psql --file=dump.sql --username=postgres --host=localhost --port=5432 mydb

psql会提示密码

连接选项是

  -h, --host=HOSTNAME      database server host or socket directory (default: "/var/run/postgresql")
  -p, --port=PORT          database server port (default: "5432")
  -U, --username=USERNAME  database user name (default: "xyz")
  -w, --no-password        never prompt for password
  -W, --password           force password prompt (should happen automatically)

t
tripleee

如果要备份数据或从备份中恢复数据,可以运行以下命令:

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


S
Sutirtha Rej

请遵循以下 3 个步骤:

启动 postgres 服务器 - sudo systemctl start postgresql enable same - sudo systemctl enable postgresql restore 命令 - pg_restore -h localhost -p 5432 -U postgres -d old_db

假设转储在同一目录中

链接:

https://www.postgresqltutorial.com/postgresql-restore-database https://askubuntu.com/questions/50621/cannot-connect-to-postgresql-on-port-5432


A
Anptk

见下面的例子它的工作

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 下载\DB.backup"