使用 Oracle 可傳輸資料表空間進行移轉 - Amazon Relational Database Service

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

使用 Oracle 可傳輸資料表空間進行移轉

您可以使用 Oracle 可傳輸資料表空間功能將一組資料表空間從內部部署 Oracle 資料庫複製到 RDS for Oracle 資料庫執行個體。在實體層級,您可以使用 Amazon EFS 或 Amazon S3 將來源資料檔案和中繼資料檔案傳輸到目標資料庫執行個體。可傳輸表格空間功能會使用封裝。rdsadmin.rdsadmin_transport_util如需此套件的語法和語意,請參閱可傳輸的資料表空間

如需說明如何傳輸表格空間的部落格文章,請參閱將 Oracle 資料庫遷移為 AWS 使用可傳輸表格空間和使用 RMAN 進行 Oracle 可傳輸表格空間的 Amazon RDS

Oracle 可傳輸資料表空間概觀

可傳輸資料表空間集包含所要傳輸資料表空間集的資料檔案,以及含有資料表空間描述資料的匯出傾印檔案。在實體移轉解決方案 (例如可傳輸的資料表空間) 中,您可以傳輸實體檔案:資料檔案、組態檔案和 Data Pump 傾印檔案。

可傳輸資料表空間的優缺點

當您需要以最短停機時間將一或多個大型資料表空間移轉至 RDS 時,建議您使用可傳輸的資料表空間。相較於邏輯移轉,可傳輸資料表空間具有下列優點:

  • 停機時間低於大多數其他 Oracle 移轉解決方案。

  • 由於可傳輸資料表空間功能僅複製實體檔案,因此可避免邏輯移轉中可能發生的資料完整性錯誤和邏輯損毀。

  • 不需要額外的授權。

  • 您可以在不同平台和位元組類型之間移轉一組資料表空間,例如從 Oracle Solaris 平台移轉至 Linux。但不支援在 Windows Server 之間傳輸資料表空間。

    注意

    Linux 經過完整的測試和支援。並非所有的 UNIX 版本都經過測試。

如果您使用可傳輸的資料表空間,則可以使用 Amazon S3 或 Amazon EFS 來傳輸資料:

  • 使用 EFS 時,您的備份會在匯入期間保留在 EFS 檔案系統中。您可以在之後刪除檔案。在此技術中,您無需為資料庫執行個體佈建 EBS 儲存體。因此,我們建議使用 Amazon EFS 而不是 S3。如需詳細資訊,請參閱 Amazon EFS 整合

  • 使用 S3 時,您可以將 RMAN 備份下載到資料庫執行個體所連接的 EBS 儲存體。在匯入期間,檔案會保留在 EBS 儲存體中。匯入之後,您可以釋放此空間,該空間仍會配置給您的資料庫執行個體。

可傳輸資料表空間的主要缺點,在於您需要具備關於 Oracle 資料庫相對進階的知識。如需詳細資訊,請參閱Oracle 資料庫管理員指南中的在資料庫之間傳輸資料表空間

可傳輸資料表空間的限制

