

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

# 將資料匯入 Amazon RDS 上的 Oracle
<a name="Oracle.Procedural.Importing"></a>

將資料匯入 Amazon RDS for Oracle 資料庫執行個體的方式取決於下列項目：
+ 您擁有的資料量
+ 資料庫中資料庫物件的數量
+ 資料庫中資料庫物件的多樣性

例如，您可以根據您的要求使用以下工具：
+ Oracle SQL Developer — 匯入簡單的 20 MB 資料庫。
+ Oracle Data Pump — 匯入複雜的資料庫，或是大小為數百 MB 或數 TB 的資料庫。例如，您可以將資料表空間從內部部署資料庫傳輸到 RDS for Oracle 資料庫執行個體。您可以使用 Amazon S3 或 Amazon EFS 來傳輸資料檔案和中繼資料。如需詳細資訊，請參閱[使用 Oracle 可傳輸資料表空間進行移轉](oracle-migrating-tts.md)、[Amazon EFS 整合](oracle-efs-integration.md)及[Amazon S3 整合](oracle-s3-integration.md)。
+ AWS Database Migration Service (AWS DMS) — 在不停機的情況下遷移資料庫。如需有關 AWS DMS 的詳細資訊，請參閱[什麼是 AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html)，以及部落格文章[使用 AWS DMS 以近乎零的停機時間遷移 Oracle 資料庫](https://aws.amazon.com/blogs/database/migrating-oracle-databases-with-near-zero-downtime-using-aws-dms/)。

**重要**  
在您使用上述的遷移技術之前，我們建議您備份您的資料庫。匯入資料後，您可用建立快照的方式備份您的 RDS for Oracle 資料庫執行個體。之後，您可以還原快照。如需更多詳細資訊，請參閱 [備份、還原和匯出資料](CHAP_CommonTasks.BackupRestore.md)。

對於許多資料庫引擎，持續複寫可以繼續到您準備好切換至目標資料庫為止。您可以使用 AWS DMS 從相同資料庫引擎或從不同的引擎遷移到 RDS for Oracle。如果您是在不同資料庫引擎中進行遷移，則可使用 AWS Schema Conversion Tool 來遷移 AWS DMS 沒有移出的結構描述物件。​

**Topics**
+ [使用 Oracle SQL Developer 匯入](Oracle.Procedural.Importing.SQLDeveloper.md)
+ [使用 Oracle 可傳輸資料表空間進行移轉](oracle-migrating-tts.md)
+ [使用 Oracle Data Pump 匯入](Oracle.Procedural.Importing.DataPump.md)
+ [使用 Oracle Export/Import 進行匯入](Oracle.Procedural.Importing.ExportImport.md)
+ [使用 Oracle SQL\$1Loader 匯入](Oracle.Procedural.Importing.SQLLoader.md)
+ [使用 Oracle 具體化檢視進行遷移](Oracle.Procedural.Importing.Materialized.md)

# 使用 Oracle SQL Developer 匯入
<a name="Oracle.Procedural.Importing.SQLDeveloper"></a>

Oracle SQL Developer 是 Oracle 免費分發的一項圖形化 Java 工具。SQL Developer 提供選項讓您在兩個 Oracle 資料庫之間遷移資料，或從其他資料庫 (如 MySQL) 將資料遷移到 Oracle 資料庫。此工具最適合用來遷移小型資料庫。

您可以將此工具安裝在桌上型電腦 (Windows、Linux 或 Mac)，或安裝在您的其中一台伺服器上。安裝 SQL Developer 後，可用它連線至您的來源和目標資料庫。請使用 [工具] 功能表上的**資料庫複製**命令，將資料複製到您的 RDS for Oracle 資料庫執行個體。

若要下載 SQL Developer，請前往 [http://www.oracle.com/technetwork/developer-tools/sql-developer](http://www.oracle.com/technetwork/developer-tools/sql-developer)。

建議您先閱讀 Oracle SQL Developer 產品文件，再開始遷移資料。Oracle 也有文件說明如何從其他資料庫 (包括 MySQL 和 SQL Server) 進行遷移。如需詳細資訊，請參閱 Oracle 文件中的 [http://www.oracle.com/technetwork/database/migration](http://www.oracle.com/technetwork/database/migration)。

# 使用 Oracle 可傳輸資料表空間進行移轉
<a name="oracle-migrating-tts"></a>

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

如需說明如何傳輸資料表空間的部落格文章，請參閱[AWS 使用可傳輸資料表空間將 Oracle 資料庫遷移至](https://aws.amazon.com/blogs/database/migrate-oracle-databases-to-aws-using-transportable-tablespace/) ，以及[使用 RMAN 將 Amazon RDS for Oracle 可傳輸資料表空間遷移至 ](https://aws.amazon.com/blogs/database/amazon-rds-for-oracle-transportable-tablespaces-using-rman/)。

**Topics**
+ [Oracle 可傳輸資料表空間概觀](#oracle-migrating-tts.overview)
+ [階段 1：設定來源主機](#oracle-migrating-tts.setup-phase)
+ [階段 2：準備完整的資料表空間備份](#oracle-migrating-tts.initial-br-phase)
+ [階段 3：製作和傳輸增量備份](#oracle-migrating-tts.roll-forward-phase)
+ [階段 4：傳輸資料表空間](#oracle-migrating-tts.final-br-phase)
+ [階段 5：驗證所傳輸的資料表空間](#oracle-migrating-tts.validate)
+ [階段 6：清理剩餘檔案](#oracle-migrating-tts.cleanup)

## Oracle 可傳輸資料表空間概觀
<a name="oracle-migrating-tts.overview"></a>

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

**Topics**
+ [可傳輸資料表空間的優缺點](#oracle-migrating-tts.overview.benefits)
+ [可傳輸資料表空間的限制](#oracle-migrating-tts.limitations)
+ [可傳輸資料表空間的先決條件](#oracle-migrating-tts.requirements)

### 可傳輸資料表空間的優缺點
<a name="oracle-migrating-tts.overview.benefits"></a>

當您需要以最短停機時間將一或多個大型資料表空間移轉至 RDS 時，建議您使用可傳輸的資料表空間。相較於邏輯移轉，可傳輸資料表空間具有下列優點：
+ 停機時間低於大多數其他 Oracle 移轉解決方案。
+ 由於可傳輸資料表空間功能僅複製實體檔案，因此可避免邏輯移轉中可能發生的資料完整性錯誤和邏輯損毀。
+ 不需要額外的授權。
+ 您可以在不同平台和位元組類型之間移轉一組資料表空間，例如從 Oracle Solaris 平台移轉至 Linux。但不支援在 Windows Server 之間傳輸資料表空間。
**注意**  
Linux 經過完整的測試和支援。並非所有的 UNIX 版本都經過測試。

如果您使用可傳輸的資料表空間，則可以使用 Amazon S3 或 Amazon EFS 來傳輸資料：
+ 使用 EFS 時，您的備份會在匯入期間保留在 EFS 檔案系統中。您可以在之後刪除檔案。在此技術中，您無需為資料庫執行個體佈建 EBS 儲存體。因此，我們建議使用 Amazon EFS 而不是 S3。如需詳細資訊，請參閱[Amazon EFS 整合](oracle-efs-integration.md)。
+ 使用 S3 時，您可以將 RMAN 備份下載到資料庫執行個體所連接的 EBS 儲存體。在匯入期間，檔案會保留在 EBS 儲存體中。匯入之後，您可以釋放此空間，該空間仍會配置給您的資料庫執行個體。

可傳輸資料表空間的主要缺點，在於您需要具備關於 Oracle 資料庫相對進階的知識。如需詳細資訊，請參閱*Oracle 資料庫管理員指南*中的[在資料庫之間傳輸資料表空間](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-F7B2B591-AA88-4D16-8DCF-712763923FFB)。

### 可傳輸資料表空間的限制
<a name="oracle-migrating-tts.limitations"></a>

當您在 RDS for Oracle 中使用此功能時，可傳輸資料表空間的 Oracle 資料庫限制也同樣適用。如需詳細資訊，請參閱 *Oracle 資料庫管理員指南*中的[可傳輸資料表空間的限制]( https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-DAB51E42-9BBC-4001-B5CB-0ECDBE128787)和[傳輸資料的一般限制](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-28800719-6CB9-4A71-95DD-4B61AA603173)。請注意，下列 RDS 適用於 Oracle 可傳輸資料表空間的額外限制：
+ 來源或目標資料庫都不能使用標準版 2 (SE2)。僅支援企業版。
+ 您無法使用 Oracle Database 11g 資料庫做為來源。RMAN 跨平台可傳輸資料表空間功能需依賴 RMAN 傳輸機制，但 Oracle Database 11g 不加以支援。
+ 您無法使用可傳輸的資料表空間從 RDS for Oracle 資料庫執行個體移轉資料。可傳輸的資料表空間僅可用於將資料移轉至 RDS for Oracle DB 資料庫執行個體。
+ 不支援 Windows 作業系統。
+ 在較低版本層級，您無法將資料表空間傳輸到資料庫中。目標資料庫必須與來源資料庫位於相同或更新的版本層級。例如，您無法將資料表空間從 Oracle 資料庫 21c 傳輸到 Oracle 資料庫 19c。
+ 您無法傳輸系統管理專用的資料表空間，例如 `SYSTEM` 和 `SYSAUX`。
+ 您無法傳輸非資料物件，例如 PL/SQL 套件、Java 類別、檢視、觸發程序、序列、使用者、角色和暫存資料表。若要傳輸非資料物件，請手動建立，或使用 Data Pump 中繼資料匯出和匯入。如需詳細資訊，請參閱 [My Oracle Support 備註 1454872.1](https://support.oracle.com/knowledge/Oracle%20Cloud/1454872_1.html)。
+ 您無法傳輸已加密或使用加密資料欄的資料表空間。
+ 如果您使用 Amazon S3 傳輸檔案，則支援的檔案大小上限為 5 TiB。
+ 如果來源資料庫使用 Oracle 選項 (例如 Spatial)，則除非在目標資料庫上設定相同的選項，否則您無法傳輸資料表空間。
+ 您無法將資料表空間傳輸到 Oracle 複本組態中的 RDS for Oracle 資料庫執行個體。解決方法是刪除所有複本、傳輸資料表空間，然後重新建立複本。

### 可傳輸資料表空間的先決條件
<a name="oracle-migrating-tts.requirements"></a>

 開始之前，請先完成以下任務：
+ 請於 My Oracle Support 檢閱下列文件所述的可傳輸資料表空間需求：
  + [使用跨平台增量備份來減少可傳輸資料表空間停機時間 (文件 ID 2471245.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2471245.1)
  + [可傳輸資料表空間 (TTS) 的約束與限制：適用的詳細資訊、參考和版本 (文件 ID 1454872.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1454872.1)
  + [可傳輸資料表空間 (TTS) 的主要備註 - 常見疑問與問題 (文件 ID 1166564.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1166564.1)
+ 規劃端序轉換。如果您指定來源平台 ID，RDS for Oracle 會自動轉換端序。若要了解如何找到平台 ID，請參閱[相同 Data Guard 組態中異質主要和實體待命的 Data Guard 支援 (文件 ID 413484.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=413484.1)。
+ 確定已在目標資料庫執行個體上啟用可傳輸資料表空間功能。僅在您執行下列查詢而未收到 `ORA-20304` 錯誤訊息時，才會啟用此功能：

  ```
  SELECT * FROM TABLE(rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files);
  ```

  如果未啟用可傳輸資料表空間功能，請重新啟動資料庫執行個體。如需詳細資訊，請參閱[在資料庫執行個體](USER_RebootInstance.md)。
+ 確定來源和目標資料庫中的時區檔案相同。
+ 確定來源和目標資料庫上的資料庫字元集符合下列任一需求：
  + 字元集相同。
  + 字元集相容。如需相容性需求清單，請參閱 Oracle Database 文件中的[傳輸資料的一般限制](https://docs.oracle.com/en/database/oracle/oracle-database/19/spmdu/general-limitations-on-transporting-data.html#GUID-28800719-6CB9-4A71-95DD-4B61AA603173)。
+ 如果您規劃使用 Amazon S3 傳輸檔案，請執行以下操作：
  + 請確定 Amazon S3 儲存貯體可用於檔案傳輸，且 Amazon S3 儲存貯體與資料庫執行個體位於相同的 AWS 區域。如需指示說明，請參閱《Amazon Simple Storage Service 入門指南》**中的[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)。
  + 依照 [設定 IAM 許可權限以進行 RDS for Oracle 與 Amazon S3 的整合](oracle-s3-integration.preparing.md) 的指示來準備 Amazon S3 儲存貯體，進行 Amazon RDS 整合。
+ 如果您規劃使用 Amazon EFS 傳輸檔案，請確定您已根據 [Amazon EFS 整合](oracle-efs-integration.md) 中的指示設定 EFS。
+ 強烈建議您在目標資料庫執行個體中開啟自動備份。由於[中繼資料匯入步驟](#oracle-migrating-tts.transport.import-dmp)可能失敗，因此請務必將資料庫執行個體還原至匯入前的狀態，以免需要重新備份、傳輸和匯入資料表空間。

## 階段 1：設定來源主機
<a name="oracle-migrating-tts.setup-phase"></a>

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

**設定來源主機的方法如下**

1. 以 Oracle 主目錄擁有者身分登入來源主機。

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

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

   ```
   SELECT * FROM V$TIMEZONE_FILE;
   SELECT * FROM NLS_DATABASE_PARAMETERS 
     WHERE PARAMETER IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
   ```

1. 依照 [Oracle Support 備註 2471245.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2471245.1) 的說明設定可傳輸資料表空間公用程式。

   此設定包括編輯來源主機上的 `xtt.properties` 檔案。下列範例 `xtt.properties` 檔案會指定 `/dsk1/backups` 目錄中三個資料表空間的備份。這些是您規劃傳輸到目標資料庫執行個體的資料表空間。它還會指定來源平台 ID 以自動轉換端序。
**注意**  
如需有效的平台 ID，請參閱[相同 Data Guard 組態中異質主要和實體待命的 Data Guard 支援 (文件 ID 413484.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=413484.1)。

   ```
   #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：準備完整的資料表空間備份
<a name="oracle-migrating-tts.initial-br-phase"></a>

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

**Topics**
+ [步驟 1：備份來源主機上的資料表空間](#oracle-migrating-tts.backup-full)
+ [步驟 2：將備份檔案傳輸到目標資料庫執行個體](#oracle-migrating-tts.transfer-full)
+ [步驟 3：在目標資料庫執行個體上匯入資料表空間](#oracle-migrating-tts.initial-tts-import)

### 步驟 1：備份來源主機上的資料表空間
<a name="oracle-migrating-tts.backup-full"></a>

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

**備份資料表空間的方法如下**

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

   下列範例將 `tbs1`、`tbs2` 和 `tbs3` 設為讀取/寫入模式。

   ```
   ALTER TABLESPACE tbs1 READ WRITE;
   ALTER TABLESPACE tbs2 READ WRITE;
   ALTER TABLESPACE tbs3 READ WRITE;
   ```

1. 使用指令碼 `xttdriver.pl` 備份您的資料表空間。或者，您可以指定 `--debug` 在偵錯模式下執行指令碼。

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

### 步驟 2：將備份檔案傳輸到目標資料庫執行個體
<a name="oracle-migrating-tts.transfer-full"></a>

在此步驟中，請將備份和組態檔案從暫用位置複製到目標資料庫執行個體。請選擇下列其中一個選項：
+ 如果來源主機和目標主機共用 Amazon EFS 檔案系統，請使用作業系統公用程式 (例如 `cp`) 將備份檔案和 `res.txt` 檔案從暫用位置複製到共用目錄。然後跳至 [步驟 3：在目標資料庫執行個體上匯入資料表空間](#oracle-migrating-tts.initial-tts-import)。
+ 如需將備份暫存到 Amazon S3 儲存貯體，請完成以下步驟。

![\[使用 Amazon S3 或 Amazon EFS 傳輸文件。\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/oracle-tts.png)


#### 步驟 2.2：將傾印檔案上傳至 Amazon S3 儲存貯體
<a name="oracle-migrating-tts.upload-full"></a>

將備份和 `res.txt` 檔案從暫存目錄上傳到 Amazon S3 儲存貯體。如需詳細資訊，請參閱 *Amazon Simple Storage Service 使用者指南*中的[上傳物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)。

#### 步驟 2.3：將傾印檔案從 Amazon S3 儲存貯體下載到您的目標資料庫執行個體
<a name="oracle-migrating-tts.download-full"></a>

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

**從 Amazon S3 儲存貯體下載備份的方法如下**

1. 啟動 SQL\$1Plus 或 Oracle SQL Developer，並登入 RDS for Oracle 資料庫執行個體。

1. 使用 Amazon RDS 程序 `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 將備份從 Amazon S3 儲存貯體下載到目標資料庫執行個體。以下範例會從名為 `amzn-s3-demo-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    =>  'amzn-s3-demo-bucket',
     p_directory_name =>  'DATA_PUMP_DIR') 
   AS TASK_ID FROM DUAL;
   ```

   `SELECT` 陳述式以 `VARCHAR2` 資料類型傳回任務 ID。如需詳細資訊，請參閱[將檔案從 Amazon S3 儲存貯體下載至 Oracle 資料庫執行個體](oracle-s3-integration.using.md#oracle-s3-integration.using.download)。

### 步驟 3：在目標資料庫執行個體上匯入資料表空間
<a name="oracle-migrating-tts.initial-tts-import"></a>

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

如果是從 Linux 以外的平台匯入，在呼叫 `import_xtts_tablespaces` 時請使用 `p_platform_id` 參數指定來源平台。請確定您指定的平台 ID 符合 [步驟 2：匯出來源主機上的資料表空間描述資料](#oracle-migrating-tts.transport.export) 中的 `xtt.properties` 檔案所指定的 ID。

**匯入目標資料庫執行個體上的資料表空間**

1. 啟動 Oracle SQL 用戶端，並以主要使用者身分登入 RDS for Oracle 資料庫執行個體。

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

   以下範例從目錄 *DATA\$1PUMP\$1DIR* 匯入資料表 *TBS1*、*TBS2* 和 *TBS3*。來源平台是 AIX 型系統 (64 位元)，其平台 ID 為 `6`。您可以查詢 `V$TRANSPORTABLE_PLATFORM` 以尋找平台 ID。

   ```
   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
   ```

1. (選用) 透過查詢資料表 `rdsadmin.rds_xtts_operation_info` 來監控進度。`xtts_operation_state` 資料欄會顯示值 `EXECUTING`、`COMPLETED` 或`FAILED`。

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```
**注意**  
對於長時間執行的操作，您也可以查詢 `V$SESSION_LONGOPS`、`V$RMAN_STATUS`、和 `V$RMAN_OUTPUT`。

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

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

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

## 階段 3：製作和傳輸增量備份
<a name="oracle-migrating-tts.roll-forward-phase"></a>

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

這些步驟與 [階段 2：準備完整的資料表空間備份](#oracle-migrating-tts.initial-br-phase) 中的相同，不同之處在於匯入步驟具有選擇性。

## 階段 4：傳輸資料表空間
<a name="oracle-migrating-tts.final-br-phase"></a>

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

**Topics**
+ [步驟 1：備份唯讀資料表空間](#oracle-migrating-tts.final-backup)
+ [步驟 2：匯出來源主機上的資料表空間描述資料](#oracle-migrating-tts.transport.export)
+ [步驟 3：(僅限 Amazon S3) 將備份和匯出檔案傳輸到目標資料庫執行個體](#oracle-migrating-tts.transport)
+ [步驟 4：在目標資料庫執行個體上匯入資料表空間](#oracle-migrating-tts.restore-full)
+ [步驟 5：匯入目標資料庫執行個體上的資料表空間中繼資料](#oracle-migrating-tts.transport.import-dmp)

### 步驟 1：備份唯讀資料表空間
<a name="oracle-migrating-tts.final-backup"></a>

此步驟與 [步驟 1：備份來源主機上的資料表空間](#oracle-migrating-tts.backup-full) 相同，但有一項關鍵差異：在最後一次備份資料表空間之前，需將資料表空間設為唯讀模式。

下列範例將 `tbs1`、`tbs2` 和 `tbs3` 設為唯讀模式。

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

### 步驟 2：匯出來源主機上的資料表空間描述資料
<a name="oracle-migrating-tts.transport.export"></a>

在來源主機上執行`expdb`公用程式，以匯出資料表空間中繼資料。以下範例將資料表空間 *TBS1*、*TBS2* 及 *TBS3* 匯出至目錄 *DATA\$1PUMP\$1DIR* 中的傾印檔案 *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\$1PUMP\$1DIR* 是Amazon EFS 中的共用目錄，請跳至。[步驟 4：在目標資料庫執行個體上匯入資料表空間](#oracle-migrating-tts.restore-full)

### 步驟 3：(僅限 Amazon S3) 將備份和匯出檔案傳輸到目標資料庫執行個體
<a name="oracle-migrating-tts.transport"></a>

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

#### 步驟 3.1：將備份和傾印檔案從來源主機上傳到 Amazon S3 儲存貯體
<a name="oracle-migrating-tts.transport.upload-dmp"></a>

將備份和傾印檔案從來源主機上傳到 Amazon S3 儲存貯體 如需詳細資訊，請參閱 *Amazon Simple Storage Service 使用者指南*中的[上傳物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)。

#### 步驟 3.2：將備份和傾印檔案從 Amazon S3 儲存貯體下載到您的目標資料庫執行個體
<a name="oracle-migrating-tts.transport.download-dmp"></a>

在此步驟中，您可以使用 `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 程序將備份與傾印檔案下載到您的 RDS for Oracle 資料庫執行個體。請遵循 [步驟 2.3：將傾印檔案從 Amazon S3 儲存貯體下載到您的目標資料庫執行個體](#oracle-migrating-tts.download-full) 中的步驟。

### 步驟 4：在目標資料庫執行個體上匯入資料表空間
<a name="oracle-migrating-tts.restore-full"></a>

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

**重要**  
完成最後的資料表空間匯入程序後，下一個步驟是[匯入 Oracle Data Pump 中繼資料](#oracle-migrating-tts.transport.export)。如果匯入失敗，請務必在資料庫執行個體回復失敗前的狀態。因此，我們建議您按照[為 Amazon RDS 的單一可用區域資料庫執行個體建立資料庫快照](USER_CreateSnapshot.md)中的說明建立資料庫執行個體的資料庫快照。快照會包含所有匯入的資料表空間，因此如果匯入失敗，您不需要重複備份和匯入程序。  
如果目標資料庫執行個體已開啟自動備份，且 Amazon RDS 在匯入中繼資料之前未偵測到任何有效快照已啟動，則 RDS 會嘗試建立快照。取決於您的執行個體活動，此快照可能但未必會成功。如果未偵測到有效的快照或無法啟動快照，則會結束中繼資料匯入程序，並顯示錯誤訊息。

**匯入目標資料庫執行個體上的資料表空間**

1. 啟動 Oracle SQL 用戶端，並以主要使用者身分登入 RDS for Oracle 資料庫執行個體。

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

   以下範例從目錄 *DATA\$1PUMP\$1DIR* 匯入資料表 *TBS1*、*TBS2* 和 *TBS3*。

   ```
   BEGIN
     :task_id:=rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces('TBS1,TBS2,TBS3','DATA_PUMP_DIR');
   END;
   /
   PRINT task_id
   ```

1. (選用) 透過查詢資料表 `rdsadmin.rds_xtts_operation_info` 來監控進度。`xtts_operation_state` 資料欄會顯示值 `EXECUTING`、`COMPLETED` 或`FAILED`。

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```
**注意**  
對於長時間執行的操作，您也可以查詢 `V$SESSION_LONGOPS`、`V$RMAN_STATUS`、和 `V$RMAN_OUTPUT`。

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

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

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

1. 請依照 [為 Amazon RDS 的單一可用區域資料庫執行個體建立資料庫快照](USER_CreateSnapshot.md) 中的指示擷取手動資料庫快照。

### 步驟 5：匯入目標資料庫執行個體上的資料表空間中繼資料
<a name="oracle-migrating-tts.transport.import-dmp"></a>

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

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

**將 Data Pump 中繼資料匯入 RDS for Oracle 資料庫執行個體。**

1. 啟動 Oracle SQL 用戶端，並以主要使用者身分登入目標資料庫執行個體。

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

   ```
   CREATE USER tbs_owner IDENTIFIED BY password;
   ```

1. 匯入中繼資料，指定傾印檔案的名稱及其目錄位置。

   ```
   BEGIN
     rdsadmin.rdsadmin_transport_util.import_xtts_metadata('xttdump.dmp','DATA_PUMP_DIR');
   END;
   /
   ```

1. (選用) 查詢可傳輸的資料表空間歷史記錄表，以查看中繼資料匯入的狀態。

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```

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

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

   下列範例列出 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：驗證所傳輸的資料表空間
<a name="oracle-migrating-tts.validate"></a>

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

**驗證所傳輸資料的方法如下**

1. 動 SQL\$1Plus 或 SQL Developer，並以主要使用者身分登入目標資料庫執行個體。

1. 使用程序 `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;
   /
   ```

1. 將資料表空間設唯讀取/寫入模式。

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

## 階段 6：清理剩餘檔案
<a name="oracle-migrating-tts.cleanup"></a>

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

**清除剩餘檔案**

1. 移除 *DATA\$1PUMP\$1DIR* 中的舊有備份，如下所示：

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

      ```
      SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'DATA_PUMP_DIR'));
      ```

   1. 呼叫 `UTL_FILE.FREMOVE` 以逐一移除備份。

      ```
      EXEC UTL_FILE.FREMOVE ('DATA_PUMP_DIR', 'backup_filename');
      ```

1. 若已匯入資料表空間，但未匯入這些資料表空間的中繼資料，您可以依照下列方式刪除孤立的資料檔案：

   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
      ```

   1. 執行程序 `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`。

   1. 讀取上一個步驟中產生的日誌檔案。讀取日誌 `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.
      ```

1. 若已匯入這些資料表空間及其中繼資料，但發生相容性錯誤或其他 Oracle Data Pump 問題，請按以下方式清除部分傳輸的資料檔案：

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

      ```
      SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES WHERE PLUGGED_IN='YES';
      
      TABLESPACE_NAME
      --------------------------------------------------------------------------------
      TBS_3
      ```

   1. 刪除資料表空間和部分傳輸的資料檔案。

      ```
      DROP TABLESPACE TBS_3 INCLUDING CONTENTS AND DATAFILES;
      ```

# 使用 Oracle Data Pump 匯入
<a name="Oracle.Procedural.Importing.DataPump"></a>

Oracle Data Pump 是一個公用程式，可讓您將 Oracle 資料匯出至傾印檔案，並將其匯入至另一個 Oracle 資料庫。是 Oracle 匯出/匯入公用程式的長期替代方案。將大量資料從 Oracle 資料庫移動到 Amazon RDS 資料庫執行個體時，建議使用 Oracle Data Pump。

本節中的範例顯示將資料匯入 Oracle 資料庫的一種方法，但是 Oracle Data Pump 支援其他技術。如需詳細資訊，請參閱 [Oracle 資料庫文件](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump.html#GUID-501A9908-BCC5-434C-8853-9A6096766B5A)。

本節中的範例使用 `DBMS_DATAPUMP` 套件。您可以使用 Oracle Data Pump 命令列公用程式 `impdp` 和 `expdp` 來完成相同的工作。您可以在安裝 Oracle 用戶端 (包括 Oracle Instant Client) 期間，將這些公用程式安裝在遠端主機上。如需詳細資訊，請參閱《[如何使用 Oracle 用戶端為我的 Amazon RDS for Oracle 資料庫執行個體執行 Data Pumt 來匯入或匯出？](https://aws.amazon.com/premiumsupport/knowledge-center/rds-oracle-instant-client-datapump/)》

**Topics**
+ [Oracle Data Pump 概觀](#Oracle.Procedural.Importing.DataPump.Overview)
+ [以 Oracle Data Pump 及 Amazon S3 儲存貯體匯入資料](#Oracle.Procedural.Importing.DataPump.S3)
+ [以 Oracle Data Pump 及資料庫連結匯入資料](#Oracle.Procedural.Importing.DataPump.DBLink)

## Oracle Data Pump 概觀
<a name="Oracle.Procedural.Importing.DataPump.Overview"></a>

Oracle Data Pump 由下列元件組成：
+ 命令列用戶端 `expdp` 和 `impdp`
+ `DBMS_DATAPUMP` PL/SQL 套件
+ `DBMS_METADATA` PL/SQL 套件

Oracle Data Pump 可以用於以下案例：
+ 將資料由 Oracle 資料庫 (內部部署或 Amazon EC2 執行個體) 匯入 RDS for Oracle 資料庫執行個體。
+ 將資料從 RDS for Oracle 資料庫執行個體匯入 Oracle 資料庫 (內部部署或 Amazon EC2 執行個體)。
+ 在 RDS for Oracle 資料庫執行個體之間匯入資料 (例如將資料從 EC2-Classic 遷移到 VPC)。

如需下載 Oracle Data Pump 公用程式，請參閱 Oracle Technology Network 網站的 [Oracle 資料庫軟體下載](http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html)。如需了解在 Oracle 資料庫各版本間遷移的相容性考量，請參閱 [Oracle 資料庫文件](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-BAA3B679-A758-4D55-9820-432D9EB83C68)。

### Oracle Data Pump 工作流程
<a name="Oracle.Procedural.Importing.DataPump.Overview.how-it-works"></a>

通常，您會在下列階段使用 Oracel Data Pump：

1. 將資料匯出至來源資料庫上的傾印檔案。

1. 將傾印檔案上傳至目的地 RDS for Oracle 資料庫執行個體。您可使用 Amazon S3 儲存貯體或兩個資料庫之間的資料庫連結進行傳輸。

1. 將資料從傾印檔案匯入 RDS for Oracle 資料庫執行個體。

### Oracle Data Pump 最佳實務
<a name="Oracle.Procedural.Importing.DataPump.Overview.best-practices"></a>

當您使用 Oracle Data Pump 將資料匯入 RDS for Oracle 執行個體時，我們建議您採用下列最佳實務：
+  `schema` 或 `table` 模式執行匯入，以匯入特定結構描述及物件。
+ 匯入的結構描述僅限於應用程式需要的結構描述。
+ 請勿匯入 `full` 模式或匯入系統維護元件的結構描述。

  由於 RDS for Oracle 不允許存取 `SYS` 或 `SYSDBA` 管理使用者，這些動作可能會損害 Oracle 資料目錄，進而影響資料庫的穩定度。
+ 當載入大量資料時，請執行下列作業：

  1. 將傾印檔案傳輸至目標 RDS for Oracle 資料庫執行個體。

  1. 拍攝您執行個體的資料庫快照。

  1. 測試匯入，以確認其是否成功。

  如果資料庫元件失效，您可以刪除資料庫執行個體，並由資料庫快照重新建立。還原的資料庫執行個體，包括您在製作資料庫快照時，暫存於資料庫執行個體的任何傾印檔案。
+ 請勿匯入使用 Oracle Data Pump 匯出參數 `TRANSPORT_TABLESPACES`、`TRANSPORTABLE` 或`TRANSPORT_FULL_CHECK` 建立的傾印檔案。RDS for Oracle 資料庫執行個體不支援匯入這些傾印檔案。
+ 請勿匯入包含 `SYS`、`SYSTEM`、`RDSADMIN`、`RDSSEC` 和 `RDS_DATAGUARD` 中之 Oracle Scheduler 物件的傾印檔案，且屬於下列類別：
  + 任務
  + 程式
  + 排程
  + Chain
  + Rules
  + 評估內容
  + 規則集

  RDS for Oracle 資料庫執行個體不支援匯入這些傾印檔案。
+ 若要排除不支援的 Oracle Scheduler 物件，請在 Data Pump 匯出期間使用其他指令。如果您使用 `DBMS_DATAPUMP`，您可以在 `DBMS_METADATA.START_JOB` 之前新增一個額外的 `METADATA_FILTER`：

  ```
  DBMS_DATAPUMP.METADATA_FILTER(
    v_hdnl,
    'EXCLUDE_NAME_EXPR',
    q'[IN (SELECT NAME FROM SYS.OBJ$ 
           WHERE TYPE# IN (66,67,74,79,59,62,46) 
           AND OWNER# IN
             (SELECT USER# FROM SYS.USER$ 
              WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
              )
          )
    ]',
    'PROCOBJ'
  );
  ```

  如果您使用 `expdp`，請建立包含 `exclude` 下列範例中所示之指令的參數檔案。然後透過 `PARFILE=parameter_file` 命令使用 `expdp`。

  ```
  exclude=procobj:"IN 
    (SELECT NAME FROM sys.OBJ$
     WHERE TYPE# IN (66,67,74,79,59,62,46) 
     AND OWNER# IN 
       (SELECT USER# FROM SYS.USER$ 
        WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
       )
    )"
  ```

## 以 Oracle Data Pump 及 Amazon S3 儲存貯體匯入資料
<a name="Oracle.Procedural.Importing.DataPump.S3"></a>

以下匯入程序使用 Oracle Data Pump 及 Amazon S3 儲存貯體。步驟如下：

1. 使用 Oracle [DBMS\$1DATAPUMP](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DATAPUMP.html) 套件匯出來源資料庫上的資料庫。

1. 將傾印檔案放入 Amazon S3 儲存貯體。

1. 從 Amazon S3 儲存貯體將傾印檔案下載至目標 Amazon RDS for Oracle 資料庫執行個體的 `DATA_PUMP_DIR` 目錄。

1. 使用套件 `DBMS_DATAPUMP`，將資料從複製的傾印檔案匯入 RDS for Oracle 資料庫執行個體。

**Topics**
+ [要求以 Oracle Data Pump 及 Amazon S3 儲存貯體匯入資料](#Oracle.Procedural.Importing.DataPumpS3.requirements)
+ [步驟 1：授予權限給 RDS for Oracle 目標資料庫執行個體上的資料庫使用者](#Oracle.Procedural.Importing.DataPumpS3.Step1)
+ [步驟 2：使用 DBMS\$1DAPUMP 將資料匯出倒傾印檔案](#Oracle.Procedural.Importing.DataPumpS3.Step2)
+ [步驟 3：將傾印檔案上傳至 Amazon S3 儲存貯體](#Oracle.Procedural.Importing.DataPumpS3.Step3)
+ [步驟 4：將傾印檔案從 Amazon S3 儲存貯體下載到您的目標資料庫執行個體](#Oracle.Procedural.Importing.DataPumpS3.Step4)
+ [步驟 5：使用 DBMS\$1DATAPUMP 將您的傾印檔案匯入目標資料庫執行個體](#Oracle.Procedural.Importing.DataPumpS3.Step5)
+ [步驟 6：清除](#Oracle.Procedural.Importing.DataPumpS3.Step6)

### 要求以 Oracle Data Pump 及 Amazon S3 儲存貯體匯入資料
<a name="Oracle.Procedural.Importing.DataPumpS3.requirements"></a>

此程序有以下要求：
+ 請確定 Amazon S3 儲存貯體可用於檔案傳輸，且 Amazon S3 AWS 區域 儲存貯體與資料庫執行個體位於相同位置。如需指示說明，請參閱《Amazon Simple Storage Service 入門指南》**中的[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)。
+ 您上傳到 Amazon S3 儲存貯體的物件必須為 5 TB 或更少。如需在 Amazon S3 中使用物件的詳細資訊，請參閱《[Amazon Simple Storage Service 使用者指南](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingObjects.html)》。
**注意**  
如果您傾印檔案超過 5 TB，您可以使用平行選項執行 Oracle Data Pump 匯出。這項作業會將資料分散到多個傾印檔案，讓您不會超過個別檔案的 5 TB 限制。
+ 您必須遵循 [設定 IAM 許可權限以進行 RDS for Oracle 與 Amazon S3 的整合](oracle-s3-integration.preparing.md) 的指示內容，準備 Amazon S3 儲存貯體進行 Amazon RDS 整合。
+ 您必須確定在來源執行個體和目前的資料庫執行個體上，有足夠的儲存空間可容納傾印檔案。

**注意**  
此程序會將傾印檔案匯入 `DATA_PUMP_DIR` 目錄，這是在所有 Oracle 資料庫執行個體上預先設定好的目錄。此目錄和您的資料檔案位於相同的儲存磁碟區。您匯入傾印檔案時，現有 Oracle 資料檔案會使用更多空間。因此請確保資料庫執行個體能夠容納額外使用的空間。匯入的傾印檔案不會自動刪除或從 `DATA_PUMP_DIR` 目錄清除。如欲移除匯入的傾印檔案，請使用 Oracle 網站上的 [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF)。

### 步驟 1：授予權限給 RDS for Oracle 目標資料庫執行個體上的資料庫使用者
<a name="Oracle.Procedural.Importing.DataPumpS3.Step1"></a>

在此步驟中，您會建立要匯入資料的結構描述，並授與使用者必要的權限。

**若要在 Oracle 目標執行個體的 RDS 上建立使用者並授與必要權限**

1. 使用 SQL\$1Plus 或 Oracle SQL Developer 以主要使用者的身分登入，將 RDS for Oracle 資料庫執行個體連線至資料將匯入之處。如需連線至資料庫執行個體的詳細資訊，請參閱 [連線至 Oracle 資料庫執行個體](USER_ConnectToOracleInstance.md)。

1. 匯入資料前，請先建立所需的資料表空間。如需詳細資訊，請參閱[在 RDS for Oracle 中建立和調整資料表空間的大小](Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles.md#Appendix.Oracle.CommonDBATasks.CreatingTablespacesAndDatafiles)。

1. 如果接收匯入資料的使用者帳戶不存在，請建立使用者帳戶並授予所需的許可和角色。如果要將資料匯入多個使用者結構描述，請建立每個使用者帳戶並授予所需的權限和角色。

   例如，以下 SQL 陳述式會建立新的使用者，並授予必需的許可和角色，以便將資料匯入該使用者擁有的結構描述。請將此步驟及後續步驟的 `schema_1` 替換為結構描述名稱。

   ```
   CREATE USER schema_1 IDENTIFIED BY my_password;
   GRANT CREATE SESSION, RESOURCE TO schema_1;
   ALTER USER schema_1 QUOTA 100M ON users;
   ```
**注意**  
指定此處所顯示提示以外的密碼，作為安全最佳實務。

   上述的陳述式會授予新使用者 `CREATE SESSION` 權限和 `RESOURCE` 角色。您可能會需要其他權限和角色，視您匯入的資料庫物件而定。

### 步驟 2：使用 DBMS\$1DAPUMP 將資料匯出倒傾印檔案
<a name="Oracle.Procedural.Importing.DataPumpS3.Step2"></a>

若要建立傾印檔案，請使用 `DBMS_DATAPUMP` 套件。

**將 Oracle 資料匯出到傾印檔案**

1. 以管理使用者身分，使用 SQL Plus 或 Oracle SQL Developer 連線至來源 RDS for Oracle 資料庫執行個體。如果來源資料庫是 RDS for Oracle 資料庫執行個體，請以 Amazon RDS 主要使用者身分進行連線。

1. 透過呼叫 `DBMS_DATAPUMP` 程序匯出資料。

   下列指令碼會匯出 `SCHEMA_1` 結構描述至 `DATA_PUMP_DIR` 目錄中名為 `sample.dmp` 的傾印檔案。以您要匯出之結構描述的名稱取代 `SCHEMA_1`。

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN(
       operation => 'EXPORT', 
       job_mode  => 'SCHEMA', 
       job_name  => null
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl         , 
       filename  => 'sample.dmp'   , 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_dump_file
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_exp.log', 
       directory => 'DATA_PUMP_DIR' , 
       filetype  => dbms_datapump.ku$_file_type_log_file
     );
     DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl,
       'EXCLUDE_NAME_EXPR',
       q'[IN (SELECT NAME FROM SYS.OBJ$ 
              WHERE TYPE# IN (66,67,74,79,59,62,46) 
              AND OWNER# IN 
                (SELECT USER# FROM SYS.USER$ 
                 WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
                )
             )
       ]',
       'PROCOBJ'
     );
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**注意**  
Data Pump 會以非同步方式開始工作。如需有關監控 Data Pump 任務的詳細資訊，請參閱 Oracle 文件中的[監控工作狀態](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)。

1. (選用) 透過呼叫 `rdsadmin.rds_file_util.read_text_file` 程序檢視匯出日誌的內容。如需詳細資訊，請參閱[讀取資料庫執行個體目錄中的檔案](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)。

### 步驟 3：將傾印檔案上傳至 Amazon S3 儲存貯體
<a name="Oracle.Procedural.Importing.DataPumpS3.Step3"></a>

使用 Amazon RDS 程序 `rdsadmin.rdsadmin_s3_tasks.upload_to_s3`，將傾印檔案複製到 Amazon S3 儲存貯體。以下範例將所有檔案從 `DATA_PUMP_DIR` 目錄上傳至名為 `amzn-s3-demo-bucket` 的 Amazon S3 儲存貯體。

```
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
  p_bucket_name    =>  'amzn-s3-demo-bucket',       
  p_directory_name =>  'DATA_PUMP_DIR') 
AS TASK_ID FROM DUAL;
```

`SELECT` 陳述式以 `VARCHAR2` 資料類型傳回任務 ID。如需詳細資訊，請參閱[將檔案從 RDS for Oracle 資料庫執行個體上傳至 Amazon S3 儲存貯體](oracle-s3-integration.using.md#oracle-s3-integration.using.upload)。

### 步驟 4：將傾印檔案從 Amazon S3 儲存貯體下載到您的目標資料庫執行個體
<a name="Oracle.Procedural.Importing.DataPumpS3.Step4"></a>

使用 Amazon RDS 程序 `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 執行此步驟。當您將文件下載到目錄時，如果目錄中已存在名稱相同的檔案，則程序 `download_from_s3` 會略過下載。如欲從下載目錄移除檔案，請使用 Oracle 網站上的 [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF)。

**若要下載您的傾印檔案**

1. 開始 SQL\$1Plus 或 Oracle SQL Developer，並以主要身分登入 Amazon RDS 目標 Oracle 資料庫執行個體

1. 使用 Amazon RDS 程序 `rdsadmin.rdsadmin_s3_tasks.download_from_s3` 下載傾印檔案。

   以下範例會從名為 `amzn-s3-demo-bucket` 的 Amazon S3 儲存貯體下載所有檔案至 `DATA_PUMP_DIR` 目錄。

   ```
   SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
     p_bucket_name    =>  'amzn-s3-demo-bucket',
     p_directory_name =>  'DATA_PUMP_DIR')
   AS TASK_ID FROM DUAL;
   ```

   `SELECT` 陳述式以 `VARCHAR2` 資料類型傳回任務 ID。如需詳細資訊，請參閱[將檔案從 Amazon S3 儲存貯體下載至 Oracle 資料庫執行個體](oracle-s3-integration.using.md#oracle-s3-integration.using.download)。

### 步驟 5：使用 DBMS\$1DATAPUMP 將您的傾印檔案匯入目標資料庫執行個體
<a name="Oracle.Procedural.Importing.DataPumpS3.Step5"></a>

使用 `DBMS_DATAPUMP` 將結構描述匯入 RDS for Oracle 資料庫執行個體。您可能需要額外選項，例如 `METADATA_REMAP`。

**將資料匯入目標資料庫執行個體**

1. 開始 SQL\$1Plus 或 SQL Developer，並以主要使用者身分登入 RDS for Oracle 資料庫執行個體。

1. 藉由呼叫 `DBMS_DATAPUMP` 程序匯入資料。

   下列範例會從 `sample_copied.dmp` 將 *SCHEMA\$11* 資料匯入目標資料庫執行個體。

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN( 
       operation => 'IMPORT', 
       job_mode  => 'SCHEMA', 
       job_name  => null);
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_copied.dmp', 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_dump_file);
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_imp.log', 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_log_file);
     DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**注意**  
Data Pump 工作會以非同步的方式啟動。如需有關監控 Data Pump 任務的詳細資訊，請參閱 Oracle 文件中的[監控工作狀態](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)。您可以使用 `rdsadmin.rds_file_util.read_text_file` 程序來檢視匯入日誌的內容。如需詳細資訊，請參閱[讀取資料庫執行個體目錄中的檔案](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)。

1. 列出目標資料庫執行個體上的結構描述，以驗證資料匯入。

   例如，以下查詢會傳回 `SCHEMA_1` 的資料表數目。

   ```
   SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER='SCHEMA_1';
   ```

### 步驟 6：清除
<a name="Oracle.Procedural.Importing.DataPumpS3.Step6"></a>

匯入資料後，您可以刪除不繼續保留的檔案。

**若要移除不需要的檔案**

1. 開始 SQL\$1Plus 或 SQL Developer，並以主要使用者身分登入 RDS for Oracle 資料庫執行個體。

1. 使用以下命令列出 `DATA_PUMP_DIR` 中的檔案。

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;
   ```

1. 使用以下命令刪除 `DATA_PUMP_DIR` 中不再需要的檔案。

   ```
   EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','filename');
   ```

   例如以下命令會刪除名為 `sample_copied.dmp` 的檔案。

   ```
   EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample_copied.dmp'); 
   ```

## 以 Oracle Data Pump 及資料庫連結匯入資料
<a name="Oracle.Procedural.Importing.DataPump.DBLink"></a>

以下匯入程序會使用 Oracle Data Pump 和 Oracle [DBMS\$1FILE\$1TRANSFER](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_FILE_TRANSFER.html) 套件。步驟如下：

1. 連接至來源 Oracle 資料庫 (可以是內部部署資料庫、Amazon EC2 執行個體或 RDS for Oracle 資料庫執行個體)。

1. 使用 [DBMS\$1DATAPUMP](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DATAPUMP.html) 套件匯出資料。

1. 使用 `DBMS_FILE_TRANSFER.PUT_FILE` 將傾印檔案從 Oracle 資料庫複製到目標 RDS for Oracle 資料庫執行個體的 `DATA_PUMP_DIR` 目錄 (資料庫執行個體使用資料庫連結與目標連線)。

1. 使用套件 ` DBMS_DATAPUMP` 將資料從複製的傾印檔案匯入 RDS for Oracle 資料庫執行個體。

使用 Oracle Data Pump 及 `DBMS_FILE_TRANSFER` 套件的匯入程序具有下列步驟。

**Topics**
+ [匯入 Oracle Data Pump 及資料庫連結的要求](#Oracle.Procedural.Importing.DataPumpDBLink.requirements)
+ [步驟 1：授予權限給 RDS for Oracle 目標資料庫執行個體上的使用者](#Oracle.Procedural.Importing.DataPumpDBLink.Step1)
+ [步驟 2：向來源資料庫的使用者授予權限](#Oracle.Procedural.Importing.DataPumpDBLink.Step2)
+ [步驟 3：使用 DBMS\$1DATAPUMP 建立傾印檔案](#Oracle.Procedural.Importing.DataPumpDBLink.Step3)
+ [步驟 4：建立與目標資料庫執行個體的資料庫連結](#Oracle.Procedural.Importing.DataPumpDBLink.Step4)
+ [步驟 5：使用 DBMS\$1FILE\$1TRANSFER 將匯出的傾印檔案，複製到目標資料庫執行個體](#Oracle.Procedural.Importing.DataPumpDBLink.Step5)
+ [步驟 6：使用 DBMS\$1DATAPUMP 將資料檔案匯入至目標資料庫執行個體](#Oracle.Procedural.Importing.DataPumpDBLink.Step6)
+ [步驟 7：清理](#Oracle.Procedural.Importing.DataPumpDBLink.Step7)

### 匯入 Oracle Data Pump 及資料庫連結的要求
<a name="Oracle.Procedural.Importing.DataPumpDBLink.requirements"></a>

此程序有以下要求：
+ 您必須具有在 `DBMS_FILE_TRANSFER` 上和 `DBMS_DATAPUMP` 套件的執行權限。
+ 您必須有寫入來源資料庫執行個體 `DATA_PUMP_DIR` 目錄的權限。
+ 您必須確定在來源執行個體和目前的資料庫執行個體上，有足夠的儲存空間可容納傾印檔案。

**注意**  
此程序會將傾印檔案匯入 `DATA_PUMP_DIR` 目錄，這是在所有 Oracle 資料庫執行個體上預先設定好的目錄。此目錄和您的資料檔案位於相同的儲存磁碟區。您匯入傾印檔案時，現有 Oracle 資料檔案會使用更多空間。因此請確保資料庫執行個體能夠容納額外使用的空間。匯入的傾印檔案不會自動刪除或從 `DATA_PUMP_DIR` 目錄清除。如欲移除匯入的傾印檔案，請使用 Oracle 網站上的 [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF)。

### 步驟 1：授予權限給 RDS for Oracle 目標資料庫執行個體上的使用者
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step1"></a>

如欲向 RDS for Oracle 目標資料庫執行個體的使用者授予權限，請進行下列步驟：

1. 使用 SQL Plus 或 Oracle SQL Developer，將 RDS for Oracle 資料庫執行個體連線至資料將匯入之處。以 Amazon RDS 主要使用者身分進行連線。如需連線至資料庫執行個體的詳細資訊，請參閱 [連線至 Oracle 資料庫執行個體](USER_ConnectToOracleInstance.md)。

1. 匯入資料前，請先建立所需的資料表空間。如需更多詳細資訊，請參閱 [在 RDS for Oracle 中建立和調整資料表空間的大小](Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles.md#Appendix.Oracle.CommonDBATasks.CreatingTablespacesAndDatafiles)。

1. 如果接受匯入資料的使用者帳戶不存在，請建立使用者帳戶並授予所需的許可和角色。如果要將資料匯入多個使用者結構描述，請建立每個使用者帳戶並授予所需的權限和角色。

   例如，以下命令會建立名稱為 *schema\$11* 的新使用者，並授予必需的許可和角色，以便將資料匯入該使用者的結構描述。

   ```
   CREATE USER schema_1 IDENTIFIED BY my-password;
   GRANT CREATE SESSION, RESOURCE TO schema_1;
   ALTER USER schema_1 QUOTA 100M ON users;
   ```
**注意**  
指定此處所顯示提示以外的密碼，作為安全最佳實務。

   上述範例向新使用者授予 `CREATE SESSION` 權限及 `RESOURCE` 角色。您可能會需要其他權限和角色，視您匯入的資料庫物件而定。
**注意**  
請將此步驟及後續步驟的 `schema_1` 替換為結構描述名稱。

### 步驟 2：向來源資料庫的使用者授予權限
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step2"></a>

使用 SQL\$1Plus 或 Oracle SQL Developer，連線至包含要匯入之資料的 RDS for Oracle 資料庫執行個體。如有需要，建立使用者帳戶並授予必需的許可。

**注意**  
若來源資料庫是 Amazon RDS 執行個體，您可以略過此步驟。您會使用您的 Amazon RDS 主要使用者帳戶執行匯出。

以下命令會建立新的使用者並授予必需的許可。

```
CREATE USER export_user IDENTIFIED BY my-password;
GRANT CREATE SESSION, CREATE TABLE, CREATE DATABASE LINK TO export_user;
ALTER USER export_user QUOTA 100M ON users;
GRANT READ, WRITE ON DIRECTORY data_pump_dir TO export_user;
GRANT SELECT_CATALOG_ROLE TO export_user;
GRANT EXECUTE ON DBMS_DATAPUMP TO export_user;
GRANT EXECUTE ON DBMS_FILE_TRANSFER TO export_user;
```

**注意**  
指定此處所顯示提示以外的密碼，作為安全最佳實務。

### 步驟 3：使用 DBMS\$1DATAPUMP 建立傾印檔案
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step3"></a>

若要建立傾印檔案，請執行下列步驟：

1. 以管理使用者或您在步驟 2 建立的使用者身分，使用 SQL\$1Plus 或 Oracle SQL Developer 連線至來源 Oracle 資料庫。如果來源資料庫是 Amazon RDS for Oracle 資料庫執行個體，請以 Amazon RDS 主要使用者身分進行連線。

1. 使用 Oracle Data Pump 公用程式建立傾印檔案。

   以下指令碼會在 `DATA_PUMP_DIR` 目錄中建立名為 *sample.dmp* 的傾印檔案。

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN( 
       operation => 'EXPORT' , 
       job_mode  => 'SCHEMA' , 
       job_name  => null
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample.dmp'    , 
       directory => 'DATA_PUMP_DIR' , 
       filetype  => dbms_datapump.ku$_file_type_dump_file
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl           , 
       filename  => 'sample_exp.log' , 
       directory => 'DATA_PUMP_DIR'  , 
       filetype  => dbms_datapump.ku$_file_type_log_file
     );
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl              ,
       'SCHEMA_EXPR'       ,
       'IN (''SCHEMA_1'')'
     );
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl,
       'EXCLUDE_NAME_EXPR',
       q'[IN (SELECT NAME FROM sys.OBJ$ 
              WHERE TYPE# IN (66,67,74,79,59,62,46) 
              AND OWNER# IN 
                (SELECT USER# FROM SYS.USER$ 
                 WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
                )
             )
       ]',
       'PROCOBJ'
     );
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**注意**  
Data Pump 工作會以非同步的方式啟動。如需有關監控 Data Pump 任務的詳細資訊，請參閱 Oracle 文件中的[監控工作狀態](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)。您可以使用 `rdsadmin.rds_file_util.read_text_file` 程序檢視匯出日誌的內容。如需更多詳細資訊，請參閱 [讀取資料庫執行個體目錄中的檔案](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)。

### 步驟 4：建立與目標資料庫執行個體的資料庫連結
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step4"></a>

在來源資料庫執行個體與目標資料庫執行個體之間建立資料庫連結。您的本機 Oracle 執行個體必須可以和資料庫執行個體網路連線，才能建立資料庫連結以及傳輸匯出傾印檔案。

請以前一步驟的相同使用者身分執行此步驟。

如果是在相同 VPC 或對等連接 VPC 內的兩個資料庫執行個體之間建立資料庫連結，兩個資料庫執行個體之間應具備有效路由。這兩個資料庫執行個體的安全群組，皆必須允許輸入和輸出到其他資料庫執行個體。安全群組的傳入和傳出規則可以參考相同 VPC 或對等連接 VPC 的安全群組。如需更多詳細資訊，請參閱 [調整資料庫連結以搭配使用 VPC 中的資料庫執行個體](Appendix.Oracle.CommonDBATasks.DBLinks.md)。

以下命令會建立名為 `to_rds` 的資料庫連結，可連接至目標資料庫執行個體的 Amazon RDS 主要使用者。

```
CREATE DATABASE LINK to_rds 
  CONNECT TO <master_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>)))';
```

### 步驟 5：使用 DBMS\$1FILE\$1TRANSFER 將匯出的傾印檔案，複製到目標資料庫執行個體
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step5"></a>

使用 `DBMS_FILE_TRANSFER`，將傾印檔案從來源資料庫執行個體複製到目標資料庫執行個體。以下指令碼會將名為 sample.dmp 的傾印檔案，從來源執行個體複製到名為 *to\$1rds* 的目標資料庫連結 (在先前步驟中建立)。

```
BEGIN
  DBMS_FILE_TRANSFER.PUT_FILE(
    source_directory_object       => 'DATA_PUMP_DIR',
    source_file_name              => 'sample.dmp',
    destination_directory_object  => 'DATA_PUMP_DIR',
    destination_file_name         => 'sample_copied.dmp', 
    destination_database          => 'to_rds' );
END;
/
```

### 步驟 6：使用 DBMS\$1DATAPUMP 將資料檔案匯入至目標資料庫執行個體
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step6"></a>

使用 Oracle Data Pump 匯入資料庫執行個體上的結構描述。您可能需要額外選項，例如 METADATA\$1REMAP。

 使用 Amazon RDS 主要使用者帳戶連線到資料庫執行個體以進行匯入。

```
DECLARE
  v_hdnl NUMBER;
BEGIN
  v_hdnl := DBMS_DATAPUMP.OPEN( 
    operation => 'IMPORT', 
    job_mode  => 'SCHEMA', 
    job_name  => null);
  DBMS_DATAPUMP.ADD_FILE( 
    handle    => v_hdnl, 
    filename  => 'sample_copied.dmp',
    directory => 'DATA_PUMP_DIR', 
    filetype  => dbms_datapump.ku$_file_type_dump_file );
  DBMS_DATAPUMP.ADD_FILE( 
    handle    => v_hdnl, 
    filename  => 'sample_imp.log', 
    directory => 'DATA_PUMP_DIR', 
    filetype  => dbms_datapump.ku$_file_type_log_file);
  DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
  DBMS_DATAPUMP.START_JOB(v_hdnl);
END;
/
```

**注意**  
Data Pump 工作會以非同步的方式啟動。如需有關監控 Data Pump 任務的詳細資訊，請參閱 Oracle 文件中的[監控工作狀態](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)。您可以使用 `rdsadmin.rds_file_util.read_text_file` 程序來檢視匯入日誌的內容。如需更多詳細資訊，請參閱 [讀取資料庫執行個體目錄中的檔案](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)。

您可以檢視資料庫執行個體上的使用者資料表，以確認資料的匯入。例如，以下查詢會傳回 `schema_1` 的資料表數目。

```
SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER='SCHEMA_1'; 
```

### 步驟 7：清理
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step7"></a>

匯入資料後，您可以刪除不繼續保留的檔案。您可以使用以下命令列出 `DATA_PUMP_DIR` 中的檔案。

```
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;
```

以下命令可用來刪除 `DATA_PUMP_DIR` 中不再需要的檔案。

```
EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','<file name>');
```

例如以下命令會刪除名為 `"sample_copied.dmp"` 的檔案。

```
EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample_copied.dmp'); 
```

# 使用 Oracle Export/Import 進行匯入
<a name="Oracle.Procedural.Importing.ExportImport"></a>

在下列情況下，您可以考慮使用 Oracle Export/Import 公用程式來進行遷移：
+ 您的資料很小。
+ 不需要二進位浮點數和雙精度等資料類型。

匯入程序會建立必要的結構描述物件。因此不需要事先執行指令碼來建立物件。

安裝 Oracle 匯出和匯入公用程式的最簡單方法是安裝 Oracle Instant Client。若要下載該軟體，請前往 [https://www.oracle.com/database/technologies/instant-client.html](https://www.oracle.com/database/technologies/instant-client.html)。如需說明文件，請參閱《Oracle 資料庫公用程式》**手冊中的 [SQL\$1Loader 即時用戶端、匯出和匯入](https://docs.oracle.com/en/database/oracle/oracle-database/21/sutil/instant-client-sql-loader-export-import.html#GUID-FF1B6F75-09F5-4911-9317-9776FAD15965)。

**匯出資料表然後匯入**

1. 請使用 `exp` 命令從來源資料庫匯出資料表。

   下列命令會匯出名為 `tab1`、`tab2` 及 `tab3` 的資料表。`exp_file.dmp` 是傾印檔案。

   ```
   exp cust_dba@ORCL FILE=exp_file.dmp TABLES=(tab1,tab2,tab3) LOG=exp_file.log
   ```

   匯出會建立一個二進位傾印檔案，其中包含指定資料表的結構描述和資料。

1. 使用 `imp` 命令將此結構描述和資料匯入目標資料庫。

   下列命令會從傾印檔案 `exp_file.dmp` 匯入名為 `tab1`、`tab2` 及 `tab3` 的資料表。

   ```
   imp cust_dba@targetdb FROMUSER=cust_schema TOUSER=cust_schema \  
   TABLES=(tab1,tab2,tab3) FILE=exp_file.dmp LOG=imp_file.log
   ```

匯出和匯出可能還有其版本更適合您的要求。請參閱 Oracle 資料庫文件以獲得完整的詳細資訊。

# 使用 Oracle SQL\$1Loader 匯入
<a name="Oracle.Procedural.Importing.SQLLoader"></a>

您可以考慮針對有數量物件限制的大型資料庫使用 Oracle SQL\$1Loader。因為此程序會從來源資料庫匯出並載入到目標資料庫，所以與結構描述非常相關；以下範例會建立範例結構描述物件、從來源匯出、然後將資料載入到目標資料庫。

安裝 Oracle SQL\$1Loader 最簡單的方法是安裝 Oracle Instant Client。若要下載該軟體，請前往 [https://www.oracle.com/database/technologies/instant-client.html](https://www.oracle.com/database/technologies/instant-client.html)。如需說明文件，請參閱《Oracle 資料庫公用程式》**手冊中的 [SQL\$1Loader 即時用戶端、匯出和匯入](https://docs.oracle.com/en/database/oracle/oracle-database/21/sutil/instant-client-sql-loader-export-import.html#GUID-FF1B6F75-09F5-4911-9317-9776FAD15965)。

**使用 Oracle SQL\$1Loader 匯入資料**

1. 使用下列 SQL 陳述式建立樣本來源資料表。

   ```
   CREATE TABLE customer_0 TABLESPACE users 
      AS (SELECT ROWNUM id, o.* 
          FROM   ALL_OBJECTS o, ALL_OBJECTS x 
          WHERE  ROWNUM <= 1000000);
   ```

1. 在目標 RDS for Oracle 資料庫執行個體上建立目標資料表，用於載入資料。子句 `WHERE 1=2` 確保您複製 `ALL_OBJECTS` 的結構，但不複製任何資料列。

   ```
   CREATE TABLE customer_1 TABLESPACE users 
     AS (SELECT 0 AS ID, OWNER, OBJECT_NAME, CREATED
         FROM   ALL_OBJECTS
         WHERE  1=2);
   ```

1. 將資料從來源資料庫匯出成為文字檔。下列範例使用 SQL\$1Plus。針對您的資料，您可能需要建立指令碼來執行資料庫中所有物件的匯出。

   ```
   ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS'
   
   SET LINESIZE 800 HEADING OFF FEEDBACK OFF ARRAY 5000 PAGESIZE 0
   SPOOL customer_0.out 
   SET MARKUP HTML PREFORMAT ON
   SET COLSEP ','
   
   SELECT id, owner, object_name, created 
   FROM   customer_0; 
   
   SPOOL OFF
   ```

1. 建立控制檔案來描述資料。您可能需要撰寫指令碼來執行此步驟。

   ```
   cat << EOF > sqlldr_1.ctl 
   load data
   infile customer_0.out
   into table customer_1
   APPEND
   fields terminated by "," optionally enclosed by '"'
   (
     id           POSITION(01:10)    INTEGER EXTERNAL,
     owner        POSITION(12:41)    CHAR,
     object_name  POSITION(43:72)    CHAR,
     created      POSITION(74:92)    date "YYYY/MM/DD HH24:MI:SS"
   )
   ```

   如有需要，請將先前程式碼產生的檔案複製到暫存區域，例如 Amazon EC2 執行個體中。

1. 使用 SQL\$1Loader 和適當的目標資料庫使用者名稱與密碼來匯入資料。

   ```
   sqlldr cust_dba@targetdb CONTROL=sqlldr_1.ctl BINDSIZE=10485760 READSIZE=10485760 ROWS=1000 
   ```

# 使用 Oracle 具體化檢視進行遷移
<a name="Oracle.Procedural.Importing.Materialized"></a>

若要有效的遷移大型資料庫，您也可以使用 Oracle 的具體化檢視複寫功能。透過複寫，您可以使目標資料表與來源資料表維持同步。因此，您可以視需要之後切換為 Amazon RDS。

請確保您符合下列要求，才能使用具體化檢視進行遷移：
+ 設定目標資料庫到來源資料庫之間的存取。在以下範例中，來源資料庫上所啟用的存取規則，會允許 RDS for Oracle 目標資料庫透過 SQL\$1Net 連線到來源。
+ 建立從 RDS for Oracle 資料庫執行個體到來源資料庫之間的資料庫連結。

**若要使用具體化檢視遷移資料**

1. 在來源和 RDS for Oracle 目標執行個體上，建立可以使用相同密碼進行身分驗證的使用者帳戶。以下範例會建立名為 `dblink_user` 的使用者。

   ```
   CREATE USER dblink_user IDENTIFIED BY my-password
     DEFAULT TABLESPACE users
     TEMPORARY TABLESPACE temp;
      
   GRANT CREATE SESSION TO dblink_user;
   
   GRANT SELECT ANY TABLE TO dblink_user;
   
   GRANT SELECT ANY DICTIONARY TO dblink_user;
   ```
**注意**  
指定此處所顯示提示以外的密碼，作為安全最佳實務。

1. 使用您新建立的使用者，建立從 RDS for Oracle 目標執行個體到來源執行個體的資料庫連結。

   ```
   CREATE DATABASE LINK remote_site
     CONNECT TO dblink_user IDENTIFIED BY my-password
     USING '(description=(address=(protocol=tcp) (host=my-host) 
       (port=my-listener-port)) (connect_data=(sid=my-source-db-sid)))';
   ```
**注意**  
指定此處所顯示提示以外的密碼，作為安全最佳實務。

1. 測試連結：

   ```
   SELECT * FROM V$INSTANCE@remote_site;
   ```

1. 在來源執行個體上，建立包含主要索引鍵和具體化檢視日誌的範例資料表。

   ```
   CREATE TABLE customer_0 TABLESPACE users 
     AS (SELECT ROWNUM id, o.* 
         FROM   ALL_OBJECTS o, ALL_OBJECTS x
         WHERE  ROWNUM <= 1000000);
   
   ALTER TABLE customer_0 ADD CONSTRAINT pk_customer_0 PRIMARY KEY (id) USING INDEX;
   
   CREATE MATERIALIZED VIEW LOG ON customer_0;
   ```

1. 在目標 RDS for Oracle 資料庫執行個體上建立具體化檢視。

   ```
   CREATE MATERIALIZED VIEW customer_0 
     BUILD IMMEDIATE REFRESH FAST 
     AS (SELECT * 
         FROM   cust_dba.customer_0@remote_site);
   ```

1. 在目標 RDS for Oracle 資料庫執行個體上重新整理具體化檢視。

   ```
   EXEC DBMS_MVIEW.REFRESH('CUSTOMER_0', 'f');
   ```

1. 捨棄具體化檢視，納入 `PRESERVE TABLE` 子句，以保留具體化檢視容器資料表及其內容。

   ```
   DROP MATERIALIZED VIEW customer_0 PRESERVE TABLE;
   ```

   前述保留資料表的名稱，與捨棄的具體化檢視相同。