Amazon Aurora
Aurora 用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

将数据迁移到与 PostgreSQL 兼容的 Amazon Aurora

对于将数据从现有数据库迁移到 与 PostgreSQL 兼容的 Amazon Aurora 数据库集群,您有多种选择。您的迁移选项还取决于您从中迁移数据的数据库和您迁移数据的规模。以下是您的选择:

从 RDS PostgreSQL 数据库实例迁移

您可以将数据直接从 Amazon RDS PostgreSQL 数据库快照迁移到 Aurora PostgreSQL 数据库集群。有关更多信息,请参阅将 RDS PostgreSQL 数据库快照迁移到 Aurora PostgreSQL 数据库集群

也可以通过创建 PostgreSQL 数据库实例的 Aurora PostgreSQL 只读副本从 RDS PostgreSQL 数据库实例进行迁移。当 PostgreSQL 数据库实例和 Aurora PostgreSQL 只读副本之间的副本滞后为 0 时,您可以停止复制。此时,您可以将 Aurora 只读副本作为独立的 Aurora PostgreSQL 数据库集群以进行读取和写入。有关更多信息,请参阅使用 Aurora 只读副本将数据从 RDS PostgreSQL 数据库实例迁移到 Aurora PostgreSQL 数据库集群

从与 PostgreSQL 不兼容的数据库迁移

您可以使用 AWS Database Migration Service (AWS DMS) 从非 PostgreSQL 兼容数据库中迁移数据。有关 AWS DMS 的更多信息,请参阅什么是 AWS Database Migration Service?

导入 Amazon S3 数据

您可以通过将数据从 Amazon S3 导入到属于 RDS PostgreSQL 数据库实例的 Aurora PostgreSQL 数据库集群的表中来进行迁移。有关更多信息,请参阅将 Amazon S3 数据导入到 Aurora PostgreSQL 数据库集群

有关 Aurora 可用的 AWS 区域的列表,请参阅 AWS General Reference 中的 Amazon Aurora

将 RDS PostgreSQL 数据库快照迁移到 Aurora PostgreSQL 数据库集群

要创建 Aurora PostgreSQL 数据库集群,您可以迁移 RDS PostgreSQL 数据库实例的数据库快照。将使用原始 RDS PostgreSQL 数据库实例中的数据填充新的 Aurora PostgreSQL 数据库集群。数据库快照必须来自运行 PostgreSQL 9.6.1 或 9.6.3 的 RDS 数据库实例。有关创建数据库快照的信息,请参阅创建数据库快照

在某些情况下,数据库快照可能不在要查找数据的 AWS 区域中。如果是这样的话,请使用 Amazon RDS 控制台将数据库快照复制到该 AWS 区域。有关复制数据库快照的信息,请参阅复制数据库快照

使用控制台迁移数据库快照时,控制台将执行必要的操作创建数据库集群和主实例。

您还可以选择使用 AWS Key Management Service (AWS KMS) 加密密钥静态加密新的 Aurora PostgreSQL 数据库集群。该选项仅适用于未加密的数据库快照。