當您在 RDS for Oracle 中使用此功能時,可傳輸資料表空間的 Oracle 資料庫限制也同樣適用。如需詳細資訊,請參閱 Oracle 資料庫管理員指南中的可傳輸資料表空間的限制傳輸資料的一般限制。請注意,下列 RDS 適用於 Oracle 可傳輸資料表空間的額外限制:

  • 來源或目標資料庫都不能使用標準版 2 (SE2)。僅支援企業版。

  • 您不能使用 Oracle 數據庫 11g 數據庫作為源。RMAN 跨平台可傳輸表格空間功能依賴 Oracle 資料庫 11g 不支援的 RMAN 傳輸機制。

  • 您無法使用可傳輸的資料表空間從 RDS for Oracle 資料庫執行個體移轉資料。可傳輸的資料表空間僅可用於將資料移轉至 RDS for Oracle DB 資料庫執行個體。

  • 不支援 Windows 作業系統。

  • 在較低版本層級,您無法將資料表空間傳輸到資料庫中。目標資料庫必須與來源資料庫位於相同或更新的版本層級。例如,您無法將資料表空間從 Oracle 資料庫 21c 傳輸到 Oracle 資料庫 19c。

  • 您無法傳輸系統管理專用的資料表空間,例如 SYSTEM 和 SYSAUX

  • 您無法傳輸非資料物件,例如 PL/SQL 套件、Java 類別、檢視表、觸發程序、序列、使用者、角色和暫存資料表。若要傳輸非資料物件,請手動建立它們,或使用資料汲取中繼資料匯出和匯入。如需詳細資訊,請參閱我的甲骨文客戶 Support 注意事項 1454872.1

  • 您無法傳輸已加密或使用加密資料欄的資料表空間。

  • 如果您使用 Amazon S3 傳輸檔案,則支援的檔案大小上限為 5 TiB。

  • 如果來源資料庫使用 Oracle 選項 (例如 Spatial),則除非在目標資料庫上設定相同的選項,否則您無法傳輸資料表空間。

  • 您無法將資料表空間傳輸到 Oracle 複本組態中的 RDS for Oracle 資料庫執行個體。解決方法是刪除所有複本、傳輸資料表空間,然後重新建立複本。

可傳輸資料表空間的先決條件

開始之前,請先完成以下任務:

階段 1:設定來源主機

在此步驟中,您會複製 My Oracle Support 提供的傳輸資料表空間指令碼,並設定必要的組態檔案。在下列步驟中,來源主機執行的資料庫含有預定傳輸至目標執行個體的資料表空間。

設定來源主機的方法如下
  1. 以 Oracle 主目錄擁有者身分登入來源主機。

  2. 請確定您的 ORACLE_HOME 和 ORACLE_SID 環境變數指向您的來源資料庫。

  3. 以系統管理員身分登入資料庫,並確認時區版本、資料庫字元集和國家字元集與目標資料庫中的相同。

    SELECT * FROM V$TIMEZONE_FILE; SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
  4. 依照 Oracle Support 備註 2471245.1 的說明設定可傳輸資料表空間公用程式。

    此設定包括編輯來源主機上的 xtt.properties 檔案。下列範例 xtt.properties 檔案會指定 /dsk1/backups 目錄中三個資料表空間的備份。這些是您規劃傳輸到目標資料庫執行個體的資料表空間。它還會指定來源平台 ID 以自動轉換端序。

    #linux system platformid=13 #list of tablespaces to transport tablespaces=TBS1,TBS2,TBS3 #location where backup will be generated src_scratch_location=/dsk1/backups #RMAN command for performing backup usermantransport=1

階段 2:準備完整的資料表空間備份

您會在此階段初次備份資料表空間、將備份傳輸到目標主機,然後使用 rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces 程序還原這些備份。完成此階段時,初始資料表空間備份會存放在目標資料庫執行個體上,並且可以使用增量備份加以更新。

步驟 1:備份來源主機上的資料表空間

在此步驟中,您會使用 xttdriver.pl 指令碼進行資料表空間的完整備份。xttdriver.pl 的輸出會儲存在 TMPDIR 環境變數中。

備份資料表空間的方法如下
  1. 如果您的資料表空間處於唯讀模式,請以具有 ALTER TABLESPACE 權限的使用者身分登入來源資料庫,然後將資料表空間設為讀取/寫入模式。否則,跳至下一步。

    下列範例將 tbs1tbs2 和 tbs3 設為讀取/寫入模式。

    ALTER TABLESPACE tbs1 READ WRITE; ALTER TABLESPACE tbs2 READ WRITE; ALTER TABLESPACE tbs3 READ WRITE;
  2. 使用指令碼 xttdriver.pl 備份您的資料表空間。或者,您可以指定 --debug 在偵錯模式下執行指令碼。

    export TMPDIR=location_of_log_files cd location_of_xttdriver.pl $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup

