透過資料庫連結使用直接的 Oracle 資料汲取匯入,將現場部署 Oracle 資料庫遷移到適用於甲骨文的 Amazon RDS - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

透過資料庫連結使用直接的 Oracle 資料汲取匯入,將現場部署 Oracle 資料庫遷移到適用於甲骨文的 Amazon RDS

創建者:里茲旺德 (AWS)

環境:生產

來源:內部部署 Oracle 資料庫

目標:Amazon RDS for Oracle

R 類型:重新平台

工作量:甲骨文

技術:移轉;資料庫

AWS 服務:AWS DMS;AWS Direct Connect;Amazon RDS

許多模式涵蓋了使用 Oracle 資料泵 (一種原生 Oracle 公用程式),將現場部署 Oracle 資料庫遷移到亞馬遜 RDS for Oracle 工作負載,這是遷移大型 Oracle 工作負載的首選方式。這些模式通常涉及將應用程式結構描述或表格匯出到傾印檔案,將傾印檔案傳輸到 Amazon RDS for Oracle 上的資料庫目錄,然後從傾印檔案匯入應用程式結構描述和資料。

使用這種方法,移轉可能需要更長的時間,具體取決於資料大小以及將傾印檔案傳輸到 Amazon RDS 執行個體所需的時間。此外,傾印檔案位於 Amazon RDS 執行個體的 Amazon Elastic Block Store (Amazon EBS) 磁碟區上,該磁碟區必須足夠容納資料庫和傾印檔案。匯入後刪除傾印檔案時,無法擷取空白空間,因此您會繼續支付未使用的空間費用。

此模式透過資料庫連結使用 Oracle 資料泵 API (DBMS_DATAPUMP),在 Amazon RDS 執行個體上執行直接匯入,以減輕這些問題。此模式會在來源與目標資料庫之間同時啟動匯出和匯入管線。此模式不需要調整傾印檔案的 EBS 磁碟區大小,因為磁碟區上不會建立或儲存傾印檔案。此方法可節省未使用磁碟空間的每月成本。

先決條件

  • 有效的 Amazon Web Services (AWS) 帳戶。

  • 透過至少兩個可用區域的私有子網路設定的虛擬私有雲端 (VPC),以提供 Amazon RDS 執行個體的網路基礎設施。

  • 內部部署資料中心中的 Oracle 資料庫。

  • 單一可用區域中的現有 Amazon RDS Oracle 執行個體。使用單一可用區域可改善移轉期間的寫入效能。異地同步備份部署可在切換前 24—48 小時啟用。

  • AWS Direct Connect (建議用於大型資料庫)。

  • 內部部署的網路連線和防火牆規則,設定為允許從 Amazon RDS 執行個體到現場部署 Oracle 資料庫的輸入連線。

限制

  • Amazon RDS for Oracle 文的數據庫大小限制為 64 TiB(截至 2022 年 12 月)。

產品版本

  • 來源資料庫:Oracle 資料庫版本 10g 版本 1 及更新版本。

  • 目標資料庫:如需 Amazon RDS 上支援的最新版本和版本清單,請參閱 AWS 文件中的 Amazon RDS for Oracle 文件。

源, 技術, 堆棧

  • 內部部署或雲端中的自我管理 Oracle 資料庫

目標技術堆疊

  • Amazon RDS for Oracle

目標架構

下圖顯示在單一可用區域環境中從現場部署 Oracle 資料庫遷移到 Amazon RDS for Oracle 的架構。箭頭方向描繪了架構中的數據流。圖表不會顯示啟動連線的元件。

""
  1. 適用於 Oracle 執行個體的 Amazon RDS 會連接到現場部署來源 Oracle 資料庫,以透過資料庫連結執行全負載遷移。

  2. AWS DMS 會連接到現場部署來源 Oracle 資料庫,以使用變更資料擷取 (CDC) 執行持續複寫。

  3. CDC 變更會套用至 Amazon RDS for Oracle 資料庫。

