Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

将数据导入 Amazon RDS 上的 PostgreSQL;

如果要将现有的 PostgreSQL 部署迁移至 Amazon RDS,则该任务的复杂程度取决于数据库的大小以及要传送的数据库对象的类型。例如,如果一个数据库包含 GB 级别的数据集以及预储程序和触发器,则其复杂程度要远高于只有几 MB 的测试数据而无触发器或预储程序的简单数据库。

我们建议您在以下条件下使用本机 PostgreSQL 数据库迁移工具:

  • 您具有一个同类迁移,其中,您正在从一个具有与目标数据库相同的数据库引擎的数据库中迁移。

  • 您正在迁移整个数据库。

  • 利用这些本机工具,您可以在最少的停机时间下迁移您的系统。

在大多数其他情况下,使用 AWS Database Migration Service (AWS DMS) 执行数据库迁移是最佳方法。AWS DMS 可以在无停机时间的情况下迁移数据库,对于许多数据库引擎,将继续进行持续复制,直到您已准备好切换到目标数据库。您可以使用 AWS DMS 迁移到相同的数据库引擎或其他数据库引擎。如果您要迁移到与源数据库不同的数据库引擎,可使用 AWS Schema Conversion Tool 迁移未由 AWS DMS 迁移的架构对象。有关 AWS DMS 的更多信息,请参阅什么是 AWS Database Migration Service

修改数据库参数组以包括以下 *仅供* 您导入的设置。您应测试参数设置以查找对数据库实例最有效的设置:在导入完成后,您需要将这些参数还原为生产值:

对数据库实例设置进行以下修改:

  • 禁用数据库实例备份 (将 backup_retention 设置为 0)

  • 禁用多可用区

修改数据库参数组以包括以下设置。您只应在导入数据时使用这些设置。您应测试参数设置以查找对数据库实例最有效的设置:在导入完成后,您需要将这些参数还原为生产值:

参数 导入时的建议值 说明

maintenance_work_mem

524288、1048576、2097152 或 4194304 (KB)。这些设置相当于 512 MB、1 GB、2 GB 和 4 GB。

此设置的只取决于您主机的大小。此参数在 CREATE INDEX 语句中使用,每个并行命令可以使用这个数量的内存。您需要计算最佳值,这样就不会将此值设置得过高而出现内存不足的情况。

checkpoint_segments

256

此设置的值会消耗更多磁盘空间,但减少了您 WAL 日志上的争用。对于 PostsgreSQL 版本 9.5.x 和 9.6.x,此值应为 max_wal_size

checkpoint_timeout

1800

此设置的值可以减少 WAL 轮换的频率。

synchronous_commit

Off

禁用此设置可加快写入。禁用此参数会在服务器崩溃时增加数据丢失的风险 (不禁用 FSYNC)

wal_buffers

8192

此值以 8 KB 为单位。这也有助于您的 WAL 生成速度

autovacuum

Off

在您加载数据时禁用 PostgreSQL auto vacuum 参数,这样它就不使用资源

pg_dump -Fc (压缩) 或 pg_restore -j (并行) 命令与这些设置结合使用。

注意

PostgreSQL 命令 pg_dumpall 所需要的 super_user 权限在创建数据库实例时并不授予,因此无法使用该命令导入数据。

从 Amazon EC2 实例导入 PostgreSQL 数据库

如果您在 Amazon EC2 实例上的 PostgreSQL 服务器中有数据,并要将其移至 PostgreSQL 数据库实例,则可采用以下过程。下面列表显示了需要采取的步骤。以下各节详述其中每个步骤。

  1. 使用 pg_dump 创建一个文件,其中包含要加载的数据

  2. 创建目标数据库实例

  3. 使用 psql 在数据库实例上创建数据库,然后加载数据

  4. 创建该数据库实例的数据库快照

步骤 1:使用 pg_dump 创建一个文件,其中包含要加载的数据

pg_dump 使用 COPY 命令创建 PostgreSQL 数据库的架构和数据转储。pg_dump 生成的转储脚本将数据加载到一个同名的数据库中,然后重新创建表、索引和外键。您可以使用 pg_restore 命令和 -d 参数将数据恢复到具有不同的名称的数据库。

