您可以設定來源 Oracle 資料庫,搭配使用下列 CDC 方法:
如要進一步瞭解二進位記錄讀取器和 LogMiner API,請參閱「使用 Oracle 資料庫的重做記錄檔」。
如需詳細操作說明,瞭解如何為這些方法設定 Oracle 來源資料庫,請參閱下文各節。
設定 Amazon RDS Oracle 資料庫,以供二進位記錄讀取器使用
如果是 Amazon RDS 來源,Datastream 僅支援資料庫目錄物件,做為二進位記錄檔讀取器的記錄存取方法。您需要建立指向線上重做記錄檔和封存記錄檔的資料庫目錄。這些目錄的名稱是靜態的,且日後無法變更。 建立串流時,您必須向 Datastream 提供這些名稱。
連線至來源 Amazon RDS 執行個體。
在終端機或使用 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;
確認資料庫是以
ARCHIVELOG
模式運作。如要這麼做,請登入 Oracle 資料庫,並在 SQL 提示中執行下列指令:SELECT LOG_MODE FROM V$DATABASE;
- 如果結果是
ARCHIVELOG
,請繼續執行步驟 c。 - 如果結果是
NOARCHIVELOG
,則必須為資料庫啟用ARCHIVELOG
模式。 - 封存的記錄檔會耗用磁碟空間,因此請為資料庫設定 DB_RECOVERY_FILE_DEST_SIZE 參數。使用這個參數指定目標資料庫復原檔案可使用的總空間硬性限制 (以位元組為單位)。設定這個參數後,您就能在保護資料庫免於磁碟空間不足,以及避免因記錄檔位置遺失而導致串流失敗之間,取得適當的平衡。
- 執行下列指令,定義資料庫的資料保留政策:
建議您至少保留 4 天的備份和封存記錄檔,最好是 7 天。exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',96);
- 設定 Oracle 記錄檔輪替政策。建議將記錄檔大小上限設為小於 1 GB 的值。
- 如果結果是
啟用增補記錄資料。如要這麼做,請先執行下列指令,啟用最低資料庫層級的增補記錄功能:
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');
將下列權限授予資料庫使用者:
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
確認資料庫是以
ARCHIVELOG
模式運作。如要執行這項操作,請登入 Oracle 資料庫,並在 SQL 提示中執行下列指令:SELECT LOG_MODE FROM V$DATABASE;
- 如果結果是
ARCHIVELOG
,請繼續執行步驟 c。 如果結果是
NOARCHIVELOG
,則必須為資料庫啟用ARCHIVELOG
模式。重點:如要讓資料庫以
ARCHIVELOG
模式執行,必須為資料庫啟用備份功能。封存的記錄檔會佔用磁碟空間,因此您需要為資料庫設定 DB_RECOVERY_FILE_DEST_SIZE 參數。使用這個參數指定目標資料庫復原檔案可使用的總空間硬性限制 (以位元組為單位)。設定這個參數後,您就能在保護資料庫免於磁碟空間不足,以及因記錄檔位置遺失而導致串流失敗之間,取得適當的平衡。
執行下列指令,定義資料庫的資料保留政策:
exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',96);
建議您至少保留 4 天的備份和封存記錄檔,最好是 7 天。
- 如果結果是
啟用增補記錄資料。如要這麼做,請先執行下列指令,啟用最低的資料庫層級增補記錄功能:
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');
將適當權限授予連結至資料庫的使用者帳戶。如需設定,請執行下列指令:
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;
授予使用者帳戶
SELECT
資料庫中DBA_EXTENTS
檢視畫面的存取權。這項權限可讓您對 Oracle 來源使用ROWID
型回填:GRANT SELECT ON DBA_EXTENTS TO USER_NAME;
後續步驟
- 進一步瞭解 Datastream 如何與 Oracle 來源搭配運作。