AWS 服務

其他工具

雖然 AWS Direct Connect 在現場部署網路和 AWS 之間使用專用的私有網路連線,但是請考慮下列選項,為傳輸中的資料提供額外的安全性和資料加密:

任務描述所需技能

設定從目標資料庫到來源資料庫的網路連線。

設定現場部署網路和防火牆,以允許從目標 Amazon RDS 執行個體連入到現場部署來源 Oracle 資料庫的連入連線。

網路管理員、安全工程師

建立具有適當權限的資料庫使用者。

在內部部署來源 Oracle 資料庫中建立資料庫使用者,並具有使用「Oracle 資料汲取」在來源和目標之間移轉資料的權限。

GRANT CONNECT to <migration_user>; GRANT DATAPUMP_EXP_FULL_DATABASE to <migration_user>; GRANT SELECT ANY TABLE to <migration_user>;
DBA

準備用於 AWS DMS CDC 移轉的現場部署來源資料庫。

(選擇性) 在完成 Oracle 資料泵完整負載之後,準備用於 AWS DMS CDC 移轉的現場部署來源 Oracle 資料庫:

  1. 設定「Oracle 資料汲取」移轉期間管理「倒溯」所需的其他權限。

    GRANT FLASHBACK ANY TABLE to <migration_user>; GRANT FLASHBACK ARCHIVE ADMINISTER to <migration_user>;
  2. 若要在 AWS DMS 的自我管理 Oracle 來源上設定所需的使用者帳戶權限,請參閱 AWS D MS 文件。

  3. 若要使用 AWS DMS 為 CDC 準備 Oracle 自我管理來源資料庫,請參閱 AWS DMS 文件。

DBA

安裝和設定 SQL 開發人員。

安裝並設定 SQL 開發人員,以便在來源和目標資料庫上連線並執行 SQL 查詢。

DBA,移民工程師

產生命令檔以建立表格空間。

使用下列範例 SQL 查詢,在來源資料庫上產生指令碼。

SELECT 'CREATE TABLESPACE ' tablespace_name ' DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE UNLIMITED;' from dba_tablespaces where tablespace_name not in ('SYSTEM', 'SYSAUX','TEMP','UNDOTBS1') order by 1;

該腳本將應用於目標數據庫。

DBA

產生指令碼以建立使用者、設定檔、角色和權限。

若要產生命令檔來建立資料庫使用者、設定檔、角色和權限,請使用「Oracle 客戶 Support 務部」文件「如何擷取使用者的 DDL」(包括使用 dbms_metadata.get_ddl (文件識別碼 2739952.1) 中的指令集 (需要 Oracle 帳戶)。

該腳本將應用於目標數據庫。

DBA
任務描述所需技能

建立來源資料庫的資料庫連結,並驗證連線能力。

若要建立內部部署來源資料庫的資料庫連結,您可以使用下列範例命令。

CREATE DATABASE LINK link2src CONNECT TO <migration_user_account> IDENTIFIED BY <password> USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<dns or ip address of remote db>) (PORT=<listener port>))(CONNECT_DATA=(SID=<remote SID>)))';

若要驗證連線能力,請執行下列 SQL 命令。

select * from dual@link2src;

如果響應是成功的連接X

DBA

執行指令碼以準備目標執行個體。

執行先前產生的指令碼以準備適用於 Oracle 執行個體的目標 Amazon RDS:

  1. 資料表空間

  2. 描述檔

  3. 角色

這有助於確保「Oracle 資料汲取」移轉可以建立綱要及其物件。

DBA,移民工程師
任務描述所需技能

移轉必要的結構描述。

若要將必要的結構描述從來源現場部署資料庫遷移到目標 Amazon RDS 執行個體,請使用其他資訊一節中的程式碼:

  • 若要移轉單一結構描述,請從 [其他資訊] 區段執行程式碼 1

  • 若要移轉多個結構描述,請從 [其他資訊] 區段執行程式碼 2

