透過資料庫連結使用直接 Oracle Data Pump Import,將內部部署 Oracle 資料庫遷移至 Amazon RDS for Oracle - AWS 方案指引

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

透過資料庫連結使用直接 Oracle Data Pump Import,將內部部署 Oracle 資料庫遷移至 Amazon RDS for Oracle

由 Rizwan Wangde 建立 (AWS)

環境:生產

來源:內部部署 Oracle 資料庫

目標:Amazon RDS for Oracle

R 類型:Replatform

工作負載:Oracle

技術:遷移;資料庫

AWS 服務:AWSDMS;AWSDirect Connect;Amazon RDS

許多模式涵蓋使用 Oracle Data Pump 將內部部署 Oracle 資料庫遷移至 Amazon RDS for Oracle,這是遷移大型 Oracle 工作負載的首選方式。這些模式通常涉及將應用程式結構描述或資料表匯出至傾印檔案、將傾印檔案傳輸至 Amazon RDS for Oracle 上的資料庫目錄,然後從傾印檔案匯入應用程式結構描述和資料。

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

此模式透過資料庫連結使用 Oracle Data Pump 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 Database 10g 版本 1 及更新版本。

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

來源技術堆疊

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

目標技術堆疊

  • Amazon RDS for Oracle

目標架構

下圖顯示從內部部署 Oracle 資料庫遷移至單一可用區域環境中 Amazon RDS for Oracle 的架構。箭頭方向描述 架構中的資料流程。圖表未顯示啟動連線的元件。

內部部署 Oracle 資料庫的全負載遷移。
  1. Amazon RDS for Oracle 執行個體會連線至內部部署來源 Oracle 資料庫,以透過資料庫連結執行全負載遷移。

  2. AWS DMS 連線至內部部署來源 Oracle 資料庫,以使用變更資料擷取 () 執行持續複寫CDC。

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

AWS 服務

其他工具

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

任務描述所需的技能

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

設定內部部署網路和防火牆,以允許從目標 Amazon RDS執行個體傳入內部部署來源 Oracle 資料庫。

網路管理員、安全工程師

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

在內部部署來源 Oracle 資料庫中建立資料庫使用者,具有使用 Oracle Data Pump 在來源和目標之間遷移資料的權限。

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

準備內部部署來源資料庫以進行AWSDMSCDC遷移。

(選用) 在完成 Oracle Data Pump Full Load 後,準備內部部署來源 Oracle 資料庫以進行AWSDMSCDC遷移:

  1. 設定在 Oracle Data Pump 遷移FLASHBACK期間管理所需的其他權限。

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

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

DBA

安裝和設定 SQL Developer。

安裝並設定 SQL Developer 以連接和執行來源和目標資料庫上的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 支援文件中的指令碼如何DDL擷取使用者,包括使用 dbms_metadata.get_ddl 的權限和角色 (Doc ID 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

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

執行先前產生的指令碼,為目標 Amazon RDS for Oracle 執行個體做好準備:

  1. 資料表空間

  2. 描述檔

  3. 角色

這有助於確保 Oracle Data Pump 遷移可以建立結構描述及其物件。

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

遷移所需的結構描述。

若要將所需結構描述從來源內部部署資料庫遷移至目標 Amazon RDS執行個體,請使用其他資訊區段中的程式碼:

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

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

若要調整遷移的效能,您可以執行下列命令來調整平行程序的數量。

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>);

若要調整遷移的效能,您可以調整平行程序的數量。

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

在遷移的結構描述下停用觸發程序。

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

DBA

收集結構描述統計資料以改善效能。

收集結構描述統計資料命令會傳回為資料庫物件收集的 Oracle 查詢最佳化工具統計資料。透過使用此資訊,最佳化工具可以為針對這些物件的任何查詢選取最佳執行計畫。

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

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

使用 AWS DMS 來執行從來源 Oracle 資料庫到目標 Amazon RDS for Oracle 執行個體的持續複寫。

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

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

在切換前 48 小時在執行個體上啟用多可用區。

如果這是生產執行個體,我們建議您在 Amazon RDS執行個體上啟用多可用區域部署,以提供高可用性 (HA) 和災難復原 (DR) 的優點。

DBA,遷移工程師

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

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

  2. 停止CDC僅限 AWS DMS 的任務。

DBA

啟用觸發程序。

啟用TRIGGERS您在建立CDC任務之前停用的 。

DBA

AWS

Oracle 文件

程式碼 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; /

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

在來源資料庫包含數百萬列和非常大型LOBSEGMENT資料欄的資料表的罕見情況下,此模式會減緩遷移。Oracle LOBSEGMENTs 透過網路連結一次遷移一個。它會從來源資料表擷取單一資料列 (以及資料LOB欄資料),並將資料列插入目標資料表,重複此程序,直到所有資料列遷移為止。透過資料庫連結的 Oracle Data Pump 不支援 的大量載入或直接路徑載入機制LOBSEGMENTs。

在這種情況下,我們建議下列事項:

  • 透過新增下列中繼資料篩選條件,在 Oracle Data Pump 遷移期間略過已識別的資料表。

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