将 Postgres 数据库从独立的本地数据库移动到 Amazon RDS

7 postgresql

我有一个在我的 Mac 上本地运行的 Ruby on Rails 4 应用程序。我在本地运行 Postgres。

我想将数据库(并且只是数据库,而不是整个应用程序)移动到 Amazon RDS Postgres。

在新数据库上设置所有表并将数据迁移到其中的最简单方法是什么?

Cra*_*ger 17

@joni 正确地指出这pg_dump就是你想要的。但是,我建议不要进行简单的 SQL 转储。相反,使用可以输入pg_restore. 如果您使用目录格式,这允许并行转储/恢复(更快),但它最有用,因为它提供了对恢复细节的控制,而无需进行新的转储。

自定义格式转储/恢复

例如,假设您已经CREATE DATABASE在目标上执行了 a ,因此有一个名为mydb那里的空数据库:

# dump the local db
pg_dump -Fc -o mydb.dump mydb

# restore to Amazon RDS
pg_restore -h my.amazon.host -U rds_superuser -d mydb --no-owner --no-privileges --no-tablespaces
Run Code Online (Sandbox Code Playgroud)

角色、表空间、外部服务器、GRANTs 等

请注意,转储中包含角色(用户和组)。外部数据包装服务器或其他一些全局对象也不是。因此,依赖于它们的事物将无法恢复。由于这个原因,我在上面省略了所有者和权限的恢复 - 这意味着如果您在数据库中具有非默认权限,则需要重做GRANTs 和REVOKEs 。

同样,所有对象都恢复到默认表空间,因为您可能在本地拥有的任何表空间都不会在 RDS 上。

没有远程访问rds_superuser

如果您不允许rds_superuser远程登录,但已经GRANT rds_superuser TO myusername为其他角色完成了登录,那么-U rds_superuser您可以使用:

-U myusername --role=rds_superuser
Run Code Online (Sandbox Code Playgroud)

获得pg_restore进行身份验证的myusernameSET ROLE rds_superuser;

复制

大多数生产 PostgreSQL 数据库迁移是使用复制和故障转移执行的。Amazon RDS 目前无法做到这一点。RDS 在内部进行 WAL 存档和流式复制,但无法访问 WAL 存档或为RDS外部的客户端创建复制replication条目pg_hba.conf

因此,在撰写本文时,您必须转储和重新加载才能将数据移入或移出 RDS。没有低停机时间选项。


小智 2

使用pg_dumpCLI 实用程序。它的用法在各个 页面上都有描述(只需谷歌),但简而言之:

# dump
pg_dump --clean --no-privileges --no-owner --no-reconnect <db_name> > dump.sql
# load
psql -d <db_name> -f dump.sql
Run Code Online (Sandbox Code Playgroud)

请注意,我添加了这些--clean --no-privileges --no-owner选项,因为 postgres 用户在您的 macbook 和亚马逊服务器上可能有所不同。

  • 如果使用“psql”恢复转储,您可能应该使用“--single-transaction -v ON_ERROR_STOP=1”,这样如果出现问题,您就不会得到混乱的部分恢复。 (3认同)