若要調整移轉的效能,您可以執行下列命令來調整 parallel 處理程序的數目。

DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4);
DBA

收集綱要統計資料以改善效能。

「收集綱要統計資料」命令會傳回為資料庫物件收集的 Oracle 查詢最佳化處理程 使用此資訊,最佳化處理程式可以針對這些物件選取任何查詢的最佳執行計劃。

EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS(ownname => '<schema_name>');
DBA
任務描述所需技能

擷取來源內部部署 Oracle 資料庫上的 SCN。

擷取來源內部部署 Oracle 資料庫上的系統變更編號 (SCN)。您將使用 SCN 進行全負載匯入,並作為 CDC 複寫的起點。

若要在來源資料庫上產生目前的 SCN,請執行下列 SQL 敘述句。

SELECT current_scn FROM V$DATABASE;
DBA

執行結構描述的完整負載移轉。

若要將所需的結構描述 (FULL LOAD) 從來源現場部署資料庫遷移到目標 Amazon RDS 執行個體,請執行以下操作:

  • 若要移轉單一結構描述,請從 [其他資訊] 區段執行程式碼 3

  • 若要移轉多個結構描述,請從 [其他資訊] 區段執行程式碼 4

在程式碼中,取代<CURRENT_SCN_VALUE_IN_SOURCE_DATABASE>為從來源資料庫擷取的 SCN。

DBMS_DATAPUMP.SET_PARAMETER (handle => v_hdnl, name => 'FLASHBACK_SCN', value => <CURRENT_SCN_VALUE_IN_SOURCE_DATABASE>);

若要調整移轉的效能,您可以調整 parallel 程序的數目。

DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4);
DBA

停用已移轉結構描述下的觸發器。

在您開始執行 AWS DMS 僅限 CDC 的任務之前,請先停用遷移的結構描述TRIGGERS下的。

DBA

收集綱要統計資料以改善效能。

「收集綱要統計資料」命令會傳回為資料庫物件收集的 Oracle 查詢最佳化處理程 使用此資訊,最佳化處理程式可以針對這些物件選取任何查詢的最佳執行計劃。

EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS(ownname => '<schema_name>');
DBA

使用 AWS DMS 執行從來源到目標的持續複寫。

使用 AWS DMS 執行從來源 Oracle 資料庫到目標 Amazon RDS (適用於甲骨文執行個體) 的持續複寫。

如需詳細資訊,請參閱使用 AWS DMS 建立持續複寫的任務和部落格文章如何在 AWS DMS 中使用原生 CDC 支援

DBA,移民工程師
任務描述所需技能

在切換前 48 小時在執行個體上啟用異地同步備份。

如果這是生產執行個體,建議您在 Amazon RDS 執行個體上啟用異地同步備份部署,以提供高可用性 (HA) 和災難復原 (DR) 的優點。

DBA,移民工程師

停止僅限 AWS DMS 光碟的任務 (如果 CDC 已開啟)。

  1. 確保 AWS DMS 任務的 Amazon CloudWatch 指標上的來源延遲和目標延遲顯示為 0 秒。

  2. 停止僅限 AWS DMS 光碟的工作。

DBA

啟用觸發器。

啟用您在 CDC 工作建立之前停用的觸發器。

DBA

AWS

甲骨文文件

程式碼 1:僅限全負載移轉,單一應用程式結構描述

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'SCHEMA', remote_link => '<DB LINK Name to Source Database>', job_name => null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'import_01.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''<schema_name>'')'); -- To migrate one selected schema DBMS_DATAPUMP.METADATA_FILTER (hdnl, 'EXCLUDE_PATH_EXPR','IN (''STATISTICS'')'); -- To prevent gathering Statistics during the import DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4); -- Number of parallel processes performing export and import DBMS_DATAPUMP.START_JOB(v_hdnl); END; /