使用 RDS 控制台迁移 PostgreSQL 数据库快照

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

  2. 选择 Snapshots (快照)

  3. Snapshots (快照) 页面上,选择要迁移到 Aurora PostgreSQL 数据库集群的快照。

  4. 选择 Migrate Database

  5. Migrate Database (迁移数据库) 页面上设置以下值:

    • DB Instance Class:选择具有数据库所需的存储和容量的数据库实例类,例如 db.r3.large。Aurora 集群卷随数据库中的数据量增长而自动扩展,最多达到 64 tebibytes (TiB) 的最大大小。因此,您只需选择满足当前存储要求的数据库实例类。有关更多信息,请参阅Aurora 存储概述

    • DB Instance Identifier (数据库实例标识符):为数据库集群输入一个名称,该名称在您选择的 AWS 区域中对于您的账户是唯一的。此标识符将在数据库集群中实例的终端节点地址中使用。您可以选择对该名称进行一些巧妙处理,例如,包括选定的 AWS 区域和数据库引擎(例如 aurora-cluster1)。

      数据库实例标识符具有以下限制:

      • 它必须包含 1–63 个字母数字字符或连字符。

      • 它的第一个字符必须是字母。

      • 它不能以连字符结尾,也不能包含两个连续连字符。

      • 它对于每个 AWS 区域的每个 AWS 账户的所有数据库实例必须是唯一的。

    • VPC:如果您已经有 VPC,则可以通过选择您的 VPC 标识符(例如 vpc-a464d1c1)将该 VPC 用于 Aurora PostgreSQL 数据库集群。有关使用现有 VPC 的信息,请参阅如何创建 VPC 以用于 Amazon Aurora

      否则,可以通过选择 Create a new VPC (新建 VPC),让 Amazon RDS 为您创建 VPC。

    • Subnet Group (子网组):如果已具有子网组,则可通过选择您的子网组标识符(例如 gs-subnet-group1)来将该子网组用于 Aurora PostgreSQL 数据库集群。

      否则,可以通过选择 Create a new subnet group (创建新子网组),让 Amazon RDS 为您创建子网组。

    • Publicly Accessible (公开访问):选择 No (否) 可指定数据库集群中的实例只能由 VPC 内的资源访问。选择 Yes (是) 可指定数据库集群中的实例可以由公用网络上的资源访问。默认值为 Yes (是)

      注意

      您的生产数据库集群可能不需要位于公有子网中,因为仅应用程序服务器将需要访问数据库集群。如果数据库集群不需要位于公有子网中,请将 Publicly Accessible (公开访问) 设置为 No (否)

    • Availability Zone (可用区):选择为 Aurora PostgreSQL 数据库集群托管主实例的可用区。要让 Amazon RDS 为您选择可用区,请选择 No Preference (无首选项)

    • Database Port (数据库端口):输入在连接到 Aurora PostgreSQL 数据库集群中的实例时使用的默认端口。默认为 5432

      注意

      您可能位于企业防火墙后面,该防火墙不允许访问默认端口 (例如,PostgreSQL 默认端口 5432)。在此情况下,请提供企业防火墙允许的端口值。请记住此端口值,以便在稍后连接到 Aurora PostgreSQL 数据库集群时使用。

    • Enable Encryption (启用加密):对于要静态加密的新 Aurora PostgreSQL 数据库集群,请选择 Yes (是)。如果您选择 Yes (是),也请选择 AWS KMS 加密密钥作为 Master Key (主密钥) 值。

    • Auto minor version upgrade (自动次要版本升级):选择 Enable auto minor version upgrade (启用自动次要版本升级) 可让您的 Aurora PostgreSQL 数据库集群在次要 PostgreSQL 数据库引擎版本升级可用时自动接收这些升级。

      Auto Minor Version Upgrade (自动次要版本升级) 选项仅适用于升级到 Aurora PostgreSQL 数据库集群的 PostgreSQL 次要引擎版本。它不适用于应用于维持系统稳定性的常规修补程序。

  6. 选择 Migrate 以迁移您的数据库快照。

  7. 选择 Instances,然后选择箭头图标以显示数据库集群详细信息并监控迁移的进度。在详细信息页面上,您可以找到用于连接到数据库集群的主实例的集群终端节点。有关连接到 Aurora PostgreSQL 数据库集群的更多信息,请参阅连接到 Amazon Aurora 数据库集群

使用 Aurora 只读副本将数据从 RDS PostgreSQL 数据库实例迁移到 Aurora PostgreSQL 数据库集群

可使用 Aurora 只读副本从 PostgreSQL 数据库实例迁移到 Aurora PostgreSQL 数据库集群。在需要从 RDS PostgreSQL 数据库实例迁移到 Aurora PostgreSQL 数据库集群时,我们建议您使用此方法。

