設定 Amazon RDS Oracle 資料庫以進行 CDC

Datastream 可讓您將 Amazon RDS for Oracle 資料庫的變更資料擷取 (CDC) 更新,串流至支援的目的地,例如 BigQuery 或 Cloud Storage。您可以啟用 ARCHIVELOG 模式和補充記錄,並授予使用者權限,藉此設定二進位記錄讀取器 (預先發布版) 或 LogMiner API 的來源。如要進一步瞭解這些 CDC 方法,請參閱「使用 Oracle 資料庫重做日誌檔」。

設定 Amazon RDS Oracle 資料庫,以供二進位記錄讀取器使用

如果是 Amazon RDS 來源,Datastream 僅支援資料庫目錄物件,做為二進位記錄讀取器的記錄存取方法。您需要建立指向線上重做日誌檔和封存記錄檔的資料庫目錄。這些目錄的名稱是靜態的,日後無法變更。建立串流時,您必須將這些名稱提供給 Datastream。

  1. 連線至來源 Amazon RDS 執行個體。

  2. 在終端機或使用 Amazon RDS 資訊主頁,執行下列指令:

    BEGIN
    rdsadmin.rdsadmin_master_util.create_archivelog_dir;
    END;
    BEGIN
    rdsadmin.rdsadmin_master_util.create_onlinelog_dir;
    END;
    COMMIT;
    GRANT READ ON DIRECTORY ONLINELOG_DIR TO USER_NAME;
    GRANT READ ON DIRECTORY ARCHIVELOG_DIR TO USER_NAME;
  3. 確認資料庫是以 ARCHIVELOG 模式運作。請登入 Oracle 資料庫,並在 SQL 提示執行下列指令:

    SELECT LOG_MODE FROM V$DATABASE;

    1. 如果結果是 ARCHIVELOG,請繼續執行步驟 c。
    2. 如果結果是 NOARCHIVELOG,則必須為資料庫啟用 ARCHIVELOG 模式。
    3. 封存的記錄檔會占用磁碟空間,因此請務必為資料庫設定 DB_RECOVERY_FILE_DEST_SIZE 參數。使用這個參數指定目標資料庫復原檔案可使用的總空間硬性限制 (以位元組為單位)。設定這項參數後,您就能在保護資料庫免於磁碟空間不足,以及串流因記錄位置遺失而失敗之間取得平衡。
    4. 執行下列指令,定義資料庫的資料保留政策:
      exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',96);
      建議您將備份和封存記錄檔保留至少 4 天,最好是 7 天。
    5. 設定 Oracle 記錄檔輪替政策。建議將記錄檔大小上限設為低於 1 GB。
  4. 啟用增補記錄檔資料。請先執行下列指令,啟用最低資料庫層級增補記錄功能:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');

    接著,選擇要為特定資料表或整個資料庫啟用記錄功能。

    如要只記錄特定資料表的變更,請對要複製的各個資料表執行下列指令:

    ALTER TABLE SCHEMA.TABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

    更改下列內容:

    • SCHEMA:包含資料表的結構定義名稱。
    • TABLE:要記錄變更的資料表名稱。

    如要複製資料庫中的大部分或所有資料表,建議為整個資料庫啟用記錄功能。在 SQL 提示中執行下列指令,為整個資料庫啟用補充記錄資料:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','ALL');
  5. 將下列權限授予資料庫使用者:

    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$LOGFILE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$ARCHIVED_LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$INSTANCE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('GV_$STANDBY_LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$INSTANCE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PDBS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$TRANSPORTABLE_PLATFORM','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PARAMETER','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('COL$','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_OBJECTS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_ENCRYPTED_COLUMNS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_EXTENTS','USER_NAME','SELECT');
    GRANT CONNECT TO USER_NAME;
    GRANT CREATE SESSION TO USER_NAME;
    GRANT SELECT ANY TABLE TO USER_NAME;

    將 USER_NAME 替換為要用來連線至資料庫的使用者帳戶名稱。

設定 Amazon RDS Oracle 資料庫以使用 LogMiner

  1. 確認資料庫是以 ARCHIVELOG 模式運作。請登入 Oracle 資料庫,並在 SQL 提示執行下列指令:

    SELECT LOG_MODE FROM V$DATABASE;
    
    1. 如果結果是 ARCHIVELOG,請繼續執行步驟 c。
    2. 如果結果為 NOARCHIVELOG,則需要為資料庫啟用 ARCHIVELOG 模式。

      重點:如要讓資料庫以 ARCHIVELOG 模式執行,必須為資料庫啟用備份功能。

    3. 封存的記錄檔會佔用磁碟空間,因此請為資料庫設定 DB_RECOVERY_FILE_DEST_SIZE 參數。使用這個參數指定目標資料庫復原檔案可使用的總空間硬性限制 (以位元組為單位)。設定這項參數後,您就能在保護資料庫免於磁碟空間不足,以及串流因記錄位置遺失而失敗之間取得平衡。

    4. 執行下列指令,定義資料庫的資料保留政策:

      exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',96);
      

      建議您將備份和封存記錄檔保留至少 4 天,最好是 7 天。

  2. 啟用增補記錄檔資料。如要啟用這項功能,請先執行下列指令,啟用資料庫層級的最低增補記錄:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');
    

    接著,選擇要為特定資料表或整個資料庫啟用記錄功能。

    如要只記錄特定資料表的變更,請對要複製的各個資料表執行下列指令:

    ALTER TABLE SCHEMA.TABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
    

    更改下列內容:

    • SCHEMA:包含資料表的結構定義名稱。
    • TABLE:要記錄變更的資料表名稱。

    如要複製資料庫中的大部分或所有資料表,建議為整個資料庫啟用記錄功能。

    在 SQL 提示執行下列指令,為整個資料庫啟用增補記錄資料:

    exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','ALL');
    
  3. 將適當權限授予連結至資料庫的使用者帳戶。如需設定,請執行下列指令:

    GRANT EXECUTE_CATALOG_ROLE TO USER_NAME;
    GRANT CONNECT TO USER_NAME;
    GRANT CREATE SESSION TO USER_NAME;
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$ARCHIVED_LOG','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOG','USER_NAME','SELECT'); -- for primary databases
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$STANDBY_LOG','USER_NAME','SELECT'); -- for standby databases
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGFILE','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_LOGS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_CONTENTS','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('V_$PARAMETER','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR','USER_NAME','EXECUTE');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR_D','USER_NAME','EXECUTE');
    GRANT SELECT ANY TRANSACTION TO USER_NAME;
    GRANT SELECT ANY TABLE TO USER_NAME;

    如果資料庫使用透明資料加密 (TDE),請授予下列權限:

    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES','USER_NAME','SELECT');
    exec rdsadmin.rdsadmin_util.grant_sys_object('DBA_ENCRYPTED_COLUMNS','USER_NAME','SELECT');

    如果貴組織不允許授予 GRANT SELECT ANY TABLE 權限,請使用 Datastream 常見問題頁面「Oracle 變更資料擷取 (CDC)」一節所述的解決方案。

    如果來源資料庫是 Oracle 12c 以上版本,則請額外授予下列權限:

    GRANT LOGMINING TO USER_NAME;
  4. 授予使用者帳戶 SELECT 資料庫中 DBA_EXTENTS 檢視畫面的存取權。這項權限可讓您對 Oracle 來源使用以 ROWID 為基礎的回填:

    GRANT SELECT ON DBA_EXTENTS TO USER_NAME;

後續步驟

  • 進一步瞭解 Datastream 如何與 Oracle 來源搭配運作。