步驟 2:將備份檔案傳輸到目標資料庫執行個體

在此步驟中,請將備份和組態檔案從暫用位置複製到目標資料庫執行個體。請選擇下列其中一個選項:

  • 如果來源主機和目標主機共用 Amazon EFS 檔案系統,請使用作業系統公用程式 (例如 cp) 將備份檔案和 res.txt 檔案從暫用位置複製到共用目錄。然後跳至 步驟 3:在目標資料庫執行個體上匯入資料表空間

  • 如需將備份暫存到 Amazon S3 儲存貯體,請完成以下步驟。

使用 Amazon S3 或 Amazon EFS 傳輸文件。

步驟 2.2:將傾印檔案上傳至 Amazon S3 儲存貯體

將備份和 res.txt 檔案從暫存目錄上傳到 Amazon S3 儲存貯體。如需詳細資訊,請參閱 Amazon Simple Storage Service 使用者指南中的上傳物件

步驟 2.3:將傾印檔案從 Amazon S3 儲存貯體下載到您的目標資料庫執行個體

在此步驟中,您可以使用 rdsadmin.rdsadmin_s3_tasks.download_from_s3 程序將備份下載到您的 RDS for Oracle 資料庫執行個體。

從 Amazon S3 儲存貯體下載備份的方法如下
  1. 啟動 SQL*Plus 或 Oracle SQL Developer,並登入 RDS for Oracle 資料庫執行個體。

  2. 使用 Amazon RDS 程序 rdsadmin.rdsadmin_s3_tasks.download_from_s3 將備份從 Amazon S3 儲存貯體下載到目標資料庫執行個體。以下範例會從名為 DOC-EXAMPLE-BUCKET 的 Amazon S3 儲存貯體下載所有檔案至 DATA_PUMP_DIR 目錄。

    EXEC UTL_FILE.FREMOVE ('DATA_PUMP_DIR', 'res.txt'); SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'DOC-EXAMPLE-BUCKET', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

    SELECT 陳述式以 VARCHAR2 資料類型傳回任務 ID。如需詳細資訊,請參閱 將檔案從 Amazon S3 儲存貯體下載至 Oracle 資料庫執行個體

步驟 3:在目標資料庫執行個體上匯入資料表空間

若要將表格空間還原到目標資料庫執行個體,請使用程序rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces。此程序會自動將資料檔案轉換為正確的 endian 格式。

如果您從 Linux 以外的平台匯入,請在呼叫p_platform_id時使用參數指定來源平台import_xtts_tablespaces。請確定您指定的平台 ID 與中xtt.properties檔案中指定的平台 ID 相符步驟 2:匯出來源主機上的資料表空間描述資料

匯入目標資料庫執行個體上的資料表空間
  1. 啟動 Oracle SQL 用戶端,並以主要使用者身分登入 RDS for Oracle 資料庫執行個體。

  2. 執行程序 rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces,指定要匯入的資料表空間及含有備份的目錄。

    以下範例從目錄 DATA_PUMP_DIR 匯入資料表 TBS1TBS2 和 TBS3。來源平台是以 AIX 為基礎的系統 (64 位元),其平台識別碼為。6您可以通過查詢找到平台 ID V$TRANSPORTABLE_PLATFORM

    VAR task_id CLOB BEGIN :task_id:=rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces( 'TBS1,TBS2,TBS3', 'DATA_PUMP_DIR', p_platform_id => 6); END; / PRINT task_id
  3. (選用) 透過查詢資料表 rdsadmin.rds_xtts_operation_info 來監控進度。xtts_operation_state 資料欄會顯示值 EXECUTINGCOMPLETED 或FAILED

    SELECT * FROM rdsadmin.rds_xtts_operation_info;
    注意

    對於長時間執行的操作,您也可以查詢 V$SESSION_LONGOPSV$RMAN_STATUS、和 V$RMAN_OUTPUT

  4. 使用上一個步驟的任務 ID 來檢視已完成匯入的記錄。

    SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||'&task_id'||'.log'));

    請確定匯入已成功完成,再繼續下一個步驟。