在创建数据转储之前,应查询要转储的表以获取行数,以使您可确认目标数据库实例上的数量。

以下命令为一个名为 mydb2 的数据库创建一个名为 mydb2dump.sql 的转储文件。

Copy
prompt>pg_dump dbname=mydb2 -f mydb2dump.sql

步骤 2:创建目标数据库实例

使用 Amazon RDS 控制台、AWS CLI 或 API 创建目标 PostgreSQL 数据库实例。在备份保留设置为 0 的情况下创建该实例,然后禁用多可用区。这样可更快地导入数据。您必须先在该实例上创建一个数据库,然后才能转储数据。该数据库可以与包含转储数据的数据库具有相同的名称,或者您也可以创建具有不同的名称的数据库并使用 pg_restore 命令和 -d 参数将数据恢复到新命名的数据库。

例如,以下命令可用于转储、还原和重命名数据库:

Copy
pg_dump -Fc -v -h [endpoint of instance] -U [master username] [database] > [database].dump createdb [new database name] pg_restore -v -h [endpoint of instance] -U [master username] -d [new database name] [database].dump

步骤 3:使用 psql 在数据库实例上创建数据库,然后加载数据

可使用用于执行 pg_dump 命令的同一连接,连接到目标数据库实例并重新创建数据库。使用 psql 时,可使用主用户名和主密码在数据库实例上创建数据库

以下示例使用 psql 和一个名为 mydb2dump.sql 的转储文件,在一个名为 mypginstance 的 PostgreSQL 数据库实例上创建一个名为 mydb2 的数据库:

针对 Linux、OS X 或 Unix:

Copy
psql \ -f mydb2dump.sql \ --host mypginstance.c6c8mntzhgv0.us-west-2.rds.amazonaws.com \ --port 8199 \ --username myawsuser \ --password password \ --dbname mydb2

对于 Windows:

Copy
psql ^ -f mydb2dump.sql ^ --host mypginstance.c6c8mntzhgv0.us-west-2.rds.amazonaws.com ^ --port 8199 ^ --username myawsuser ^ --password password ^ --dbname mydb2

步骤 4:创建数据库实例的数据库快照

确认已将数据加载到数据库实例中后,建议创建目标 PostgreSQL 数据库实例的数据库快照。数据库快照是数据库实例的完整备份,可用于将数据库实例还原到已知状态。完成加载后立即创建数据库快照,可让您在遇到问题时不必再次加载数据,且您还可以使用此数据库快照创建新数据库实例。有关创建数据库快照的更多信息,请参阅创建数据库快照

使用 \copy 命令将数据导入 PostgreSQL 数据库实例上的表

您可以从 \copypsql 提示符运行 命令,将数据导入 PostgreSQL 数据库实例上的表。该表必须已存在于数据库实例上。有关 \copy 命令的更多信息,请参阅 PostgreSQL 文档

注意

\copy 命令不提供操作确认,如插入的行计数。如果复制命令由于错误而失败,则 PostgreSQL 会提供错误消息。

通过源表中的数据创建 .csv 文件,使用 psql 登录到 PostgreSQL 实例上的目标数据库,然后运行以下命令。此示例使用 source-table 作为源表名称,使用 source-table.csv 作为 .csv 文件,使用 target-db 作为目标数据库:

Copy
target-db=> \copy source-table from 'source-table.csv' with DELIMITER ',';

您还可以从客户端计算机命令提示符运行以下命令。此示例使用 source-table 作为源表名称,使用 source-table.csv 作为 .csv 文件,使用 target-db 作为目标数据库:

针对 Linux、OS X 或 Unix:

Copy
$psql target-db \ -U <admin user> \ -p <port> \ -h <DB instance name> \ -c "\copy source-table from 'source-table.csv' with DELIMITER ','"

对于 Windows:

Copy
$psql target-db ^ -U <admin user> ^ -p <port> ^ -h <DB instance name> ^ -c "\copy source-table from 'source-table.csv' with DELIMITER ','"