程式碼 2:僅限全負載移轉、多個應用程式結構描述

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'SCHEMA', remote_link => '<DB LINK Name to Source Database>', job_name  => null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'import_01.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER (v_hdnl, 'SCHEMA_LIST', '''<SCHEMA_1>'',''<SCHEMA_2>'', ''<SCHEMA_3>'''); -- To migrate multiple schemas DBMS_DATAPUMP.METADATA_FILTER (v_hdnl, 'EXCLUDE_PATH_EXPR','IN (''STATISTICS'')'); -- To prevent gathering Statistics during the import DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4); -- Number of parallel processes performing export and import DBMS_DATAPUMP.START_JOB(v_hdnl); END; /

程式碼 3:僅限 CDC 工作之前的全負載移轉,單一應用程式結構描述

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'SCHEMA', remote_link => '<DB LINK Name to Source Database>', job_name => null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'import_01.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''<schema_name>'')'); -- To migrate one selected schema DBMS_DATAPUMP.METADATA_FILTER (v_hdnl, 'EXCLUDE_PATH_EXPR','IN (''STATISTICS'')'); -- To prevent gathering Statistics during the import DBMS_DATAPUMP.SET_PARAMETER (handle => v_hdnl, name => 'FLASHBACK_SCN', value => <CURRENT_SCN_VALUE_IN_SOURCE_DATABASE>); -- SCN required for AWS DMS CDC only task. DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4); -- Number of parallel processes performing export and import DBMS_DATAPUMP.START_JOB(v_hdnl); END; /

代碼 4:僅限 CDC 任務之前的全負載遷移,多個應用程序模式

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN (operation => 'IMPORT', job_mode  => 'SCHEMA', remote_link => '<DB LINK Name to Source Database>', job_name => null); DBMS_DATAPUMP.ADD_FILE (handle => v_hdnl, filename => 'import_01.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER (v_hdnl, 'SCHEMA_LIST', '''<SCHEMA_1>'',''<SCHEMA_2>'', ''<SCHEMA_3>'''); -- To migrate multiple schemas DBMS_DATAPUMP.METADATA_FILTER (v_hdnl, 'EXCLUDE_PATH_EXPR','IN (''STATISTICS'')'); -- To prevent gathering Statistics during the import DBMS_DATAPUMP.SET_PARAMETER (handle => v_hdnl, name => 'FLASHBACK_SCN', value => <CURRENT_SCN_VALUE_IN_SOURCE_DATABASE>); -- SCN required for AWS DMS CDC only task. DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4); -- Number of parallel processes performing export and import DBMS_DATAPUMP.START_JOB(v_hdnl); END; /

混合移轉方法可以更好地運作的案例

在極少數情況下,來源資料庫包含具有數百萬個資料列的資料表和非常大型的 LOBLOSEGION 資料行,此模式會拖慢移轉速度。Oracle 會透過網路連結,一次移轉一個大區段。它會從來源表格擷取單一資料列 (連同 LOB 資料欄資料),然後將資料列插入目標資料表中,重複此程序直到所有資料列都移轉為止。透過資料庫連結的 Oracle 資料汲取不支援 LOB 區段的大量載入或直接路徑載入機制。

在這種情況下,我們建議您執行以下操作:

  • 新增下列中繼資料篩選器,可在「Oracle 資料汲取」移轉期間略過已識別的表格。

    dbms_datapump.metadata_filter(handle =>h1, name=>'NAME_EXPR', value => 'NOT IN (''TABLE_1'',''TABLE_2'')');
  • 使用 AWS DMS 任務 (全負載遷移,必要時搭配 CDC 複寫) 遷移已識別的資料表。AWS DMS 會從來源 Oracle 資料庫擷取多個資料列,然後將它們以批次形式插入目標 Amazon RDS 執行個體,進而提升效能。