RDS PostgreSQL提供oracle_fdw插件,可以連接到Oracle數據庫,通過操作PostgreSQL表同步更新Oracle數據庫中的表。

前提條件

  • 實例為RDS PostgreSQL 12(內核版本20200421及以上)。
    說明 您可以執行SHOW rds_supported_extensions; 查看是否支持oracle_fdw,如不支持請升級內核版本。
  • Oracle Client版本為11.2及以上。
  • Oracle Server版本要求取決于Oracle Client版本。詳情請參見Oracle官方文檔
  • 將RDS PostgreSQL的專有網絡網段(例如172.xx.xx.xx/16)添加到Oracle數據庫實例的白名單中,允許RDS PostgreSQL訪問。
    說明 您可以在RDS PostgreSQL實例的數據庫連接中查看專有網絡網段。查看VPC網段

背景信息

oracle_fdw是PostgreSQL外部表插件,可以讀取Oracle數據庫的數據,也非常方便地實現PostgreSQL與Oracle數據同步。

更多詳細信息請參見oracle_fdw

注意事項

  • 如果需要執行UPDATE和DELETE操作,需要在創建外部表時為主鍵列設置key參數,詳情請參見創建外部表
  • 外部表定義的列數據類型必須是oracle_fdw可以識別并可以轉換的,oracle_fdw插件對于數據類型的轉換規則請參見Data types
  • WHERE子句和ORDER BY子句支持計算下推,即oracle_fdw會將子句發送給Oracle進行計算。
  • JOIN操作支持計算下推,但是有以下注意事項:
    • 兩個表必須被定義在相同的映射中。
    • 三個及以上的JOIN操作不支持下推。
    • JOIN操作必須包含在SELECT操作中。
    • 沒有JOIN條件的CROSS JOIN操作不支持下推。
    • 如果JOIN子句被下推,ORDER BY子句將不會被下推。
  • 安裝postgis插件后,oracle_fdw插件支持以下空間數據類型:
    • POINT
    • LINE
    • POLYGON
    • MULTIPOINT
    • MULTILINE
    • MULTIPOLYGON

操作步驟

  1. 新建oracle_fdw插件。命令如下:
    CREATE EXTENSION oracle_fdw;
  2. 創建Oracle數據庫映射。有如下兩種命令:
    • CREATE SERVER <SERVER名稱>
      FOREIGN DATA WRAPPER oracle_fdw
      OPTIONS (dbserver '//<Oracle數據庫的內網連接地址>:<Oracle數據庫的內網連接端口>/<數據庫名>');
    • CREATE SERVER oradb
      FOREIGN DATA WRAPPER oracle_fdw
      OPTIONS (host '<Oracle數據庫的內網連接地址>', port '<Oracle數據庫的內網連接端口>', dbname '<數據庫名>');
  3. 創建用戶映射。命令如下:
    CREATE USER MAPPING
    FOR <PostgreSQL用戶名> SERVER <映射名>
    OPTIONS (user '<Oracle數據庫用戶名>', password '<Oracle數據庫用戶密碼>');
    說明 如果不在PostgreSQL數據庫中存儲Oracle用戶憑證,可以設置user為空字符串,然后提供必須的外部授權。

    示例

    CREATE USER MAPPING
    FOR pguser SERVER oradb
    OPTIONS (user 'orauser', password 'orapwd');
  4. 創建Oracle的外部表。示例如下:
    CREATE FOREIGN TABLE oratab (
              id        integer OPTIONS (key 'true')  NOT NULL,
              text      character varying(30),
              floating  double precision  NOT NULL
           ) SERVER oradb OPTIONS (table 'ORATAB',
                                   schema 'ORAUSER',
                                   max_long '32767',
                                   readonly 'false',
                                   sample_percent '100',
                                   prefetch '200');
    說明 外部表的結構需要和Oracle中的映射表結構保持一致。

    OPTIONS內的參數說明如下。

    參數說明
    key是否設置對應的列為主鍵,取值為true或false,默認值為false。如果要執行UPDATE和DELETE操作,必須將所有主鍵列設置為true。
    table表名,一般是大寫,必填參數。可以使用Oracle的SQL來定義table變量的值,例如:OPTIONS (table '(SELECT col FROM tab WHERE val = ''string'')'),此時不要使用schema參數。
    schema一般是Oracle用戶名,保持大寫,用來訪問不屬于當前連接用戶的表。
    max_long限制Oracle表中LONG、LONG RAW、XMLTYPE類型列的最大長度,取值范圍是1~1073741823,默認值是32767。
    readonly限制Oracle表為只讀,不允許INSERT、UPDATE、DELETE操作。
    sample_percent設置隨機選擇Oracle表數據的比例,用于PostgreSQL表統計信息,取值范圍是0.000001~100,默認值是100。
    prefetch外部表掃描時,PostgreSQL和Oracle數據表之間一次性傳輸的行數,取值范圍是0~1024,默認值是200,0代表取消prefetch功能。

完成以上步驟即可通過操作外部表來實現對Oracle表的操作。支持DELETE、INSERT、UPDATE、SELECT等基本操作,支持導入外部表定義的操作,命令如下:

IMPORT FOREIGN SCHEMA <ora_schema_name>
FROM SERVER <server_name>
INTO <schema_name>
OPTIONS (case 'lower');
說明 case取值如下:
  • keep:表示保留Oracle上的對象名,通常是大寫。
  • lower:表示轉換所有的對象名為小寫。
  • smart:表示只將對象名中都是大寫字母的替換為小寫。

卸載插件

卸載插件命令如下:

DROP EXTENSION oracle_fdw;