在此情况下,Amazon RDS 使用 PostgreSQL 数据库引擎的流式复制功能为源 PostgreSQL 数据库实例创建一个特殊类型的数据库集群。此类数据库集群称作 Aurora 只读副本。对源 PostgreSQL 数据库实例的更新将异步复制到 Aurora 只读副本。

使用 Aurora 只读副本迁移数据概览

要从 RDS PostgreSQL 数据库实例迁移到 Aurora PostgreSQL 数据库集群,我们建议您创建源 PostgreSQL 数据库实例的 Aurora 只读副本。当 PostgreSQL 数据库实例和 Aurora PostgreSQL 只读副本之间的副本滞后为 0 时,您可以停止复制。此时,您可以将 Aurora 只读副本提升为独立的 Aurora PostgreSQL 数据库集群。然后,此独立的数据库集群可以接受写入负载。

准备迁移需要花费一段时间,每 TiB 数据大约需要几小时。在迁移期间,Amazon RDS PostgreSQL 实例将累积提前写入日志 (WAL) 段。确保 Amazon RDS 实例具有足够的存储容量来容纳这些段。

在创建 PostgreSQL 数据库实例的 Aurora 只读副本时,Amazon RDS 会为源 PostgreSQL 数据库实例创建数据库快照。此快照是 Amazon RDS 专用的,不会产生费用。之后,Amazon RDS 会将数据从数据库快照迁移到 Aurora 只读副本。在将数据库快照数据迁移到新的 Aurora PostgreSQL 数据库集群后,RDS 在 PostgreSQL 数据库实例和 Aurora PostgreSQL 数据库集群之间开始复制。

一个 PostgreSQL 数据库实例只能有一个 Aurora 只读副本。如果您尝试为 Amazon RDS PostgreSQL 实例创建 Aurora 只读副本,但已具有只读副本,则该请求将被拒绝。

注意

由于 Aurora PostgreSQL 和作为复制主体的 RDS PostgreSQL 数据库实例的 PostgreSQL 引擎版本之间的功能不同,可能导致复制问题。您只能从与所讨论的 Aurora PostgreSQL 版本兼容的 Amazon RDS PostgreSQL 实例中复制。例如,如果支持的 Aurora PostgreSQL 版本为 9.6.3,则 Amazon RDS PostgreSQL 数据库实例必须运行 9.6.1 或更高版本。如果遇到错误,您可以在 Amazon RDS 社区论坛或联系 AWS Support 以获得帮助。

有关 PostgreSQL 只读副本的更多信息,请参阅 Amazon RDS 用户指南 中的使用只读副本

准备使用 Aurora 只读副本迁移数据

在将数据从 RDS PostgreSQL 实例迁移到 Aurora PostgreSQL 集群之前,请确保您的实例具有足够的存储容量。此存储容量用于迁移期间累积的提前写入日志 (WAL) 段。可以使用几个指标来检查此情况,如下所述。

指标 说明

FreeStorageSpace

可用存储空间。

单位:字节

OldestReplicationSlotLag

最滞后的副本中的 WAL 数据的滞后大小。

单位:MB

RDSToAuroraPostgreSQLReplicaLag

Aurora PostgreSQL 数据库集群滞后于源 RDS 数据库实例的时间长度(以秒为单位)。

TransactionLogsDiskUsage

事务日志使用的磁盘空间。

单位:MB

有关监控 RDS 实例的更多信息,请参阅 Amazon RDS 用户指南 中的监控

创建 Aurora 只读副本

您可以使用控制台或 AWS CLI 为 PostgreSQL 数据库实例创建 Aurora 只读副本。

控制台

