使用 oracle_fdw 扩展访问 Aurora PostgreSQL 中的外部数据 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用 oracle_fdw 扩展访问 Aurora PostgreSQL 中的外部数据

为了轻松高效地访问 Aurora PostgreSQL 的 Oracle 数据库,您可以使用 PostgreSQL oracle_fdw 扩展来提供外部数据包装程序。有关此扩展的完整介绍,请参阅 oracle_fdw 文档。

使用基于 x86 的数据库实例类的 Amazon RDS for PostgreSQL 版本 12.7、13.3 及更高版本支持 oracle_fdw 扩展。

启用 oracle_fdw 扩展

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

启用 oracle_fdw 扩展

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

    CREATE EXTENSION oracle_fdw;

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

以下示例演示如何使用链接到 RDS for Oracle 数据库的外部服务器。

创建链接到 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

来自非基于英特尔的类的数据库实例的注意事项

Oracle_fdw 外部数据包装器依赖于 Oracle 客户端。基于 Graviton2 的数据库实例(例如 db.m6g 实例类)不支持 Oracle 客户端。对基于 Graviton2 的数据库实例的任何调用都会导致以下错误。

ERROR: oracle_fdw is not supported on this instance type, please refer to the documentation for more details

以下注意事项适用于来自非基于英特尔的数据库类的数据库实例:

  • 从基于 x86 的数据库实例迁移到基于 Graviton2 的数据库实例会成功,但在 Oracle_fdw 使用 Oracle 客户端时会产生上一条错误消息。

  • 恢复到基于 x86 的实例会使 Oracle_fdw 再次工作。

  • 如果 x86 上有只读副本,并且主数据库实例位于 Graviton2 上,则需要 Oracle 客户端的调用如果不生成写入活动,则会在只读副本上成功。任何不需要 Oracle 客户端的调用都会在主服务器上成功。因此,您可以在主数据库实例上成功执行上一示例(查询除外)中的步骤,并在只读副本上运行查询。

在传输过程中使用加密

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

pg_user_mapping 和 pg_user_mappings 权限

在下表中,您可以找到使用示例角色的用户映射权限说明。rdssu1rdssu2 用户具有 rds_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_mapping 表。下面的示例使用了 rdssu1

test=> SET SESSION AUTHORIZATION rdssu1; SET test=> select * from pg_user_mapping; ERROR: permission denied for table pg_user_mapping

在 RDS for PostgreSQL 上,所有用户(甚至是具有 rds_superuser 角色的用户)只能在 pg_user_mappings 表中看到自己的 umoptions 值。以下示例进行了展示。

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