pg_restore 到一个新的数据库

iai*_*ain 14 postgresql restore pg-restore

我正在使用 Heroku 的 Postgres 选项并从中下载了一个备份。我想将它恢复到一个新的数据库中,以便我可以查看它。我一直在尝试不同的命令,但收效甚微。我的第一次尝试:

$ sudo -u postgres psql < db/backups/myapp_2018-05-27.pg.dump 
The input is a PostgreSQL custom-format dump.
Use the pg_restore command-line client to restore this dump to a database.
Run Code Online (Sandbox Code Playgroud)

所以我尝试:

$ sudo -u postgres pg_restore -d myapp3 -C db/backups/myapp_2018-05-27.pg.dump
pg_restore: [archiver (db)] connection to database "myapp3" failed: FATAL:  database "myapp3" does not exist
Run Code Online (Sandbox Code Playgroud)

我真的不明白这个-C选项

-C --创建

在恢复之前创建数据库。如果还指定了 --clean,则在连接之前删除并重新创建目标数据库。

使用此选项时,以 -d 命名的数据库仅用于发出初始 DROP DATABASE 和 CREATE DATABASE 命令。所有数据都恢复到出现在存档中的数据库名称。

恢复到新数据库对我来说似乎是合乎逻辑的。我离题了……(也许这里已经正确解释

我尝试从另一个具有相同架构的较早版本的模板创建一个新数据库:

$ sudo -u postgres createdb -T myapp myapp3

$ sudo -u postgres pg_restore -d myapp3 -C db/backups/myapp_2018-05-27.pg.dump
pg_restore: [archiver (db)] Error while PROCESSING TOC:

<snip>

WARNING: errors ignored on restore: 5
Run Code Online (Sandbox Code Playgroud)

我收到很多关于不存在且未插入数据的用户的错误。

我也尝试过使用,template0但这会带来有关架构的错误,正如我所期望的。

总之,我想从 Heroku Pg 备份恢复到一个新的数据库。我不知道我怎样才能避免有关索引和用户丢失等错误,并有模式做好准备。

-O由于文档中的这一行,我也尝试过:

使用-O,任何用户名都可以用于初始连接,该用户将拥有所有创建的对象。

我似乎也误解了这一点,因为屏幕上又充满了错误。


编辑:基于-C链接的答案,我设法恢复到一个神秘命名的数据库,但是当我运行重命名数据库命令 ( alter database rtyghjkuyhgh rename to my_app3) 时,它会清空所有数据:(


任何帮助或见解,即使只是在正确方向上的一点,将不胜感激。

Postgres 版本 9.5.12

miv*_*ivk 11

让我们定义几个变量,使其余的更容易复制/粘贴(使用来自原始问题的名称)

old_db=myapp
new_db=myapp3
db_dump_file="backups/myapp_2018-05-27.pg.dump"
Run Code Online (Sandbox Code Playgroud)

以下假设您的备份是使用“自定义”格式创建的,如下所示:

pg_dump -U postgres -F custom "$old_db" > "$db_dump_file"
Run Code Online (Sandbox Code Playgroud)

要恢复$db_dump_file到新的数据库名称$new_db

dropdb   -U postgres --if-exists  "$new_db"
createdb -U postgres -T template0 "$new_db"

pg_restore -U postgres -d "$new_db" "$db_dump_file"
Run Code Online (Sandbox Code Playgroud)


iai*_*ain 1

所以,答案是:

  1. 创建一个新数据库。

sudo -u postgres createdb -T myapp myapp5

  1. 连接到不同的数据库并运行此命令。

sudo -u postgres pg_restore -d some_other_db -C -O db/backups/myapp_2018-05-27.pg.dump

  1. 将数据库名称从转储的名称更改为上面创建的名称。

$ psql \c some_other_db alter database ghji76yhjkj rename to myapp5

  1. 运行设置用户等所需的任何脚本。