从源 PostgreSQL 数据库实例创建 Aurora 只读副本

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

  2. 在导航窗格中,选择 Databases (数据库)

  3. 选择要作为 Aurora 只读副本来源的 PostgreSQL 数据库实例,然后为 Actions (操作) 选择 Create Aurora Read Replica (创建 Aurora 只读副本)

    
                                    创建 Aurora 只读副本
  4. 按照下表所述,选择 Aurora 只读副本要使用的数据库集群规格。

    选项 描述

    数据库实例类

    选择定义数据库集群中主实例的处理和内存要求的数据库实例类。有关数据库实例类选项的更多信息,请参阅选择数据库实例类

    多可用区部署

    选择 Create Replica in Different Zone (在其他区域创建副本) 可在目标 AWS 区域的另一个可用区中创建新数据库集群的写入器实例。有关多可用区的详细信息,请参阅选择区域和可用区

    数据库实例标识符

    输入 Aurora 只读副本数据库集群中主实例的名称。此标识符在新数据库集群主实例的终端节点地址中使用。

    数据库实例标识符具有以下限制:

    • 它必须包含 1–63 个字母数字字符或连字符。

    • 它的第一个字符必须是字母。

    • 它不能以连字符结尾,也不能包含两个连续连字符。

    • 它对于每个 AWS 区域每个 AWS 账户的所有数据库实例必须是唯一的。

    Aurora 只读副本数据库集群是从源数据库实例快照创建的。因此,Aurora 只读副本的主用户名和主密码与源数据库实例的主用户名和主密码相同。

    Virtual Private Cloud (VPC)

    选择要托管数据库集群的 VPC。选择 Create a new VPC (新建 VPC) 以让 Amazon RDS 为您创建 VPC。有关更多信息,请参阅数据库集群先决条件

    子网组

    选择要用于数据库集群的数据库子网组。选择 Create new DB Subnet Group (创建新的数据库子网组) 以让 Amazon RDS 为您创建数据库子网组。有关更多信息,请参阅数据库集群先决条件

    公开可用性

    选择 Yes (是) 可向数据库集群提供公有 IP 地址;否则,请选择 No (否)。数据库集群可以混合使用公有和私有数据库实例。有关隐藏实例以防止公开访问的更多信息,请参阅从 Internet 隐藏 VPC 中的数据库实例

    可用区

    确定您是否希望指定特定的可用区。有关可用区的更多信息,请参阅选择区域和可用区

    VPC 安全组

    选择一个或多个 VPC 安全组以保护对数据库集群的网络访问。选择 Create new VPC security group (新建 VPC 安全组) 以让 Amazon RDS 为您创建 VPC 安全组。有关更多信息,请参阅数据库集群先决条件

    数据库端口

    指定应用程序和实用程序用来访问数据库的端口。Aurora PostgreSQL 数据库集群默认为使用默认 PostgreSQL 端口 5432。有些公司的防火墙不允许连接到此端口。如果您的公司防火墙阻止使用默认端口,请为新数据库集群选择其他端口。

    数据库参数组

    为 Aurora PostgreSQL 数据库集群选择数据库参数组。Aurora 具有一个可使用的默认数据库参数组,您也可以创建自己的数据库参数组。有关数据库参数组的更多信息,请参阅 使用数据库参数组和数据库集群参数组

    数据库集群参数组

    为 Aurora PostgreSQL 数据库集群选择数据库集群参数组。Aurora 具有一个可使用的默认数据库集群参数组,您也可以创建自己的数据库集群参数组。有关数据库集群参数组的更多信息,请参阅 使用数据库参数组和数据库集群参数组

    加密

    为要静态加密的新 Aurora 数据库集群选择启用加密。如果选择 Enable encryption (启用加密),请也选择一个 AWS KMS 加密密钥作为 Master key (主密钥) 值。

    优先级

    选择数据库集群的故障转移优先级。如果您未选择值,则默认值为 tier-1。此优先级决定从主实例故障恢复时提升 Aurora 副本的顺序。有关更多信息,请参阅Aurora 数据库集群的容错能力

    备份保留期

    为 Aurora 选择将保留数据库的备份副本的时间长度(1–35 天)。可使用备份副本对数据库执行时间点还原 (PITR),以还原到第二个时间点。

    增强监测

    选择启用增强监控可启用您的数据库集群在其上运行的操作系统的实时指标收集。有关更多信息,请参阅增强监测

    监控角色

    仅在选择 Enable enhanced monitoring (启用增强监控) 时可用。要用于增强监控的 AWS Identity and Access Management (IAM) 角色。有关更多信息,请参阅设置和启用增强监测

    粒度

    仅在选择 Enable enhanced monitoring (启用增强监控) 时可用。设置为数据库集群收集指标的时间间隔(以秒为单位)。

    自动次要版本升级

    选择 Yes (是) 以使 Aurora PostgreSQL 数据库集群能够在次要 PostgreSQL 数据库引擎版本升级可用时自动接收这些升级。

    Auto minor version upgrade (自动次要版本升级) 选项仅适用于升级到 Aurora PostgreSQL 数据库集群的 PostgreSQL 次要引擎版本。它不适用于应用于维持系统稳定性的常规修补程序。

    维护时段

    选择可以进行系统维护的每周时间范围。

  5. 选择创建只读副本

