将数据导入 Amazon RDS 上的 PostgreSQL - Amazon Relational Database Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 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 SCT)。您可以使用 AWS SCT 迁移 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) 的争用。仅 PostgreSQL 9.5 及更早版本支持此设置。对于 9.6 及更高版本,请使用 max_wal_size

max_wal_size

256(适用于 9.6 版本)、4096(适用于 10 及更高版本)

允许 WAL 在自动检查点期间增长的最大大小。增大此参数会增加崩溃恢复所需的时间。对于 PostgreSQL 9.6 及更高版本,此参数替代 checkpoint_segments

对于 PostgreSQL 9.6,此值的单位为 16 MB。对于更高版本,此值单位为 1 MB。例如,在 9.6 版本中,128 表示 128 个块,每个块大小为 16 MB。在 12.4 版本中,2048 代表 2048 个块,每个块大小为 1 MB。

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 的转储文件。

prompt>pg_dump dbname=mydb2 -f mydb2dump.sql

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

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

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

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、macOS 或 Unix:

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

对于 Windows:

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 作为目标数据库:

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

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

对于 Linux、macOS 或 Unix:

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

对于 Windows:

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

将 Amazon S3 数据导入到 RDS for PostgreSQL 数据库实例

您可以将数据从 Amazon S3 导入到属于 RDS for PostgreSQL 数据库实例的表中。为此,您可以使用 Amazon RDS 提供的 aws_s3 PostgreSQL 扩展。

注意

要从 Amazon S3 导入到 RDS for PostgreSQL,您的数据库必须运行 PostgreSQL 版本 10.7 或更高版本。

有关使用 Amazon S3 存储数据的更多信息,请参阅 Amazon Simple Storage Service 入门指南 中的创建存储桶。有关如何将文件上传到 Amazon S3 存储桶的说明,请参阅 Amazon Simple Storage Service 入门指南 中的向存储桶添加对象

Amazon S3 数据导入概述

要将 Amazon S3 存储桶中存储的数据导入到 PostgreSQL 数据库表,请执行以下步骤。

将 S3 数据导入到 Amazon RDS

  1. 安装所需的 PostgreSQL 扩展。这些包括 aws_s3aws_commons 扩展。为此,请启动 psql 并使用以下命令。

    psql=> CREATE EXTENSION aws_s3 CASCADE; NOTICE: installing required extension "aws_commons"

    aws_s3 扩展提供用于导入 Amazon S3 数据的 aws_s3.table_import_from_s3 函数。aws_commons 扩展提供了额外的帮助程序函数。

  2. 指定要使用的数据库表和 Amazon S3 文件。

    aws_s3.table_import_from_s3 函数需要使用要将数据导入到的 PostgreSQL 数据库表的名称。该函数还要求您指定要导入的 Amazon S3 文件。要提供该信息,请执行以下步骤。

    1. 标识要将数据放入其中的 PostgreSQL 数据库表。例如,以下是本主题的示例中使用的示例 t1 数据库表。

      psql=> CREATE TABLE t1 (col1 varchar(80), col2 varchar(80), col3 varchar(80));
    2. 获取以下信息以标识要导入的 Amazon S3 文件:

      • 存储桶名称 – 存储桶是 Amazon S3 对象或文件的容器。

      • 文件路径 – 文件路径查找 Amazon S3 存储桶中的文件。

      • AWS 区域 – AWS 区域是 Amazon S3 存储桶的位置。例如,如果 S3 存储桶位于 美国东部(弗吉尼亚北部) 区域中,请使用 us-east-1。有关 AWS 区域名称和关联值的列表,请参阅 区域、可用区和本地扩展区

      要了解如何获取此信息,请参阅 Amazon Simple Storage Service 入门指南 中的查看对象。您可以使用 AWS CLI 命令 aws s3 cp 确认该信息。如果该信息正确无误,该命令将下载 Amazon S3 文件的副本。

      aws s3 cp s3://sample_s3_bucket/sample_file_path ./
    3. 使用 aws_commons.create_s3_uri 函数创建一个 aws_commons._s3_uri_1 结构以保存 Amazon S3 文件信息。您可以在对 aws_s3.table_import_from_s3 函数的调用中将该 aws_commons._s3_uri_1 结构作为参数提供。

      有关 psql 示例,请参阅以下内容。

      psql=> SELECT aws_commons.create_s3_uri( 'sample_s3_bucket', 'sample.csv', 'us-east-1' ) AS s3_uri \gset
  3. 提供权限以访问 Amazon S3 文件。

    要从 Amazon S3 文件中导入数据,请为 RDS for PostgreSQL 数据库实例提供权限以访问该文件所在的 Amazon S3 存储桶。为此,您可以使用 AWS Identity and Access Management (IAM) 角色或安全凭证。有关更多信息,请参阅 设置 Amazon S3 存储桶的访问权限

  4. 调用 aws_s3.table_import_from_s3 函数以导入 Amazon S3 数据。

    在完成以前的准备任务后,使用 aws_s3.table_import_from_s3 函数导入 Amazon S3 数据。有关更多信息,请参阅 使用 aws_s3.table_import_from_s3 函数导入 Amazon S3 数据