階段 3:製作和傳輸增量備份

在這個階段中,您會在來源資料庫作用的同時定期建立和傳輸增量備份。此技術可減少最終資料表空間備份的大小。如果您進行多個增量備份,則必須在最後一次增量備份之後複製 res.txt 檔案,然後才能將其套用至目標執行個體。

這些步驟與 階段 2:準備完整的資料表空間備份 中的相同,不同之處在於匯入步驟具有選擇性。

階段 4:傳輸資料表空間

在此階段中,您會備份唯讀資料表空間並匯出 Data Pump 中繼資料、將這些檔案傳輸到目標主機,以及匯入資料表空間和中繼資料。

步驟 1:備份唯讀資料表空間

此步驟與 步驟 1:備份來源主機上的資料表空間 相同,但有一項關鍵差異:在最後一次備份資料表空間之前,需將資料表空間設為唯讀模式。

下列範例將 tbs1tbs2 和 tbs3 設為唯讀模式。

ALTER TABLESPACE tbs1 READ ONLY; ALTER TABLESPACE tbs2 READ ONLY; ALTER TABLESPACE tbs3 READ ONLY;

步驟 2:匯出來源主機上的資料表空間描述資料

在來源主機上執行expdb公用程式,以匯出資料表空間中繼資料。以下範例將資料表空間 TBS1TBS2 及 TBS3 匯出至目錄 DATA_PUMP_DIR 中的傾印檔案 xttdump.dmp

expdp username/pwd \ dumpfile=xttdump.dmp \ directory=DATA_PUMP_DIR \ statistics=NONE \ transport_tablespaces=TBS1,TBS2,TBS3 \ transport_full_check=y \ logfile=tts_export.log

如果 DATA_PUMP_DIR 是Amazon EFS 中的共用目錄,請跳至。步驟 4:在目標資料庫執行個體上匯入資料表空間

步驟 3:(僅限 Amazon S3) 將備份和匯出檔案傳輸到目標資料庫執行個體

如果您使用 Amazon S3 來暫存資料表空間備份和 Data Pump 匯出檔案,請完成以下步驟。

步驟 3.1:將備份和傾印檔案從來源主機上傳到 Amazon S3 儲存貯體

將備份和傾印檔案從來源主機上傳到 Amazon S3 儲存貯體 如需詳細資訊,請參閱 Amazon Simple Storage Service 使用者指南中的上傳物件

步驟 3.2:將備份和傾印檔案從 Amazon S3 儲存貯體下載到您的目標資料庫執行個體

在此步驟中,您可以使用 rdsadmin.rdsadmin_s3_tasks.download_from_s3 程序將備份與傾印檔案下載到您的 RDS for Oracle 資料庫執行個體。請遵循 步驟 2.3:將傾印檔案從 Amazon S3 儲存貯體下載到您的目標資料庫執行個體 中的步驟。

步驟 4:在目標資料庫執行個體上匯入資料表空間

使用程序 rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces 來還原資料表空間。如需此程序的語法和語意,請參閱 將傳輸資料表空間匯入資料庫執行個體

重要

完成最後的資料表空間匯入程序後,下一個步驟是匯入 Oracle Data Pump 中繼資料。如果匯入失敗,請務必在資料庫執行個體回復失敗前的狀態。因此,我們建議您按照為單一可用區資料庫執行個體建立資料庫快照中的說明建立資料庫執行個體的資料庫快照。快照會包含所有匯入的資料表空間,因此如果匯入失敗,您不需要重複備份和匯入程序。