AWS CLI

要从源 PostgreSQL 数据库实例创建 Aurora 只读副本,请使用 create-db-cluster create-db-instance AWS CLI 命令创建新的 Aurora PostgreSQL 数据库集群。当您调用 create-db-cluster 命令时,请加入 --replication-source-identifier 参数,识别源 PostgreSQL 数据库实例的 Amazon 资源名称 (ARN)。有关 Amazon RDS ARN 的更多信息,请参阅 AWS General Reference 中的 Amazon Relational Database Service (Amazon RDS)

请勿指定主用户名、主密码或数据库名称。Aurora 只读副本使用与源 PostgreSQL 数据库实例相同的主用户名、主密码和数据库名称。

针对 Linux、OS X 或 Unix:

aws rds create-db-cluster --db-cluster-identifier sample-replica-cluster --engine aurora-postgresql \ --db-subnet-group-name mysubnetgroup --vpc-security-group-ids sg-c7e5b0d2 \ --replication-source-identifier arn:aws-cn:rds:us-west-2:123456789012:db:master-postgresql-instance

对于 Windows:

aws rds create-db-cluster --db-cluster-identifier sample-replica-cluster --engine aurora-postgresql ^ --db-subnet-group-name mysubnetgroup --vpc-security-group-ids sg-c7e5b0d2 ^ --replication-source-identifier arn:aws-cn:rds:us-west-2:123456789012:db:master-postgresql-instance

如果您使用控制台创建 Aurora 只读副本,RDS 将自动为您的数据库集群 Aurora 只读副本创建主实例。如果您使用 CLI 创建 Aurora 只读副本,则必须明确为数据库集群创建主实例。主实例是在数据库集群中创建的第一个实例。

您可以使用带以下参数的 create-db-instance CLI 命令为数据库集群创建主实例。

  • --db-cluster-identifier

    数据库集群的名称。

  • --db-instance-class

    要用于主实例的数据库实例类的名称。

  • --db-instance-identifier

    主实例的名称。

  • --engine aurora-postgresql

    要使用的数据库引擎。

在以下示例中,您为名为 myreadreplicacluster 的数据库集群创建名为 myreadreplicainstance 的主实例。您可以使用 myinstanceclass 中指定的数据库实例类来实现此目的。

针对 Linux、OS X 或 Unix:

aws rds create-db-instance \ --db-cluster-identifier myreadreplicacluster \ --db-instance-class myinstanceclass --db-instance-identifier myreadreplicainstance \ --engine aurora-postgresql

对于 Windows:

aws rds create-db-instance \ --db-cluster-identifier myreadreplicacluster \ --db-instance-class myinstanceclass --db-instance-identifier myreadreplicainstance \ --engine aurora-postgresql

RDS API