设置 Amazon S3 存储桶的访问权限

要从 Amazon S3 文件中导入数据,请为 RDS for PostgreSQL 数据库实例提供权限以访问该文件所在的 Amazon S3 存储桶。您可以通过两种方式提供 Amazon S3 存储桶的访问权限,如以下主题中所述。

使用 IAM 角色访问 Amazon S3 存储桶

从 Amazon S3 文件中加载数据之前,请为 RDS for PostgreSQL 数据库实例提供权限以访问该文件所在的 Amazon S3 存储桶。这样,您无需管理其他凭证信息或在 aws_s3.table_import_from_s3 函数调用中提供该信息。

为此,请创建一个 IAM 策略以提供 Amazon S3 存储桶的访问权限。创建一个 IAM 角色并将策略附加到该角色。然后,将该 IAM 角色分配给数据库实例

通过 IAM 角色向 RDS for PostgreSQL 数据库实例授予访问 Amazon S3 的权限

  1. 创建一个 IAM 策略。

    该策略提供存储桶和对象权限,以允许 RDS for PostgreSQL 数据库实例访问 Amazon S3。

    在策略中包含以下必需操作,以允许将文件从 Amazon S3 存储桶传输到 Amazon RDS

    • s3:GetObject

    • s3:ListBucket

    在策略中包含以下资源以标识 Amazon S3 存储桶以及存储桶中的对象。这会显示用于访问 Amazon S3 的 Amazon 资源名称 (ARN) 格式。

    • arn:aws:s3:::your-s3-bucket

    • arn:aws:s3:::your-s3-bucket/*

    有关为 Amazon RDS for PostgreSQL 创建 IAM 策略的更多信息,请参阅 创建和使用适用于 IAM 数据库访问的 IAM 策略。另请参阅 IAM 用户指南 中的教程:创建和附加您的第一个客户托管策略

    以下 AWS CLI 命令使用这些选项创建一个名为 rds-s3-import-policy 的 IAM 策略。它授予名为 your-s3-bucket 的存储桶的访问权限。

    注意

    在您创建策略之后,请记下策略的 Amazon 资源名称 (ARN)。在将策略附加到 IAM 角色时,您在后面的步骤中需要使用 ARN。

    对于 Linux、macOS 或 Unix:

    aws iam create-policy \ --policy-name rds-s3-import-policy \ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3import", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::your-s3-bucket", "arn:aws:s3:::your-s3-bucket/*" ] } ] }'

    对于 Windows:

    aws iam create-policy ^ --policy-name rds-s3-import-policy ^ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3import", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::your-s3-bucket", "arn:aws:s3:::your-s3-bucket/*" ] } ] }'
  2. 创建一个 IAM 角色。

    这样,Amazon RDS 就可以担任该 IAM 角色以代表您访问 Amazon S3 存储桶。有关更多信息,请参阅 IAM 用户指南 中的创建向 IAM 用户委派权限的角色

    以下示例说明了如何使用 AWS CLI 命令创建一个名为 rds-s3-import-role 的角色。

    对于 Linux、macOS 或 Unix:

    aws iam create-role \ --role-name rds-s3-import-role \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'

    对于 Windows:

    aws iam create-role ^ --role-name rds-s3-import-role ^ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'
  3. 将您创建的 IAM 策略附加到您创建的 IAM 角色。

    以下 AWS CLI 命令将以前创建的策略附加到一个名为 rds-s3-import-role 的角色。请将 your-policy-arn 替换为您在前面的步骤中记下的策略 ARN。

    对于 Linux、macOS 或 Unix:

    aws iam attach-role-policy \ --policy-arn your-policy-arn \ --role-name rds-s3-import-role

    对于 Windows:

    aws iam attach-role-policy ^ --policy-arn your-policy-arn ^ --role-name rds-s3-import-role
  4. 将该 IAM 角色添加到数据库实例中。

    您可以使用 AWS 管理控制台 或 AWS CLI 执行该操作,如下所述。

    注意

    此外,请确保您使用的数据库没有 将 Amazon S3 数据导入到 RDS for PostgreSQL 数据库实例 中注明的任何限制。

使用控制台为 PostgreSQL 数据库实例添加 IAM 角色

  1. 通过以下网址登录 AWS 管理控制台并打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 选择 PostgreSQL 数据库实例名称以显示其详细信息。

  3. 连接性和安全性选项卡上的管理 IAM 角色部分中,在向此实例添加 IAM 角色下选择要添加的角色。

  4. Feature (功能) 下,选择 s3Import

  5. 选择 Add role (添加角色)

使用 CLI 为 PostgreSQL 数据库实例添加 IAM 角色

  • 使用以下命令将角色添加到名为 my-db-instance 的 PostgreSQL 数据库实例中。将 your-role-arn 替换为您在上一步中记下的角色 ARN。使用 s3Import 作为 --feature-name 选项的值。

    对于 Linux、macOS 或 Unix:

    aws rds add-role-to-db-instance \ --db-instance-identifier my-db-instance \ --feature-name s3Import \ --role-arn your-role-arn \ --region your-region

    对于 Windows:

    aws rds add-role-to-db-instance ^ --db-instance-identifier my-db-instance ^ --feature-name s3Import ^ --role-arn your-role-arn ^ --region your-region

要使用 Amazon RDS API 为 PostgreSQL 数据库实例添加 IAM 角色,请调用 AddRoleToDBInstance 操作。

使用安全凭证访问 Amazon S3 存储桶

如果愿意,您可以使用安全凭证提供 Amazon S3 存储桶的访问权限,而不是使用 IAM 角色提供访问权限。为此,请在 aws_s3.table_import_from_s3 函数调用中使用 credentials 参数。

credentials 参数是 aws_commons._aws_credentials_1 类型的结构,其中包含 AWS 凭证。使用 aws_commons.create_aws_credentials 函数设置 aws_commons._aws_credentials_1 结构中的访问密钥和私有密钥,如下所示。

psql=> SELECT aws_commons.create_aws_credentials( 'sample_access_key', 'sample_secret_key', '') AS creds \gset

在创建 aws_commons._aws_credentials_1 结构后,请将 aws_s3.table_import_from_s3 函数与 credentials 参数结合使用来导入数据,如下所示。

psql=> SELECT aws_s3.table_import_from_s3( 't', '', '(format csv)', :'s3_uri', :'creds' );

也可以在 aws_s3.table_import_from_s3 函数调用中以内联方式包括 aws_commons.create_aws_credentials 函数调用。

psql=> SELECT aws_s3.table_import_from_s3( 't', '', '(format csv)', :'s3_uri', aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '') );

Amazon S3 访问故障排除

如果在尝试导入 Amazon S3 文件数据时遇到连接问题,请参阅以下内容以了解相应的建议:

使用 aws_s3.table_import_from_s3 函数导入 Amazon S3 数据

通过调用 aws_s3.table_import_from_s3 函数来导入 Amazon S3 数据。

注意

以下示例使用 IAM 角色方法提供 Amazon S3 存储桶的访问权限。因此,aws_s3.table_import_from_s3 函数调用不包括凭据参数。

下面显示使用 psql 的典型 PostgreSQL 示例。

psql=> SELECT aws_s3.table_import_from_s3( 't1', '', '(format csv)', :'s3_uri' );

下面是参数:

  • t1 – 将数据复制到的 PostgreSQL 数据库实例中的表的名称。

  • '' – 数据库表中的列的可选列表。您可以使用此参数来指示哪些 S3 数据列进入哪些表列中。如果未指定任何列,则会将所有列复制到表中。有关使用列列表的示例,请参阅 导入使用自定义分隔符的 Amazon S3 文件

  • (format csv) – PostgreSQL COPY 参数。复制过程使用 PostgreSQL COPY 命令的参数和格式。在上一个示例中,COPY 命令使用逗号分隔值 (CSV) 文件格式来复制数据。

  • s3_uri – 包含标识 Amazon S3 文件的信息的结构。有关使用 aws_commons.create_s3_uri 函数创建 s3_uri 结构的示例,请参阅 Amazon S3 数据导入概述

返回值为文本。有关该函数的完整参考,请参阅 aws_s3.table_import_from_s3

以下示例说明了如何在导入 Amazon S3 数据时指定不同类型的文件。

导入使用自定义分隔符的 Amazon S3 文件

以下示例说明了如何导入使用自定义分隔符的文件。它还说明如何使用 aws_s3.table_import_from_s3 函数的 column_list 参数来控制将数据放置在数据库表中的哪个位置。

在此示例中,假定将以下信息组织到 Amazon S3 文件中的竖线分隔列中。

1|foo1|bar1|elephant1 2|foo2|bar2|elephant2 3|foo3|bar3|elephant3 4|foo4|bar4|elephant4 ...

导入使用自定义分隔符的文件

  1. 在数据库中为导入的数据创建一个表。

    psql=> CREATE TABLE test (a text, b text, c text, d text, e text); CREATE TABLE
  2. 使用以下形式的 aws_s3.table_import_from_s3 函数从 Amazon S3 文件导入数据。

    您可以在 aws_s3.table_import_from_s3 函数调用中以内联方式包括 aws_commons.create_s3_uri 函数调用来指定文件。

    psql=> SELECT aws_s3.table_import_from_s3( 'test', 'a,b,d,e', 'DELIMITER ''|''', aws_commons.create_s3_uri('sampleBucket', 'pipeDelimitedSampleFile', 'us-east-2') );

数据现在位于表的以下列中。

psql=> SELECT * FROM test; a | b | c | d | e ---+------+---+---+------+----------- 1 | foo1 | | bar1 | elephant1 2 | foo2 | | bar2 | elephant2 3 | foo3 | | bar3 | elephant3 4 | foo4 | | bar4 | elephant4

导入 Amazon S3 压缩 (gzip) 文件

以下示例说明如何从 Amazon S3 导入使用 gzip 压缩的文件。

确保该文件包含以下 Amazon S3 元数据:

  • 键:Content-Encoding

  • 值:gzip

有关将这些值添加到 Amazon S3 元数据的更多信息,请参阅 Amazon Simple Storage Service 控制台用户指南 中的如何向 S3 对象添加元数据?

将 gzip 文件导入到 RDS for PostgreSQL 数据库实例,如下所示。

psql=> CREATE TABLE test_gzip(id int, a text, b text, c text, d text); CREATE TABLE psql=> SELECT aws_s3.table_import_from_s3( 'test_gzip', '', '(format csv)', 'myS3Bucket', 'test-data.gz', 'us-east-2' );

导入编码的 Amazon S3 文件

以下示例说明如何从 Amazon S3 导入具有 Windows-1252 编码的文件。

psql=> SELECT aws_s3.table_import_from_s3( 'test_table', '', 'encoding ''WIN1252''', aws_commons.create_s3_uri('sampleBucket', 'SampleFile', 'us-east-2') );

函数引用

aws_s3.table_import_from_s3

将 Amazon S3 数据导入到 Amazon RDS 表中。aws_s3 扩展提供 aws_s3.table_import_from_s3 函数。返回值为文本。

Syntax

必需的参数为 table_namecolumn_listoptions。这些标识数据库表并指定如何将数据复制到表中。

您还可以使用以下参数:

  • s3_info 参数指定要导入的 Amazon S3 文件。在您使用此参数时,IAM 角色为 PostgreSQL 数据库实例提供访问 Amazon S3 的权限。

    aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, s3_info aws_commons._s3_uri_1 )
  • credentials 参数指定凭证以访问 Amazon S3。在您使用此参数时,不使用 IAM 角色。

    aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, s3_info aws_commons._s3_uri_1, credentials aws_commons._aws_credentials_1 )
参数
table_name

包含要将数据导入到的 PostgreSQL 数据库表的名称的必需文本字符串。

column_list

包含要将数据复制到的 PostgreSQL 数据库表列的可选列表的必需文本字符串。如果此字符串为空,将使用表的所有列。有关示例,请参阅导入使用自定义分隔符的 Amazon S3 文件

选项

包含 PostgreSQL COPY 命令的参数的必需文本字符串。这些参数指定如何将数据复制到 PostgreSQL 表中。有关更多详细信息,请参阅 PostgreSQL COPY 文档

s3_info

包含有关 S3 对象的以下信息的 aws_commons._s3_uri_1 复合类型:

  • bucket – 包含文件的 Amazon S3 存储桶的名称。

  • file_path – 包含文件路径的 Amazon S3 文件名。

  • region – 文件所在的 AWS 区域。有关 AWS 区域名称和关联值的列表,请参阅 区域、可用区和本地扩展区

凭证

包含以下用于导入操作的凭证的 aws_commons._aws_credentials_1 复合类型:

  • 访问密钥

  • 私有密钥

  • 会话令牌

有关创建 aws_commons._aws_credentials_1 复合结构的信息,请参阅 aws_commons.create_aws_credentials

替代语法

为帮助进行测试,您可以使用一组扩展的参数而非 s3_infocredentials 参数。下面是 aws_s3.table_import_from_s3 函数的其他语法变化。

  • 不使用 s3_info 参数来标识 Amazon S3 文件,而使用 bucketfile_pathregion 参数的组合。使用此形式的函数,IAM 角色在 PostgreSQL 数据库实例上提供访问 Amazon S3 的权限。

    aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, bucket text, file_path text, region text )
  • 不使用 credentials 参数来指定 Amazon S3 访问权限,而使用 access_keysession_keysession_token 参数的组合。

    aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, bucket text, file_path text, region text, access_key text, secret_key text, session_token text )
替代参数
存储桶

包含 Amazon S3 存储桶(其中包含文件)的名称的文本字符串。

file_path

包含 Amazon S3 文件名(包含文件路径)的文本字符串。

区域

包含文件所在的 AWS 区域的文本字符串。有关 AWS 区域名称和关联值的列表,请参阅 区域、可用区和本地扩展区

access_key

包含用于导入操作的访问密钥的文本字符串。默认值为 NULL。

secret_key

包含用于导入操作的私有密钥的文本字符串。默认值为 NULL。

session_token

(可选)包含用于导入操作的会话密钥的文本字符串。默认值为 NULL。

aws_commons.create_s3_uri

创建 aws_commons._s3_uri_1 结构来保存 Amazon S3 文件信息。在 aws_s3.table_import_from_s3 函数的 s3_info 参数中使用 aws_commons.create_s3_uri 函数的结果。

语法
aws_commons.create_s3_uri( bucket text, file_path text, region text )
参数
存储桶

包含文件的 Amazon S3 存储桶名称的必需文本字符串。

file_path

包含 Amazon S3 文件名(包含文件路径)的必填文本字符串。

区域

一个包含文件所在的 AWS 区域的必需文本字符串。有关 AWS 区域名称和关联值的列表,请参阅 区域、可用区和本地扩展区

aws_commons.create_aws_credentials

aws_commons._aws_credentials_1 结构中设置访问密钥和私有密钥。在 aws_s3.table_import_from_s3 函数的 credentials 参数中使用 aws_commons.create_aws_credentials 函数的结果。

语法
aws_commons.create_aws_credentials( access_key text, secret_key text, session_token text )
参数
access_key

包含用于导入 Amazon S3 文件的访问密钥的必需文本字符串。默认值为 NULL。

secret_key

包含用于导入 Amazon S3 文件的私有密钥的必需文本字符串。默认值为 NULL。

session_token

包含用于导入 Amazon S3 文件的会话令牌的可选文本字符串。默认值为 NULL。如果您提供了可选的 session_token,则可以使用临时凭证。

数据库实例之间传输 PostgreSQL 数据库

通过将 PostgreSQL 可传输数据库用于 Amazon RDS,您可以在两个数据库实例之间传输 PostgreSQL 数据库。这提供了一种非常快的方法,以便在不同的数据库实例之间迁移大型数据库。要使用该方法传输数据库,两个数据库实例必须运行相同的 PostgreSQL 主要版本。

要使用可传输数据库,请安装 pg_transport 扩展。该扩展提供了物理传输机制以移动每个数据库。通过以最少的处理流式传输数据库文件,物理传输移动数据的速度比传统的转储和加载过程快得多,并将停机时间降到最低。PostgreSQL 可传输数据库使用拉取模式,其中,目标数据库实例从源数据库实例导入数据库。

注意

PostgreSQL 可传输数据库运行 RDS for PostgreSQL 10.10 和更高版本以及 11.5 和更高版本。

使用 PostgreSQL 可传输数据库的限制

可传输数据库具有以下限制:

  • 只读副本 – 您不能在只读副本或只读副本的父实例上使用可传输数据库。

  • 不支持的列类型 – 您不能在打算使用该方法传输的任何数据库表中使用 reg 数据类型。这些类型取决于系统目录对象 ID (OID),这些 ID 在传输过程中经常发生变化。

  • 表空间 – 所有源数据库对象必须位于默认 pg_default 表空间中。

  • 兼容性 – 源和目标数据库实例必须运行相同的 PostgreSQL 主要版本。

    在开始传输之前,transport.import_from_server 函数比较源和目标数据库实例以确保数据库兼容性。这包括验证 PostgreSQL 主要版本兼容性。此外,该函数还会验证目标数据库实例是否可能具有足够的空间以接收源数据库。该函数执行一些额外的检查,以确保顺利执行传输过程。

  • 扩展 – 在传输期间,可以在源数据库实例上安装的唯一扩展是 pg_transport

  • 角色和 ACL – 源数据库的访问权限和所有权信息不会传输到目标数据库。所有数据库对象是由传输的本地目标用户创建和拥有的。

  • 并发传输 – 您总共可以在数据库实例上同时运行 32 个传输,包括导入和导出。要定义用于每个传输的工作进程,请使用 pg_transport.work_mempg_transport.num_workers 参数。为了满足并发传输要求,您可能需要大幅增加 max_worker_processes 参数。有关更多信息,请参阅 pg_transport 扩展的配置参数

设置以传输 PostgreSQL 数据库

要准备将 PostgreSQL 数据库从一个数据库实例传输到另一个数据库实例,请执行以下步骤。

设置以传输 PostgreSQL 数据库

  1. 确保源数据库实例的安全组允许来自目标数据库实例的入站流量。这是必需的,因为目标数据库实例通过对源数据库实例进行导入调用以启动数据库传输。有关如何使用安全组的信息,请参阅使用安全组控制访问权限

  2. 对于源和目标数据库实例,请将 pg_transport 添加到每个参数组的 shared_preload_libraries 参数中。shared_preload_libraries 参数是静态的,并需要重新启动数据库以使更改生效。有关参数组的信息,请参阅使用数据库参数组

  3. 对于源和目标数据库实例,请安装所需的 pg_transport PostgreSQL 扩展。

    为此,以具有 rds_superuser 角色的用户身份为每个数据库实例启动 psql,然后运行以下命令。

    psql=> CREATE EXTENSION pg_transport;

使用 transport.import_from_server 函数传输 PostgreSQL 数据库

在完成 设置以传输 PostgreSQL 数据库中所述的过程后,您可以启动传输。为此,请在目标数据库实例上运行 transport.import_from_server 函数。

注意

传输的目标用户和连接的源用户必须是 rds_superuser 角色的成员。

目标数据库实例不能已包含名称与要传输的源数据库相同的数据库,否则,传输将会失败。

下面显示了一个示例传输。

SELECT transport.import_from_server( 'source-db-instance-endpoint', source-db-instance-port, 'source-db-instance-user', 'source-user-password', 'source-database-name', 'destination-user-password', false);

该函数要求您提供数据库用户密码。因此,在传输完成后,我们建议您更改使用的用户角色的密码。或者,您可以使用 SQL 绑定变量创建临时用户角色。使用这些临时角色进行传输,然后丢弃这些角色。

有关 transport.import_from_server 函数及其参数的详细信息,请参阅 transport.import_from_server 函数参考

在数据库传输期间发生的情况

transport.import_from_server 函数在目标数据库实例上创建传输中的数据库。在传输期间,无法在目标数据库实例上访问传输中的数据库。

在传输开始时,源数据库上的所有当前会话将会结束。源数据库实例上的源数据库以外的任何数据库不受传输影响。

源数据库被置于特殊只读模式。在处于该模式时,您可以连接到源数据库并运行只读查询。不过,阻止启用了写入的查询和某些其他类型的命令。仅正在传输的特定源数据库受这些限制的影响。

在传输期间,您无法将目标数据库实例还原到某个时间点。这是因为传输不是事务性的,并且不使用 PostgreSQL 预写日志记录更改。如果目标数据库实例启用了自动备份,则会在传输完成后自动创建备份。时间点还原适用于备份完成后的时间。

如果传输失败,pg_transport 扩展将尝试撤消对源和目标数据库实例的所有更改。这包括删除目标的部分传输的数据库。根据失败类型,源数据库可能会继续拒绝启用了写入的查询。如果发生这种情况,请使用以下命令允许启用了写入的查询。

ALTER DATABASE my-database SET default_transaction_read_only = false;

transport.import_from_server 函数参考

transport.import_from_server 函数将 PostgreSQL 数据库从源数据库实例导入到目标数据库实例以传输该数据库。它使用物理数据库连接传输机制以执行该操作。

语法

transport.import_from_server( host text, port int, username text, password text, database text, local_password text, dry_run bool )

返回值

无。

参数

您可以在下表中找到 transport.import_from_server 函数参数说明。

参数 说明
host

源数据库实例的终端节点。

port 表示源数据库实例端口的整数。

PostgreSQL 数据库实例通常使用端口 5432。

username

源数据库实例的用户。该用户必须是 rds_superuser 角色的成员。

password

源数据库实例的用户密码。

database

源数据库实例中要传输的数据库的名称。

local_password

目标数据库实例的当前用户的本地密码。该用户必须是 rds_superuser 角色的成员。

dry_run

可选的布尔值,指定是否执行试运行。默认值为 false,这表示传输继续进行。

要确认源和目标数据库实例之间的兼容性而不执行实际传输,请将 dry_run 设置为 true

示例

有关示例,请参阅 使用 transport.import_from_server 函数传输 PostgreSQL 数据库

pg_transport 扩展的配置参数

可以使用以下参数配置 pg_transport 扩展行为。

SET pg_transport.num_workers = integer; SET pg_transport.work_mem = kilobytes; SET pg_transport.timing = Boolean;

您可以在下表中找到这些参数的说明。

参数 说明
pg_transport.num_workers

要用于物理传输的工作线程数。默认值为 3。有效值为 1–32。即使少于 8 个工作线程,大型传输通常也会达到最大吞吐量。

在传输期间,将在目标和源数据库实例上使用目标数据库实例中的 pg_transport.num_workers 设置。

一个相关的参数是 PostgreSQL max_worker_processes 参数。传输过程创建几个后台工作进程。因此,pg_transport.num_workers 参数设置可能要求您在源和目标数据库实例上将 max_worker_processes 参数设置为高得多的值。

我们建议您将源和目标数据库实例上的 max_worker_processes 设置为目标数据库实例的 pg_transport.num_workers 参数设置的至少三倍。再添加一些进程以提供非传输后台工作进程。

有关 max_worker_processes 参数的更多信息,请参阅有关异步行为的 PostgreSQL 文档。

pg_transport.timing

一个布尔值,指定是否在传输期间报告计时信息。默认值为 true。有效值是 true(报告计时信息)和 false(禁止报告计时信息)。

我们建议您不要将该参数设置为 false。如果禁用 pg_transport.timing,则会大大降低您跟踪传输进度的能力。

pg_transport.work_mem

为每个工作线程分配的最大内存量。默认值为 131,072 千字节 (KB)。最小值为 64 兆字节 (65,536 KB)。有效值是以二进制单位表示的千字节 (KB),其中 1 KB = 1,024 字节。

传输使用的内存不能超过该参数中指定的值。即使每个工作线程的内存少于 256 MB (262,144 KB),大型传输通常也会达到最大吞吐量。