如何正确使用pg_restore和AWS RDS来恢复postgresql数据库

22

我正在尝试将我的PostgreSQL数据库恢复到AWS RDS。我想我快要完成了。我可以获得一个转储文件,并在本地重新创建数据库,但我缺少将其恢复到AWS RDS的最后一步。

这是我正在做的:

  1. 获取我的转储文件

$ pg_dump -h my_public dns -U myusername -f dump.sql myawsdb

  1. 在shell中创建一个名为test的本地数据库:

create database test;

  1. 将转储文件放入我的test数据库中

$ psql -U myusername -d test -f dump.sql

到目前为止都很好。

我遇到了一个错误:psql: dump.sql:2705: ERROR: role "rdsadmin" does not exist,但我认为我可以忽略它,因为我的数据库已经存在并具有所有内容(我使用\list和\connect test进行了检查)。

现在,我想将此dump/test恢复到我的AWS RDS上。

按照这个 https://gist.github.com/syafiqfaiz/5273cd41df6f08fdedeb96e12af70e3b,我现在应该这样做:

pg_restore -h <host> -U <username> -c -d <database name> <filename to be restored>

但我的文件名是什么,我的数据库名是什么?

我尝试了:

pg_restore -h mydns -U myusername -c -d myawsdbname test pg_restore -h mydns -U myusername -c -d myawsdbname dump.sql

还有一些我不记得的选项。

大多数时候,它会告诉我类似于:pg_restore:[archiver]无法打开输入文件“test.dump”:没有那个文件或目录

或者,对于第二种情况:输入文件似乎是文本格式的转储。请使用psql。

谁能指点我正确的方向?非常感谢您的帮助!

编辑:因此,我使用$pg_dump -Fc mydb> db.dump创建了一个.dump文件,使用这个文件我认为可以工作了。现在我收到错误消息[archiver(db)]无法执行查询:错误:角色“myuser”不存在 命令是:ALTER TABLE public.users_user_user_permissions_id_seq OWNER TO micromegas;

我可以忽略它吗?

编辑2:通过添加标志--no-owner --role=mypguser --no-privileges --no-owner,我摆脱了错误。


1
已解决。请查看编辑。 - Micromegas
2
如果您想要自己编写答案并将其标记为正确,那么可以这样做,因为这可能会帮助其他人。否则,请删除该问题,因为它不再是一个问题。 - dirkgroten
既然这对我有帮助,我建议你采用Dirk的建议1,并将你的编辑内容提取到一个答案中,而不是仅删除你的问题。 - ryanjdillon
很高兴这有所帮助。好的,我会根据编辑内容创建一个答案。 - Micromegas
@Micromegas,仍在等待编辑的答复 ;) - 1valdis
@1valdis和ryanjdillon:抱歉耽搁了。我从我的编辑中发布了一个答案。希望这仍然有用! - Micromegas
2个回答

33

好的,既然这显然对一些人有用,我将发布一个答案 - 尽我所能回忆起来的最好答案 - 来回答这个问题。由于a)我不再使用此实例,b)我也不完全记得我是如何做到的,所以我将更广泛地回答这个问题,并不针对AWS。

但是我积累了使用PostgreSQL的经验,因为AWS RDS也只是一个postgres实例,所以这些步骤应该非常相似。

以下是恢复postgreSQL DB实例时我推荐的步骤:

  1. .dump 格式而不是 .sql 格式下备份。 为什么? 文件大小将更小,恢复更容易。 使用以下命令执行此操作:

pg_dump -h <your_public_dns_ending_with.rds.amazonaws.com> -U <username_for_your_db> -Fc <name_of_your_db> > name_for_your_backup.dump

  1. 现在,您可以轻松地将备份还原到任何postgreSQL实例中。 通常我建议设置一个带有新用户名和新数据库名称的新DB实例。 假设您有一个名为testname的DB,超级用户为testuser。 然后,您只需要执行:

pg_restore --no-owner --no-privileges --role=testuser -d testname <your_backup_file.dump>

然后,这样应该就可以还原您的实例了。

当恢复到AWS或任何远程postgreSQL实例时,您需要使用-h标志指定主机。因此,可能如下所示:

pg_restore -h <以.rds.amazonaws.com结尾的公共DNS> -p 5432 --no-owner --no-privileges --role=testuser -d testname <your_backup_file.dump>

如果您在远程Linux服务器上运行DB实例,则主机将是您的远程IP地址(-h <ip_od_server>),其余内容相同。

希望这可以帮助您。如有任何问题,请在评论中提出,我会尽力提供更多帮助。


3
表现非常出色。记得在执行“pg_restore”之前必须先创建数据库。 - RicHincapie
在命令后面加上 --verbose 可以查看详细信息。 - Daniel Lidström
完美!在恢复到RDS时,您还需要指定一个用户: -U <user> 有关详细信息,请参阅此处的文档:https://docs.aws.amazon.com/dms/latest/sbs/chap-manageddatabases.postgresql-rds-postgresql-full-load-pd_dump.html - undefined

0

如果您的计算机可以访问RDS,或者通过AWS安全组获得了对计算机的访问权限,则此命令对我有效。

psql -h your_public_dns_ending_with.us-east-2.rds.amazonaws.com -U yourusername -d db_name_to_backup_to < pg_dump_backup_file.sql

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接