要从源 PostgreSQL 数据库实例创建 Aurora 只读副本,请使用 RDS API 操作 CreateDBClusterCreateDBInstance 创建新的 Aurora 数据库集群和主实例。请勿指定主用户名、主密码或数据库名称。Aurora 只读副本使用与源 PostgreSQL 数据库实例相同的主用户名、主密码和数据库名称。

您可以从源 PostgreSQL 数据库实例为 Aurora 只读副本创建新的 Aurora 数据库集群。为此,请使用带以下参数的 RDS API 操作 CreateDBCluster

  • DBClusterIdentifier

    要创建的数据库集群的名称。

  • DBSubnetGroupName

    要与该数据库集群关联的数据库子网组的名称。

  • Engine=aurora-postgresql

    要使用的引擎的名称。

  • ReplicationSourceIdentifier

    源 PostgreSQL 数据库实例的 Amazon 资源名称 (ARN)。有关 Amazon RDS ARN 的更多信息,请参阅 Amazon Web Services 一般参考 中的 Amazon Relational Database Service (Amazon RDS)

  • VpcSecurityGroupIds

    要与此数据库集群关联的 Amazon EC2 VPC 安全组的列表。

在以下示例中,您从源 PostgreSQL 数据库实例创建名为 myreadreplicacluster 的数据库集群。此集群的 ARN 已设置为 mysqlmasterARN。此集群与一个名为 mysubnetgroup 的数据库子网组和一个名为 mysecuritygroup 的 VPC 安全组关联。

https://rds.us-east-1.amazonaws.com/ ?Action=CreateDBCluster &DBClusterIdentifier=myreadreplicacluster &DBSubnetGroupName=mysubnetgroup &Engine=aurora-postgresql &ReplicationSourceIdentifier=mysqlmasterARN &SignatureMethod=HmacSHA256 &SignatureVersion=4 &Version=2014-10-31 &VpcSecurityGroupIds=mysecuritygroup &X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIADQKE4SARGYLE/20150927/us-east-1/rds/aws4_request &X-Amz-Date=20150927T164851Z &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date &X-Amz-Signature=6a8f4bd6a98f649c75ea04a6b3929ecc75ac09739588391cd7250f5280e716db

如果您使用控制台创建 Aurora 只读副本,Amazon RDS 将自动为您的数据库集群 Aurora 只读副本创建主实例。如果您使用 CLI 创建 Aurora 只读副本,则必须明确为数据库集群创建主实例。主实例是在数据库集群中创建的第一个实例。

您可以使用带以下参数的 RDS API 操作 CreateDBInstance 为数据库集群创建主实例:

  • DBClusterIdentifier

    数据库集群的名称。

  • DBInstanceClass

    要用于主实例的数据库实例类的名称。

  • DBInstanceIdentifier

    主实例的名称。

  • Engine=aurora-postgresql

    要使用的引擎的名称。

在此示例中,您为名为 myreadreplicacluster 的数据库集群创建名为 myreadreplicainstance 的主实例。您可以使用 myinstanceclass 中指定的数据库实例类来实现此目的。

https://rds.us-east-1.amazonaws.com/ ?Action=CreateDBInstance &DBClusterIdentifier=myreadreplicacluster &DBInstanceClass=myinstanceclass &DBInstanceIdentifier=myreadreplicainstance &Engine=aurora-postgresql &SignatureMethod=HmacSHA256 &SignatureVersion=4 &Version=2014-09-01 &X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIADQKE4SARGYLE/20140424/us-east-1/rds/aws4_request &X-Amz-Date=20140424T194844Z &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date &X-Amz-Signature=bee4aabc750bf7dad0cd9e22b952bd6089d91e2a16592c2293e532eeaab8bc77

提升 Aurora 只读副本

迁移完成后,您可以将 Aurora 只读副本提升为独立的数据库集群。然后,您将客户端应用程序引导到 Aurora 只读副本的终端节点。有关 Aurora 终端节点的更多信息,请参阅Amazon Aurora 连接管理。提升会很快完成。在提升完成之前,您无法删除 PostgreSQL 主数据库实例,或取消数据库实例和 Aurora 只读副本之间的链接。

