使用 Amazon Aurora PostgreSQL 支持的外部数据包装器 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon Aurora PostgreSQL 支持的外部数据包装器

外部数据包装器 (FDW) 是一种特定类型的扩展,提供对外部数据的访问。例如,oracle_fdw 扩展允许您的 Aurora PostgreSQL 数据库实例 使用 Oracle 数据库。

在下文中,您可以了解有关几种支持的 PostgreSQL 外部数据包装器的信息。

通过使用 oracle_fdw 扩展来使用 Oracle 数据库

要从 Aurora PostgreSQL 数据库集群 访问 Oracle 数据库,您可以安装并使用 oracle_fdw 扩展。此扩展是 Oracle 数据库的外部数据包装器。要了解有关此扩展的更多信息,请参阅 oracle_fdw 文档。

Aurora PostgreSQL 12.7(Amazon Aurora PostgreSQL 版本 4.2)及更高版本支持 oracle_fdw 扩展。

启用 oracle_fdw 扩展

要使用 oracle_fdw 扩展,请执行以下步骤。

启用 oracle_fdw 扩展
  • 使用具有 rds_superuser 权限的账户运行以下命令。

    CREATE EXTENSION oracle_fdw;

示例:使用链接到 Amazon RDS for Oracle Database 的外部服务器

以下示例展示如何使用链接到 Amazon RDS for Oracle Database 的外部服务器。

创建链接到 RDS for Oracle 数据库的外部服务器
  1. 请注意 RDS for Oracle 数据库实例上的以下内容:

    • Endpoint

    • 端口

    • 数据库名称

  2. 创建外部服务器。

    test=> CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//endpoint:port/DB_name'); CREATE SERVER
  3. 将使用权授予没有 rds_superuser 权限的用户,例如 user1

    test=> GRANT USAGE ON FOREIGN SERVER oradb TO user1; GRANT
  4. 作为 user1 连接并创建到 Oracle 用户的映射。

    test=> CREATE USER MAPPING FOR user1 SERVER oradb OPTIONS (user 'oracleuser', password 'mypassword'); CREATE USER MAPPING
  5. 创建链接到 Oracle 表的外部表。

    test=> CREATE FOREIGN TABLE mytab (a int) SERVER oradb OPTIONS (table 'MYTABLE'); CREATE FOREIGN TABLE
  6. 查询外部表。

    test=> SELECT * FROM mytab; a --- 1 (1 row)

如果查询报告以下错误,请检查您的安全组和访问控制列表(ACL)以确保两个实例可以通信。

ERROR: connection for foreign table "mytab" cannot be established DETAIL: ORA-12170: TNS:Connect timeout occurred

在传输过程中使用加密

PostgreSQL-to-Oracle 传输中加密基于客户端和服务器配置参数的组合。有关使用 Oracle 21c 的示例,请参阅 Oracle 文档中的关于协商加密和完整性的值。用于 Amazon RDS 上 oracle_fdw 的客户端配置有 ACCEPTED,这意味着加密取决于 Oracle 数据库服务器配置。

如果您的数据库位于 RDS for Oracle 上,请参阅 Oracle 本机网络加密来配置加密。

了解 pg_user_mappings 视图和权限

PostgreSQL 目录 pg_user_mapping 存储 Aurora PostgreSQL 用户到外部数据(远程)服务器上用户的映射。虽然对目录的访问受到限制,但是您可以使用 pg_user_mappings 视图来查看映射。在下面,您可以找到一个示例,该示例演示如何将权限应用于示例 Oracle 数据库,但此信息更普遍地适用于任何外部数据包装器。

在以下输出中,您可以找到映射到三个不同示例用户的角色和权限。用户 rdssu1rdssu2rds_superuser 角色的成员,而 user1 不是。此示例使用 psql 元命令 \du 列出现有角色。

test=> \du List of roles Role name | Attributes | Member of -----------------+------------------------------------------------------------+------------------------------------------------------------- rdssu1 | | {rds_superuser} rdssu2 | | {rds_superuser} user1 | | {}

所有用户,包括具有 rds_superuser 权限的用户,都可以查看 pg_user_mappings 表中他们自己的用户映射 (umoptions)。如以下示例所示,当 rdssu1 尝试获取所有用户映射时,即使存在 rdssu1rds_superuser 权限,也会出现错误:

test=> SELECT * FROM pg_user_mapping; ERROR: permission denied for table pg_user_mapping

下面是一些示例。

test=> SET SESSION AUTHORIZATION rdssu1; SET test=> SELECT * FROM pg_user_mappings; umid | srvid | srvname | umuser | usename | umoptions -------+-------+---------+--------+------------+---------------------------------- 16414 | 16411 | oradb | 16412 | user1 | 16423 | 16411 | oradb | 16421 | rdssu1 | {user=oracleuser,password=mypwd} 16424 | 16411 | oradb | 16422 | rdssu2 | (3 rows) test=> SET SESSION AUTHORIZATION rdssu2; SET test=> SELECT * FROM pg_user_mappings; umid | srvid | srvname | umuser | usename | umoptions -------+-------+---------+--------+------------+---------------------------------- 16414 | 16411 | oradb | 16412 | user1 | 16423 | 16411 | oradb | 16421 | rdssu1 | 16424 | 16411 | oradb | 16422 | rdssu2 | {user=oracleuser,password=mypwd} (3 rows) test=> SET SESSION AUTHORIZATION user1; SET test=> SELECT * FROM pg_user_mappings; umid | srvid | srvname | umuser | usename | umoptions -------+-------+---------+--------+------------+-------------------------------- 16414 | 16411 | oradb | 16412 | user1 | {user=oracleuser,password=mypwd} 16423 | 16411 | oradb | 16421 | rdssu1 | 16424 | 16411 | oradb | 16422 | rdssu2 | (3 rows)

