【问题标题】:Migrate postgres dump to RDS将 postgres 转储迁移到 RDS
【发布时间】:2016-07-18 15:00:37
【问题描述】:

我有一个在数字海洋上运行的 Django postgres db (v9.3.10),并正在尝试将其迁移到 Amazon RDS (postgres v 9.4.5)。 RDS 是一个 db.m3.xlarge 实例,大小为 300GB。我已经倾倒了 Digital Ocean 数据库:

sudo -u postgres pg_dump -Fc -o -f /home/<user>/db.sql <dbname>

现在我正在尝试通过以下方式迁移它:

 pg_restore -h <RDS endpoint> --clean -Fc -v -d <dbname> -U <RDS master user> /home/<user>/db.sql

我看到的唯一错误是:

  pg_restore: [archiver (db)] Error from TOC entry 2516; 0 0 COMMENT EXTENSION plpgsql
  pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql
  Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

除此之外,一切似乎都很顺利,然后就停止了。转储的文件约为 550MB,并且有一些带有多个索引的表,否则非常标准。

AWS 接口上的读取和写入 IOPS 接近于 0,CPU、内存和存储也是如此。我对 AWS 很陌生,并且知道参数组可能需要调整才能更好地做到这一点。任何人都可以就这个或将 Django 数据库迁移到 RDS 的更好方法提出建议吗?

编辑:

查看数据库用户,DO 数据库如下所示:

Role Name   Attr                                           Member Of
<user>      Superuser                                      {}
postgres    Superuser, Create role, Create DB, Replication {}

RDS 看起来像:

Role Name      Attr                     Member Of
<user>        Create role, Create DB    {rds_superuser}
rds_superuser Cannot login              {}
rdsadmin      ...                        ...

所以在我看来这不是权限问题,因为 在每种情况下都具有超级用户权限。

适合任何人的解决方案

我终于得到了这个工作:

cat <db.sql> | sed -e '/^COMMENT ON EXTENSION plpgsql IS/d' > edited.dump
psql -h <RDS endpoint> -U <user> -e <dname> < edited.dump

对于可靠的备份/恢复机制来说,它并不理想,但鉴于它只是一个评论,我想我可以不用它。我唯一的其他观察是运行 psql/pg_restore 到远程主机很慢。希望新的database migration service 能添加一些东西。

【问题讨论】:

  • 我现在已将 RDS 更改为使用相同的 postgres 版本,但仍然没有运气!我尝试直接尝试使用 psql 以非自定义格式转储管道,但也无法正常工作。请帮忙!

标签: django database postgresql database-migration


【解决方案1】:

考虑到您转储的数据库文件约为 550MB,我认为使用 Amazon 指南来执行此操作是出路。希望对你有帮助。

Importing Data into PostgreSQL on Amazon RDS

【讨论】:

  • 这就是我要遵循的指南。然而,它仍然挂起,最终似乎只是超时。我不知道我是否正确设置了建议的参数。
  • 您在本地计算机上遇到权限问题。见stackoverflow.com/questions/13410631/…
  • 我查看了权限并编辑了问题以向您展示 psql 中的 \du 是什么样的。它看起来不像该帖子中提到的相同问题,因为 已经是每个数据库上的超级用户(或者至少是我在 RDS 上能做到的最好的 rds_superuser)。
  • 尝试以 root 身份运行 pg_restore 命令。如果这也失败了,您可以尝试通过 pgAdmin 连接到您的 AWS RDS 实例,然后从那里运行恢复。为此,您的本地计算机应该能够通过 AWS 上的数据库安全组访问远程数据库。让我们看看这些进展如何。 . .
【解决方案2】:

我认为它没有停止。它只是重新创建索引、外键等。使用pg_restore -v 查看还原过程中发生了什么。检查日志或将输出重定向到文件以检查导入后是否有任何错误,因为这很冗长。

我还建议使用目录格式 (pg_dump -v -Fd),因为它允许并行恢复 (pg_restore -v -j4)。

你可以忽略这个ERROR: must be owner of extension plpgsql。这只是在扩展上设置评论,无论如何默认安装。这是由于 PostgreSQL 的 RDS 风格的特殊性造成的,它不允许在以 postgres 用户身份连接时恢复数据库。

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2022-11-25
    • 2019-07-08
    • 2021-10-19
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多