在提升 Aurora 只读副本之前,禁止任何事务写入到源 PostgreSQL 数据库实例。然后等待 Aurora 只读副本的副本滞后达到 0。

在提升只读副本后,确认提升已完成。为此,在导航窗格中选择 Instances (实例),并确认只读副本具有一个 Promoted Read Replica cluster to stand-alone database cluster (已将只读副本集群提升为单独数据库集群) 事件。提升完成后,PostgreSQL 主数据库实例和 Aurora 只读副本之间的链接会取消。此时,如果您愿意,可以安全删除数据库实例。

控制台

将 Aurora 只读副本提升为 Aurora 数据库集群

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

  2. 在导航窗格中,选择 Instances

  3. 为 Aurora 只读副本选择数据库实例,然后为 Actions (操作) 选择 Promote Read Replica (提升只读副本)

  4. 选择 Promote Read Replica (提升只读副本)

AWS CLI

要将 Aurora 只读副本提升为独立数据库集群,请使用 promote-read-replica-db-cluster AWS CLI 命令。

针对 Linux、OS X 或 Unix:

aws rds promote-read-replica-db-cluster \ --db-cluster-identifier myreadreplicacluster

对于 Windows:

aws rds promote-read-replica-db-cluster ^ --db-cluster-identifier myreadreplicacluster

将 Amazon S3 数据导入到 Aurora PostgreSQL 数据库集群

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

注意

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

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

Amazon S3 数据导入概述

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

将 S3 数据导入到 Aurora PostgreSQL

  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 文件中导入数据,您需要为 Aurora 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 文件中导入数据,您需要为 Aurora PostgreSQL 数据库集群提供权限以访问该文件所在的 Amazon S3 存储桶。您可以通过两种方式提供 Amazon S3 存储桶的访问权限,如以下主题中所述。

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

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

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

通过 IAM 角色向 Aurora PostgreSQL 数据库集群授予访问 Amazon S3 的权限

  1. 创建一个 IAM 策略。该策略提供存储桶和对象权限,以允许 Aurora PostgreSQL 数据库集群访问 Amazon S3。

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

    • s3:GetObject

    • s3:ListBucket

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

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

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

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

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

    注意

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

    针对 Linux、OS X 或 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 角色。这样,Aurora PostgreSQL 就可以担任该 IAM 角色以代表您访问 Amazon S3 存储桶。有关更多信息,请参阅IAM 用户指南 中的创建向 IAM 用户委派权限的角色

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

    针对 Linux、OS X 或 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、OS X 或 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 执行该操作,如下所述。

控制台

使用控制台为 PostgreSQL 数据库集群添加 IAM 角色

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

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

  3. Connectivity & security (连接性和安全性) 选项卡上的 Manage IAM roles (管理 IAM 角色) 部分中,在 Add IAM roles to this instance (向此实例添加 IAM 角色) 下选择要添加的角色。

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

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

AWS CLI

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

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

    针对 Linux、OS X 或 Unix:

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

    对于 Windows:

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

使用安全凭证访问 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 文件导入到 Aurora 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 数据导入到 Aurora PostgreSQL 表中。aws_s3 扩展提供 aws_s3.table_import_from_s3 函数。

三个必需参数为 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 )

下表中描述了 aws_s3.table_import_from_s3 参数。

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

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

options

包含 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._s3_uri_1 复合结构,请参阅 aws_commons.create_s3_uri

credentials

包含以下用于导入操作的凭证的 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 )

在下表中查找这些替代参数的描述。

参数 说明
bucket

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

file_path

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

region 包含文件所在的 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 )

下表中描述了 aws_commons.create_s3_uri 函数参数。

参数 说明
bucket

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

file_path

包含文件的 Amazon S3 路径的必需文本字符串。

region

包含文件所在的 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 )

下表中描述了 aws_commons.create_aws_credentials 函数参数。

参数 说明
access_key

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

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