由于 information_schema._pg_user_mappingspg_catalog.pg_user_mappings 的实施差异,手动创建的 rds_superuser 需要额外的权限才能在 pg_catalog.pg_user_mappings 中查看密码。

rds_superuser 无需额外权限即可在 information_schema._pg_user_mappings 中查看密码。

没有 rds_superuser 角色的用户只能在以下条件下在 pg_user_mappings 中查看密码:

  • 当前用户是被映射的用户,拥有服务器或对其具有 USAGE 权限。

  • 当前用户是服务器所有者,此映射用于 PUBLIC

通过使用 tds_fdw 扩展来使用 SQL Server 数据库

您可以使用 PostgreSQL tds_fdw 扩展来访问支持表格数据流 (TDS) 协议的数据库,例如 Sybase 和 Microsoft SQL Server 数据库。此外部数据包装器可让您从 Aurora PostgreSQL 数据库集群连接到使用 TDS 协议的数据库,包括 Amazon RDS for Microsoft SQL Server。有关更多信息,请参阅 GitHub 上的 tds-fdw/tds_fdw 文档。

Amazon Aurora PostgreSQL 版本 13.6 及更高版本支持该 tds_fdw 扩展。

将 RDS for PostgreSQL 数据库设置为使用 tds_fdw 扩展

在以下过程中,您可以找到设置 tds_fdw 并将其与 Aurora PostgreSQL 数据库集群结合使用的示例。在可以使用 tds_fdw 连接到 SQL Server 数据库之前,您需要获取实例的以下详细信息:

  • 主机名或终端节点。对于 RDS for SQL Server 数据库实例,您可以使用控制台查找终端节点。选择 Connectivity & security(连接和安全)选项卡,然后查看 Endpoint and port(终端节点和端口)部分。

  • 端口号。Microsoft SQL Server 的默认端口是 1433。

  • 数据库的名称。数据库标识符。

您还需要为 SQL Server 端口 1433 提供对安全组或访问控制列表 (ACL) 的访问权限。Aurora PostgreSQL 数据库集群和 RDS for SQL Server 数据库实例都需要访问端口 1433。如果访问权限配置不正确,当您尝试查询 Microsoft SQL Server 时,会看到以下错误消息:

ERROR: DB-Library error: DB #: 20009, DB Msg: Unable to connect: Adaptive Server is unavailable or does not exist (mssql2019.aws-region.rds.amazonaws.com), OS #: 0, OS Msg: Success, Level: 9
使用 tds_fdw 连接到 SQL Server 数据库
  1. 使用具有 rds_superuser 角色的账户连接到您的 Aurora PostgreSQL 数据库集群的主要实例

    psql --host=your-cluster-name-instance-1.aws-region.rds.amazonaws.com --port=5432 --username=test –-password
  2. 安装 tds_fdw 扩展:

    test=> CREATE EXTENSION tds_fdw; CREATE EXTENSION

Aurora PostgreSQL 数据库集群上安装扩展后,应设置外部服务器。

创建外部服务器

使用具有 rds_superuser 权限的账户在 Aurora PostgreSQL 数据库集群上执行这些任务。

  1. Aurora PostgreSQL 数据库集群中创建外部服务器:

    test=> CREATE SERVER sqlserverdb FOREIGN DATA WRAPPER tds_fdw OPTIONS (servername 'mssql2019.aws-region.rds.amazonaws.com, port '1433', database 'tds_fdw_testing'); CREATE SERVER
  2. 向没有 rds_superuser 角色权限的用户授予权限,例如 user1

    test=> GRANT USAGE ON FOREIGN SERVER sqlserverdb TO user1;
  3. 以 user1 身份进行连接,然后创建到 SQL Server 用户的映射:

    test=> CREATE USER MAPPING FOR user1 SERVER sqlserverdb OPTIONS (username 'sqlserveruser', password 'password'); CREATE USER MAPPING
  4. 创建链接到 SQL Server 表的外部表:

    test=> CREATE FOREIGN TABLE mytab (a int) SERVER sqlserverdb OPTIONS (table 'MYTABLE'); CREATE FOREIGN TABLE
  5. 查询外部表:

    test=> SELECT * FROM mytab; a --- 1 (1 row)

使用传输中的加密进行连接

Aurora PostgreSQL 到 SQL Server 的连接使用传输中加密 (TLS/SSL),具体取决于 SQL Server 数据库配置。如果 SQL Server 未配置为加密,则向 SQL Server 数据库发出请求的 RDS for PostgreSQL 客户端将回退到未加密状态。

您可以通过设置 rds.force_ssl 参数对与 RDS for SQL Server 数据库实例的连接进行加密。要了解操作方法,请参阅强制与数据库实例的连接使用 SSL。有关 RDS for SQL Server 的 SSL/TLS 配置的更多信息,请参阅将 SSL 与 Microsoft SQL Server 数据库实例结合使用