如果目標資料庫執行個體已開啟自動備份,且 Amazon RDS 在匯入中繼資料之前未偵測到任何有效快照已啟動,則 RDS 會嘗試建立快照。取決於您的執行個體活動,此快照可能但未必會成功。如果未偵測到有效的快照或無法啟動快照,則會結束中繼資料匯入程序,並顯示錯誤訊息。

匯入目標資料庫執行個體上的資料表空間
  1. 啟動 Oracle SQL 用戶端,並以主要使用者身分登入 RDS for Oracle 資料庫執行個體。

  2. 執行程序 rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces,指定要匯入的資料表空間及含有備份的目錄。

    以下範例從目錄 DATA_PUMP_DIR 匯入資料表 TBS1TBS2 和 TBS3

    BEGIN :task_id:=rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces('TBS1,TBS2,TBS3','DATA_PUMP_DIR'); END; / PRINT task_id
  3. (選用) 透過查詢資料表 rdsadmin.rds_xtts_operation_info 來監控進度。xtts_operation_state 資料欄會顯示值 EXECUTINGCOMPLETED 或FAILED

    SELECT * FROM rdsadmin.rds_xtts_operation_info;
    注意

    對於長時間執行的操作,您也可以查詢 V$SESSION_LONGOPSV$RMAN_STATUS、和 V$RMAN_OUTPUT

  4. 使用上一個步驟的任務 ID 來檢視已完成匯入的記錄。

    SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||'&task_id'||'.log'));

    請確定匯入已成功完成,再繼續下一個步驟。

  5. 請依照 為單一可用區資料庫執行個體建立資料庫快照 中的指示擷取手動資料庫快照。

步驟 5:匯入目標資料庫執行個體上的資料表空間中繼資料

在此步驟中,您可以使用 rdsadmin.rdsadmin_transport_util.import_xtts_metadata 程序將可傳輸的資料表空間中繼資料匯入 RDS for Oracle 資料庫執行個體。如需此程序的語法和語意,請參閱 將可傳輸資料表空間中繼資料匯入您的資料庫執行個體。在操作期間,資料表 rdsadmin.rds_xtts_operation_info 會顯示匯入狀態。

重要

強烈建議您在匯入資料表空間之後確認已成功建立資料庫快照,然後再匯入中繼資料。如果匯入步驟失敗,請還原資料庫執行個體、解決匯入錯誤,然後再次嘗試匯入。

將 Data Pump 中繼資料匯入 RDS for Oracle 資料庫執行個體。
  1. 啟動 Oracle SQL 用戶端,並以主要使用者身分登入目標資料庫執行個體。

  2. 如果這些使用者不存在,請在所傳輸資料表空間中建立擁有結構描述的使用者。

    CREATE USER tbs_owner IDENTIFIED BY password;
  3. 匯入中繼資料,指定傾印檔案的名稱及其目錄位置。

    BEGIN rdsadmin.rdsadmin_transport_util.import_xtts_metadata('xttdump.dmp','DATA_PUMP_DIR'); END; /
  4. (選用) 查詢可傳輸的資料表空間歷史記錄表,以查看中繼資料匯入的狀態。

    SELECT * FROM rdsadmin.rds_xtts_operation_info;

    操作完成時,您的資料表空間會處於唯讀模式。

  5. (選用) 檢視日誌檔案。

    下列範例列出 BDUMP 目錄的內容,然後查詢匯入記錄。

    SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'BDUMP')); SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file( p_directory => 'BDUMP', p_filename => 'rds-xtts-import_xtts_metadata-2023-05-22.01-52-35.560858000.log'));

階段 5:驗證所傳輸的資料表空間

在此選用步驟中,您可以使用程序 rdsadmin.rdsadmin_rman_util.validate_tablespace 來驗證所傳輸的資料表空間,然後將資料表空間設為讀取/寫入模式。

驗證所傳輸資料的方法如下
  1. 動 SQL*Plus 或 SQL Developer,並以主要使用者身分登入目標資料庫執行個體。

  2. 使用程序 rdsadmin.rdsadmin_rman_util.validate_tablespace 驗證資料表空間。

    SET SERVEROUTPUT ON BEGIN rdsadmin.rdsadmin_rman_util.validate_tablespace( p_tablespace_name => 'TBS1', p_validation_type => 'PHYSICAL+LOGICAL', p_rman_to_dbms_output => TRUE); rdsadmin.rdsadmin_rman_util.validate_tablespace( p_tablespace_name => 'TBS2', p_validation_type => 'PHYSICAL+LOGICAL', p_rman_to_dbms_output => TRUE); rdsadmin.rdsadmin_rman_util.validate_tablespace( p_tablespace_name => 'TBS3', p_validation_type => 'PHYSICAL+LOGICAL', p_rman_to_dbms_output => TRUE); END; /
  3. 將資料表空間設唯讀取/寫入模式。

    ALTER TABLESPACE TBS1 READ WRITE; ALTER TABLESPACE TBS2 READ WRITE; ALTER TABLESPACE TBS3 READ WRITE;

階段 6:清理剩餘檔案

在此可選步驟中,您會刪除所有不需要的檔案。使用 rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files 程序列出在資料表空間匯入之後遺棄的資料檔,然後使用 rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files 程序將其刪除。如需這些程序的語法和語意,請參閱 在資料表空間匯入後列出遺棄的檔案在資料表空間匯入後刪除遺棄的資料檔案

清除剩餘檔案
  1. 移除 DATA_PUMP_DIR 中的舊有備份,如下所示:

    1. 執行 rdsadmin.rdsadmin_file_util.listdir 以列出備份檔案。

      SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'DATA_PUMP_DIR'));
    2. 呼叫 UTL_FILE.FREMOVE 以逐一移除備份。

      EXEC UTL_FILE.FREMOVE ('DATA_PUMP_DIR', 'backup_filename');
  2. 若已匯入資料表空間,但未匯入這些資料表空間的中繼資料,您可以依照下列方式刪除孤立的資料檔案:

    1. 列出您需要刪除的孤立資料檔案。下列範例執行 rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files

      SQL> SELECT * FROM TABLE(rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files); FILENAME FILESIZE -------------- --------- datafile_7.dbf 104865792 datafile_8.dbf 104865792
    2. 執行程序 rdsadmin.rdsadmin_transport_util.cleanup_incomplete_xtts_import 以刪除孤立檔案。

      BEGIN rdsadmin.rdsadmin_transport_util.cleanup_incomplete_xtts_import('DATA_PUMP_DIR'); END; /

      清除操作會產生日誌檔案,該檔案在 BDUMP 目錄中使用名稱格式 rds-xtts-delete_xtts_orphaned_files-YYYY-MM-DD.HH24-MI-SS.FF.log

    3. 讀取上一個步驟中產生的日誌檔案。讀取日誌 rds-xtts-delete_xtts_orphaned_files-2023-06-01.09-33-11.868894000.log 如下列範例所示:

      SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file( p_directory => 'BDUMP', p_filename => 'rds-xtts-delete_xtts_orphaned_files-2023-06-01.09-33-11.868894000.log')); TEXT -------------------------------------------------------------------------------- orphan transported datafile datafile_7.dbf deleted. orphan transported datafile datafile_8.dbf deleted.
  3. 若已匯入這些資料表空間及其中繼資料,但發生相容性錯誤或其他 Oracle Data Pump 問題,請按以下方式清除部分傳輸的資料檔案:

    1. 查詢 DBA_TABLESPACES 列出含有部分傳輸資料檔案的資料表空間。

      SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES WHERE PLUGGED_IN='YES'; TABLESPACE_NAME -------------------------------------------------------------------------------- TBS_3
    2. 刪除資料表空間和部分傳輸的資料檔案。

      DROP TABLESPACE TBS_3 INCLUDING CONTENTS AND DATAFILES;