

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

# RDS Custom for Oracle 終止支援
<a name="RDS-Custom-for-Oracle-end-of-support"></a>

**注意**  
終止支援通知：2027 年 3 月 31 日， AWS 將終止對 Amazon RDS Custom for Oracle 的支援。2027 年 3 月 31 日之後，您將無法再存取 RDS Custom for Oracle 主控台或 RDS Custom for Oracle 資源。如需詳細資訊，請參閱[RDS Custom for Oracle 終止支援](#RDS-Custom-for-Oracle-end-of-support)。

## 概觀
<a name="RDS-Custom-for-Oracle-end-of-support-overview"></a>

在仔細考慮之後， AWS 決定停止 Amazon RDS Custom for Oracle 服務。該服務將於 **2027 年 3 月 31** 日棄用。此方案指引提供詳細的遷移策略，協助您從 RDS Custom for Oracle 遷移至 Amazon Elastic Compute Cloud (Amazon EC2) 上的自我管理 Oracle 資料庫。

### 關鍵時間限制
<a name="RDS-Custom-for-Oracle-end-of-support-key_timelines"></a>
+ **從 2026 年 3 月 31 日至 2027 年 3 月 31** 日：我們建議您從 RDS Custom for Oracle 遷移至在 EC2 上執行 Oracle。在此期間，您可以繼續使用 RDS Custom for Oracle 搭配現有的功能和支援。
+ **2027 年 3 月 31 日之後**：您將無法再使用 RDS Custom for Oracle 服務。

### 目標受眾
<a name="RDS-Custom-for-Oracle-end-of-support-target_audience"></a>

本指南適用於：
+ 負責 Oracle 資料庫遷移的資料庫管理員
+ 雲端架構師規劃遷移策略
+ 管理資料庫基礎設施的 DevOps 工程師
+ 監督遷移程序的 IT 管理員

### 先決條件
<a name="RDS-Custom-for-Oracle-end-of-support-prerequisites"></a>

開始前，請確保您具備以下條件：
+ 執行 Oracle 19c Enterprise Edition 的作用中 Amazon RDS Custom for Oracle 執行個體
+ 建立和管理 EC2 執行個體的適當 AWS Identity and Access Management (IAM) 許可
+ 了解您的資料庫架構 （非 CDB 或具有 PDBs)
+ 來源和目標執行個體之間的網路連線規劃
+ 遷移的備份和復原策略

## 遷移選項
<a name="RDS-Custom-for-Oracle-end-of-support-migration_options"></a>

在遷移過程中，您可以根據您的業務需求和使用案例選擇兩個遷移選項之一：

### 選項 1：RMAN Active Duplication （線上/離線遷移）
<a name="RDS-Custom-for-Oracle-end-of-support-migration_options-RMAN"></a>

**最適合**
+ 可在最終切換期間提供計劃停機時間的工作負載
+ 以較少的移動組件簡化遷移需求
+ 您想要直接進行一次性遷移的資料庫
+ 在切換前不需要持續同步的情況

**重要特性**
+ **停機時間**：最終切換期間的最低停機時間 （重複期間資料庫保持線上狀態、最終切換的短暫停機時間）
+ **複雜性**：使用直接資料庫複製降低複雜性
+ **持續時間**：遷移時間取決於資料庫大小和網路頻寬
+ **備用**：需要維護來源資料庫，直到驗證完成為止
+ **線上功能**：來源資料庫在重複過程中保持線上狀態並可存取

**遷移方法：**RMAN 作用中複製會透過網路從執行中來源資料庫複製資料庫檔案，在目標上建立來源資料庫的確切複本。在重複程序期間，來源資料庫會保持線上狀態，可供應用程式存取。對於多租戶資料庫，RMAN 會在單一操作中自動複製整個 CDB`PDB$SEED`，包括 `CDB$ROOT`、 和所有可插入資料庫。只需要短暫的切換時段，將應用程式重新導向至新的 EC2 執行個體。

### 選項 2：Oracle Data Guard （線上遷移）
<a name="RDS-Custom-for-Oracle-end-of-support-migration_options-Oracle-Data-Guard"></a>

**最適合**
+ 需要最少停機時間的生產工作負載
+ 必須保持可用的任務關鍵資料庫
+ 在切換之前需要持續同步的情況
+ 需要內建備用功能的遷移

**重要特性**
+ **停機時間**：接近零停機時間 （切換的秒到分鐘）
+ **複雜性**：使用 Data Guard 組態提高複雜性
+ **持續時間**：初始設定時間加上持續同步，直到切換
+ **備用**：透過將來源保持為待命狀態來內建備用功能

**遷移方法：**Oracle Data Guard 會透過持續從主要資料庫傳送和套用重做日誌，來維護同步待命資料庫。當您準備好完成遷移時，您可以執行切換，將 EC2 待命提升為主要節點，並將停機時間降至最低。對於多租戶資料庫，Data Guard 會自動保護整個 CDB，包括所有 PDBs。

 **決策矩陣** 

使用下列矩陣來協助選擇適當的遷移選項：


|  **Aspect**  |  **RMAN 作用中複製**  |  **Oracle Data Guard**  | 
| --- | --- | --- | 
| **來源資料庫可用性** | 複製期間上線 | 在整個程序期間上線 | 
| **可接受的停機時間** | 分鐘到小時 （最終切換） | 秒到分鐘 （切換） | 
| **遷移複雜性** | 較低 | 較高 | 
| **持續同步** | 否 | 是 | 
| **備用功能** | 手動 （保留來源） | 內建 （自動） | 
| **切換前測試** | 有限 | 可進行完整測試 | 
| **網路頻寬需求** | 重複期間高 | 中等 （連續） | 
| **最適合** | 大多數遷移、開發/測試、計劃切換 | 生產、關鍵任務、幾近零的停機時間 | 

### 架構考量
<a name="RDS-Custom-for-Oracle-end-of-support-migration_options-architecture-considerations"></a>

兩個遷移選項都支援兩種 Oracle 資料庫架構：

 **非 CDB** 

沒有多租戶架構的傳統單一執行個體 Oracle 資料庫。這些資料庫：
+ 擁有單一資料庫執行個體
+ 請勿使用可插入資料庫 PDBs)
+ 更容易管理和遷移
+ 通常在 RDS Custom for Oracle 中命名為 ORCL

 **多租戶 (CDB PDBs)** 

容器資料庫 (CDB) 託管多個插入式資料庫 (PDBs)，在 Oracle 12c 中推出。這些資料庫：
+ 使用 `CDB$ROOT`和 建立容器資料庫 (CDB) `PDB$SEED`
+ 託管一或多個可插入資料庫 PDBs)
+ 提供資料庫整合和資源隔離
+ 通常在 RDS Custom for Oracle 中命名為 RDSCDB
+ 將 Oracle 受管檔案 (OMF) 與 PDB 資料檔案的 GUID 型子目錄搭配使用

**多租戶遷移的重要注意事項**：目標資料庫將在遷移過程中重新命名為 ORCL （來源：RDSCDB → 目標：ORCL)。這可簡化目標組態，並符合標準命名慣例。

 **遷移方法的主要差異** 


|  **Aspect**  |  **非 CDB**  |  **多租戶 (CDB PDBs)**  | 
| --- | --- | --- | 
| **遷移範圍** | 單一資料庫 | 具有所有 PDBs | 
| **遷移後狀態**  | 資料庫開啟讀取寫入 | CDB 開啟讀取寫入；PDBs處於 MOUNTED 狀態 | 
| **PDB 管理** | N/A | 必須開啟 PDBs並設定自動開啟 | 
| **清除** | 單一資料庫 | CDB$ROOT （層疊到 PDBs)；處理 C\#\# 常用使用者 | 
| **應用程式連線** | 資料庫服務 | PDB 服務 （非 CDB) | 
| **參數檔案** | 標準參數 | 需要 enable\_pluggable\_database=TRUE | 
| **複雜性** | 較低 | 由於多個容器而更高 | 

## 兩個遷移選項的常見先決條件
<a name="RDS-Custom-for-Oracle-end-of-support-common-prerequisites"></a>

在開始任一個遷移選項之前，請完成下列先決條件步驟：

1. 啟動和設定 EC2 執行個體

   啟動具有下列考量的 EC2 執行個體：
   + **執行個體類型**：選擇符合工作負載資源需求的 EC2 執行個體類型。使用與 RDS Custom 執行個體相同的執行個體類別是很好的起點。考慮記憶體、CPU 和網路頻寬需求。
   + **作業系統**：Oracle Linux 或 Red Hat Enterprise Linux （與您的 RDS Custom OS 版本相符或相容）
   + **Oracle 軟體**：安裝 Oracle Database 軟體 （主要版本、次要版本、版本更新，以及理想情況下與 RDS Custom 相同的一次性修補程式）。確保 Oracle 軟體安裝在 /u01/app/oracle/ 或您偏好的位置。
   + **儲存**：使用適當的大小和 IOPS 設定 Amazon EBS 磁碟區，以符合您的工作負載需求。考慮將 gp3 磁碟區用於經濟實惠的效能，或將 io2 Block Express 用於高效能工作負載。

1. 設定儲存架構

   1. 檔案系統儲存 （建議大多數案例使用）
      + 使用 Oracle 資料檔案的標準檔案系統目錄
      + 更輕鬆地管理和適用於大多數工作負載
      + 本指南使用檔案系統儲存範例

   1. Oracle 自動儲存管理 (ASM)
      + 如果您的工作負載需要 ASM，請在 EC2 執行個體上安裝和設定獨立 ASM
      + 相應地調整 init 檔案中的所有路徑參數，以使用 ASM 磁碟群組 （例如 \+DATA、\+FRA)
      + ASM 的遷移程序類似，具有路徑調整

1. 設定檔案傳輸機制

   建立在 RDS Custom 和 EC2 執行個體之間傳輸檔案的機制。您有多種選擇：

   1. 選項 A：Amazon S3 （建議大多數案例使用）
      + 建立 Amazon S3 儲存貯體或使用現有的儲存貯體
      + 在兩個執行個體上安裝和設定 AWS CLI
      + 如需說明，請參閱 [入門 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)。

   1. 選項 B：直接 SCP/SFTP
      + 如果在執行個體之間開啟 SSH 連接埠，您可以直接傳輸檔案
      + 適合參數檔案和密碼檔案等小型檔案

   1. 選項 C：Amazon EFS
      + 如果您已在兩個執行個體上掛載 Amazon EFS，則可以將其用作共用檔案系統
      + 適用於具有現有 EFS 基礎設施的環境

      本指南使用 Amazon S3 做為範例，但您可以調整所選方法的命令。

1. 設定網路連線

   確保 RDS Custom 和 EC2 執行個體之間的網路連線：
   + **相同的 VPC**：安全群組必須允許 Oracle 接聽程式連接埠上的雙向流量 （預設 1521，或您的自訂連接埠）
   + **不同的 VPCs（相同帳戶）**：設定 VPC 對等互連並設定路由表和安全群組
   + **不同的帳戶**：設定跨帳戶的 VPC 對等互連或使用 AWS Transit Gateway
   + **驗證連線**：使用 ping 和 telnet 測試資料庫連接埠上的連線

1. 在 EC2 上建立目錄結構

   目錄結構取決於您的資料庫架構：  
**Example 對於非 CDB：**  

   ```
   # Non-CDB directories
   mkdir -p /u01/app/oracle/oradata/ORCL/controlfile/
   mkdir -p /u01/app/oracle/oradata/ORCL/datafile
   mkdir -p /u01/app/oracle/oradata/ORCL/onlinelog
   mkdir -p /u01/app/oracle/oradata/ORCL/arch
   mkdir -p /u01/app/oracle/admin/ORCL/adump
   mkdir -p /u01/app/oracle/backup
   # Set ownership
   chown -R oracle:oinstall /u01/app/oracle/oradata/ORCL
   chown -R oracle:oinstall /u01/app/oracle/admin/ORCL
   chown -R oracle:oinstall /u01/app/oracle/backup
   ```  
**Example 對於多租戶 (CDB PDBs)**  

   ```
   # CDB directories
   mkdir -p /u01/app/oracle/oradata/ORCL/controlfile/
   mkdir -p /u01/app/oracle/oradata/ORCL/cdb/datafile
   mkdir -p /u01/app/oracle/oradata/ORCL/pdbseed/datafile
   mkdir -p /u01/app/oracle/oradata/ORCL/onlinelog
   mkdir -p /u01/app/oracle/oradata/ORCL/arch
   mkdir -p /u01/app/oracle/admin/ORCL/adump
   mkdir -p /u01/app/oracle/backup
   # PDB directories (RDS Custom uses OMF with GUID-based paths)
   # Create a generic pdb directory - migration will create subdirectories as needed
   mkdir -p /u01/app/oracle/oradata/ORCL/pdb/datafile
   # Set ownership
   chown -R oracle:oinstall /u01/app/oracle/oradata/ORCL
   chown -R oracle:oinstall /u01/app/oracle/admin/ORCL
   chown -R oracle:oinstall /u01/app/oracle/backup
   ```
**注意**  
RDS Custom for Oracle 使用 Oracle Managed Files (OMF) 搭配 GUID 型子目錄 （例如 `/rdsdbdata/db/pdb/RDSCDB_A/{{{GUID}}}/datafile/`) 的 PDB 資料檔案。遷移程序會自動在目標上建立必要的子目錄結構。您只需要建立父目錄。

   **儲存策略**：考慮為 /u01/app/oracle/backup 使用單獨的 EBS 磁碟區，以便在遷移完成後輕鬆分離和移除它，從而釋放儲存成本。

1. 驗證來源資料庫組態

開始遷移之前，請確認您的來源資料庫組態：

1. 以 rdsdb 使用者身分登入 RDS Custom 資料庫主機，並設定環境：  
**Example**  

   ```
   # For non-CDB
   export ORACLE_HOME=/rdsdbbin/oracle.19.custom.r1.EE.1
   export ORACLE_SID=ORCL
   export PATH=$ORACLE_HOME/bin:$PATH
   
   # For multitenant CDB
   export ORACLE_HOME=/rdsdbbin/oracle.19.custom.r1.EE-CDB.1
   export ORACLE_SID=RDSCDB
   export PATH=$ORACLE_HOME/bin:$PATH
   ```

1. 連線至資料庫並檢查架構：  
**Example**  

   ```
   sqlplus / as sysdba
   SQL> SELECT name, cdb, open_mode, log_mode FROM v$database;
   ```  
**Example 對於非 CDB，預期輸出**  

   ```
   NAME CDB OPEN_MODE                 LOG_MODE
   --------- --- -------------------- ------------
   ORCL NO  READ  WRITE               ARCHIVELOG
   ```  
**Example 對於多租戶 (CDB)，預期的輸出：**  

   ```
   NAME    CDB  OPEN_MODE             LOG_MODE
   --------- --- -------------------- ------------
   RDSCDB    YES READ WRITE           ARCHIVELOG
   ```

1. **如果您有多租戶 CDB**，請列出所有 PDBs及其狀態：  
**Example**  

   ```
   SQL> SELECT con_id, name, open_mode, restricted FROM v$pdbs;
   ```

   預期的輸出 (1 個 PDB 名為 ORCLDB 的範例）：  
**Example**  

   ```
   CON_ID     NAME                           OPEN_MODE  RES
   ---------- ------------------------------ ---------- ---
   2          PDB$SEED                       READ ONLY  NO
   3          ORCLDB                         READ WRITE NO
   ```

1. 檢查總資料庫大小：  
**Example 對於非 CDB：**  

   ```
   SQL> SELECT SUM(bytes)/1024/1024/1024 AS total_size_gb FROM dba_data_files;
   ```  
**Example 對於多租戶：**  

   ```
   -- Total CDB size (all containers)
   SQL> SELECT SUM(bytes)/1024/1024/1024 AS total_size_gb FROM cdb_data_files;
   -- Size per PDB
   SQL> SELECT p.name AS pdb_name,
         ROUND(SUM(d.bytes)/1024/1024/1024, 2) AS size_gb
   FROM v$pdbs p
   JOIN cdb_data_files d ON p.con_id = d.con_id
   GROUP BY p.name, p.con_id
   ORDER BY p.con_id;
   ```

## 選項 1：使用 RMAN Active Duplication 進行實體遷移
<a name="RDS-Custom-for-Oracle-end-of-support-option-1"></a>

**Topics**
+ [何時使用 RMAN 作用中重複](#RDS-Custom-for-Oracle-end-of-support-option-1-when-to-use)
+ [RMAN 作用中重複概觀](#RDS-Custom-for-Oracle-end-of-support-option-1-overview)
+ [RMAN 作用中複製的遷移工作流程](#RDS-Custom-for-Oracle-end-of-support-option-1-migration-workflow)
+ [步驟 1：暫停 Amazon RDS Custom 自動化](#RDS-Custom-for-Oracle-end-of-support-option-1-step-1)
+ [步驟 2：建立密碼和參數檔案](#RDS-Custom-for-Oracle-end-of-support-option-1-step-2)
+ [步驟 3：將檔案傳輸至 EC2](#RDS-Custom-for-Oracle-end-of-support-option-1-step-3)
+ [步驟 4：在 EC2 上編輯參數檔案](#RDS-Custom-for-Oracle-end-of-support-option-1-step-4)
+ [步驟 5：設定 TNS 和接聽程式](#RDS-Custom-for-Oracle-end-of-support-option-1-step-5)
+ [步驟 6：在 EC2 `NOMOUNT` 的 中啟動資料庫](#RDS-Custom-for-Oracle-end-of-support-option-1-step-6)
+ [步驟 7：執行 RMAN 作用中重複](#RDS-Custom-for-Oracle-end-of-support-option-1-step-7)
+ [步驟 8：開啟 PDBs（僅限多租戶）](#RDS-Custom-for-Oracle-end-of-support-option-1-step-8)
+ [步驟 9：移除 RDS Custom 物件](#RDS-Custom-for-Oracle-end-of-support-option-1-step-9)
+ [步驟 10：設定自動啟動](#RDS-Custom-for-Oracle-end-of-support-option-1-step-10)
+ [步驟 11：最終驗證](#RDS-Custom-for-Oracle-end-of-support-option-1-step-11)

本節提供使用 RMAN 作用中複製，將 Oracle 資料庫從 RDS Custom for Oracle 遷移至 EC2 的詳細步驟。此方法會從執行中的即時資料庫中複製，在遷移過程中保持來源上線並可存取。

### 何時使用 RMAN 作用中重複
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-when-to-use"></a>

在下列情況下，選擇 RMAN 作用中重複：
+ 您想要讓來源資料庫保持連線，並在遷移期間存取
+ 您可以為最終應用程式重新導向提供短暫的切換時段
+ 您想要具有較少移動組件的直接遷移程序
+ 您的資料庫大小和網路頻寬允許合理的重複時間
+ 在切換之前，您不需要持續同步
+ 您正在遷移生產、開發或測試資料庫

### RMAN 作用中重複概觀
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-overview"></a>

RMAN 作用中複製不需要備份來源資料庫或使來源資料庫離線。它透過網路複製資料庫檔案，將即時執行的來源資料庫複製到目的地，同時來源保持線上狀態並可供應用程式存取。

**主要優點：**
+ **來源保持連線**：應用程式可以在重複期間繼續存取來源資料庫
+ **不需要備份**：不需要中繼備份儲存
+ **直接網路傳輸**：資料庫檔案直接從來源複製到目標
+ **自動一致性**：RMAN 確保重複的資料庫一致
+ **單一操作**：對於多租戶， 會在單一操作中複製整個 CDB，包括所有 PDBs 

複製程序會在目標上建立來源資料庫的確切複本，包括所有資料檔案、控制檔案和重做日誌。來源資料庫會在整個重複過程中繼續為應用程式請求提供服務。結束時只需要短暫的切換時段，將應用程式從來源重新導向至目標。

**典型時間軸**

1. **複製階段 **（來源保持連線）：30 分鐘至數小時，視資料庫大小而定

1. **驗證階段** （來源保持線上狀態）：視需要花費數小時至數天

1. **切換階段** （短暫停機時間）：將應用程式重新導向至 EC2 的分鐘數

### RMAN 作用中複製的遷移工作流程
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-migration-workflow"></a>

**RDS Custom 資料庫執行個體 （來源） 步驟：**

1. 暫停 Amazon RDS Custom 自動化

1. 驗證資料庫架構 （非 CDB 或具有 PDBs)

1. 從來源資料庫建立密碼檔案和參數檔案

1. 將密碼檔案和參數檔案複製到目標 EC2 執行個體

1. 驗證來源資料庫是否以封存日誌模式執行

1. 在 RDS Custom 資料庫伺服器上設定 tnsnames.ora

**EC2 資料庫執行個體 （目標） 步驟：**

1. 編輯 EC2 的參數檔案 （架構特定）

1. 在 EC2 上設定 tnsnames.ora

1. 設定 EC2 執行個體的環境

1. 在 EC2 上設定 Oracle 接聽程式

1. 在處於 NOMOUNT 狀態的 EC2 上啟動資料庫

**RMAN 重複步驟：**

1. 執行 RMAN 作用中重複

1. 開啟資料庫 （以及多租戶PDBs)

1. 設定 PDB 自動開啟 （僅限多租戶）

1. 移除 RDS Custom 特定使用者和物件

1. 建立 SPFILE 並設定自動啟動

1. 在來源上繼續 Amazon RDS Custom 自動化 （如果保持作用中狀態）

### 步驟 1：暫停 Amazon RDS Custom 自動化
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-1"></a>

在繼續進行遷移步驟之前，請先暫停 RDS Custom 執行個體上的自動化模式，以確保自動化不會干擾 RMAN 活動。--resume-full-automation-mode-minute 參數 （在此範例中為 240 分鐘 = 4 小時） 應根據您的資料庫大小和預期的重複時間進行調整。

**重要**：暫停自動化不會影響資料庫可用性。在重複程序期間，資料庫會保持線上狀態，可供應用程式存取。

**Example**  

```
aws rds modify-db-instance \
--db-instance-identifier my-custom-instance \
--automation-mode all-paused \
--resume-full-automation-mode-minute 240 \
--region us-east-1 
--query 'DBInstances[0].AutomationMode'
```

驗證自動化狀態：

**Example**  

```
aws ds describe-db-instances \
--db-instance-identifier my-custom-instance \
--region us-east-1 \
--query 'DBInstances[0].AutomationMode'
```

預期輸出："`all-paused`"

### 步驟 2：建立密碼和參數檔案
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-2"></a>

使用 建立密碼檔案`orapwd`。從 AWS Secrets Manager 擷取 SYS 密碼 （在 RDS Custom 執行個體建立期間存放）。

**Example**  

```
# Non-CDB
$ORACLE_HOME/bin/orapwd file=/rdsdbdata/config/orapwORCL password={{<SYS_PASSWORD>}} entries=10
# Multitenant
$ORACLE_HOME/bin/orapwd file=/rdsdbdata/config/orapwRDSCDB password={{<SYS_PASSWORD>}} entries=10
```

從來源資料庫建立參數檔案：

**Example**  

```
sqlplus / as sysdba
SQL> CREATE PFILE='/tmp/initORCL.ora' FROM SPFILE; -- Non-CDB
SQL> CREATE PFILE='/tmp/initRDSCDB.ora' FROM SPFILE; -- Multitenant
```

產生的參數檔案將包含 RDS Custom 特定的路徑和參數。對於多租戶，關鍵參數包括：
+ `enable_pluggable_database`=`TRUE` （對多租戶至關重要）
+ `noncdb_compatible`=`TRUE` （用於回溯相容性）
+ `CDB$ROOT`、 `PDB$SEED`和所有 PDBs 的資料檔案路徑
+ `db_create_file_dest` 適用於 OMF `db_create_online_log_dest_1`的 和

### 步驟 3：將檔案傳輸至 EC2
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-3"></a>

選擇您偏好的檔案傳輸方法。本指南使用 Amazon S3 做為範例。

 **使用 Amazon S3：**

#### 使用 Amazon S3：
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-3-ec2"></a>

**Example 對於非 CDB：**  

```
# Copy files to Amazon S3 from the RDS Custom instance
aws s3 cp /tmp/initORCL.ora s3://{{<YOUR_BUCKET>}}/
aws s3 cp /rdsdbdata/config/orapwORCL s3://{{<YOUR_BUCKET>}}/
# On EC2, download files
aws s3 cp s3://{{<YOUR_BUCKET>}}/initORCL.ora $ORACLE_HOME/dbs/
aws s3 cp s3://{{<YOUR_BUCKET>}}/orapwORCL $ORACLE_HOME/dbs/
```

**Example 對於多租戶**  

```
# Copy files to Amazon S3 from the RDS Custom instance
aws s3 cp /tmp/initRDSCDB.ora s3://{{<YOUR_BUCKET>}}/
aws s3 cp /rdsdbdata/config/orapwRDSCDB s3://{{<YOUR_BUCKET>}}/
# On EC2, download and rename files to use ORCL naming
aws s3 cp s3://{{<YOUR_BUCKET>}}/initRDSCDB.ora $ORACLE_HOME/dbs/initORCL.ora
aws s3 cp s3://{{<YOUR_BUCKET>}}/orapwRDSCDB $ORACLE_HOME/dbs/orapwORCL
```

驗證 EC2 上的檔案：

**Example**  

```
ls -l $ORACLE_HOME/dbs/initORCL.ora
ls -l $ORACLE_HOME/dbs/orapwORCL
```

### 步驟 4：在 EC2 上編輯參數檔案
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-4"></a>

參數檔案需要仔細編輯，以確保遷移成功。這是遷移程序中最關鍵的步驟之一。

在 EC2 執行個體`$ORACLE_HOME/dbs/initORCL.ora`上編輯 ，並進行下列重要變更：

1. **更新資料庫名稱**：針對多租戶，請將所有出現的 RDSCDB 變更為 ORCL

1. **將 RDS Custom 路徑轉換為 EC2 路徑**：將 /rdsdbdata/ 取代為 /u01/app/oracle/

1. 

**移除 RDS Custom 特定參數**
   + `dg_broker_config_file1` 和 `dg_broker_config_file2`（如果有 - 表示存在複本）
   + `standby_file_management` （如果有）
   + `spfile` （稍後我們將建立新的 SPFILE)
   + 指向待命目的地的任何`log_archive_dest`參數 （僅保留`log_archive_dest_1`供本機封存）

1. **新增檔案名稱轉換參數** （請參閱下文）

1. 根據您的 EC2 執行個體大小**調整記憶體參數** （選用但建議）

**了解檔案名稱轉換參數：**

`DB_FILE_NAME_CONVERT` 和 `LOG_FILE_NAME_CONVERT` 參數對於 RMAN 複製至關重要。它們告訴 RMAN 如何在重複過程中將來源檔案路徑映射至目標檔案路徑。如果沒有這些參數，RMAN 將嘗試在與來源相同的路徑中建立檔案，這會在 EC2 上失敗。

**關鍵考量事項：**
+ 每個參數都接受字串對：來源路徑後面接著目標路徑
+ 可以在單一參數中指定多個配對
+ 對於多租戶，您必須映射 `CDB$ROOT`、 `PDB$SEED`和所有 PDBs路徑
+ 配對的順序很重要 - RMAN 依指定的順序處理它們
+ 路徑區分大小寫，且必須完全相符

**路徑映射：**


**非 CDB：**  

|  **RDS 自訂路徑**  |  **EC2 路徑**  |  **Description**  | 
| --- | --- | --- | 
| /rdsdbbin | /u01/app/oracle | Oracle 基礎 | 
| /rdsdbdata/db/ORCL\_A/datafile/ | /u01/app/oracle/oradata/ORCL/datafile/ | 資料檔案 | 
| /rdsdbdata/db/ORCL\_A/controlfile/ | /u01/app/oracle/oradata/ORCL/controlfile/ | 控制檔案 | 
| /rdsdbdata/db/ORCL\_A/onlinelog/ | /u01/app/oracle/oradata/ORCL/onlinelog/ | 線上重做日誌 | 
| /rdsdbdata/db/ORCL\_A/arch/ | /u01/app/oracle/oradata/ORCL/arch/ | 封存日誌 | 
| /rdsdbdata/admin/ORCL/adump | /u01/app/oracle/admin/ORCL/adump | 稽核傾印 | 
| /rdsdbdata/log | /u01/app/oracle | 診斷目的地 | 


**多租用戶**  

|  **RDS 自訂路徑**  |  **EC2 路徑**  |  **Description**  | 
| --- | --- | --- | 
| /rdsdbbin | /u01/app/oracle | Oracle 基礎 | 
| /rdsdbdata/db/cdb/RDSCDB/datafile/ | /u01/app/oracle/oradata/ORCL/cdb/datafile/ | CDB 根資料檔案 | 
| /rdsdbdata/db/cdb/pdbseed/ | /u01/app/oracle/oradata/ORCL/pdbseed/datafile/ | PDB$SEED 資料檔案 | 
| /rdsdbdata/db/pdb/RDSCDB\_A/ | /u01/app/oracle/oradata/ORCL/pdb/datafile/ | PDB 資料檔案 (OMF 搭配 GUID) | 
| /rdsdbdata/db/cdb/RDSCDB\_A/controlfile/ | /u01/app/oracle/oradata/ORCL/controlfile/ | 控制檔案 | 
| /rdsdbdata/db/cdb/RDSCDB\_A/onlinelog/ | /u01/app/oracle/oradata/ORCL/onlinelog/ | 線上重做日誌 | 
| /rdsdbdata/db/cdb/RDSCDB\_A/arch/redolog | /u01/app/oracle/oradata/ORCL/arch/ | 封存日誌 | 
| /rdsdbdata/admin/RDSCDB/adump | /u01/app/oracle/admin/ORCL/adump | 稽核傾印 | 
| /rdsdbdata/log | /u01/app/oracle | 診斷目的地 | 

**新增轉換參數：**

**Example 非 CDB：**  

```
*.DB_FILE_NAME_CONVERT='/rdsdbdata/db/ORCL_A/datafile/','/u01/app/oracle/oradata/ORCL/datafile/'
*.LOG_FILE_NAME_CONVERT='/rdsdbdata/db/ORCL_A/onlinelog/','/u01/app/oracle/oradata/ORCL/onlinelog/'
```

**Example **多租戶** （必須包含 CDB 根`PDB$SEED`、 和所有 PDB 路徑的映射）：**  

```
*.DB_FILE_NAME_CONVERT='/rdsdbdata/db/cdb/RDSCDB/datafile/','/u01/app/oracle/oradata/ORCL/cdb/datafile/','/rdsdbdata/db/cdb/pdbseed/','/u01/app/oracle/oradata/ORCL/pdbseed/datafile/','/rdsdbdata/db/pdb/RDSCDB_A/','/u01/app/oracle/oradata/ORCL/pdb/datafile/'
 *.LOG_FILE_NAME_CONVERT='/rdsdbdata/db/cdb/RDSCDB_A/onlinelog/','/u01/app/oracle/oradata/ORCL/onlinelog/'
```

**重要**：對於多租戶，請確保參數檔案中存在 `enable_pluggable_database`=`TRUE`。RDS Custom 會將 OMF 用於具有 GUID 型子目錄的 PDB 資料檔案 - 路徑映射會自動處理。

 **完成範例參數檔案：**

**Example 範例非 CDB 參數檔案 (`initORCL.ora`)：**  

```
ORCL.__data_transfer_cache_size=0
ORCL.__db_cache_size=6039797760
ORCL.__inmemory_ext_roarea=0
ORCL.__inmemory_ext_rwarea=0
ORCL.__java_pool_size=0
ORCL.__large_pool_size=33554432
ORCL.__oracle_base='/u01/app/oracle'
ORCL.__pga_aggregate_target=4966055936
ORCL.__sga_target=7449083904
ORCL.__shared_io_pool_size=134217728
ORCL.__shared_pool_size=1207959552
ORCL.__streams_pool_size=0
ORCL.__unified_pga_pool_size=0
*.archive_lag_target=300
*.audit_file_dest='/u01/app/oracle/admin/ORCL/adump'
*.compatible='19.0.0'
*.control_files='/u01/app/oracle/oradata/ORCL/controlfile/control-01.ctl'
*.db_block_checking='MEDIUM'
*.db_create_file_dest='/u01/app/oracle/oradata/ORCL'
*.db_name='ORCL'
*.db_recovery_file_dest_size=1073741824
*.db_unique_name='ORCL'
*.dbfips_140=FALSE
*.diagnostic_dest='/u01/app/oracle'
*.filesystemio_options='setall'
*.heat_map='OFF'
*.job_queue_processes=50
*.local_listener='(address=(protocol=tcp)(host=)(port=1521))'
*.log_archive_dest_1='location="/u01/app/oracle/oradata/ORCL/arch", valid_for=(ALL_LOGFILES,ALL_ROLES)'
*.log_archive_format='-%s-%t-%r.arc'
*.max_string_size='STANDARD'
*.memory_max_target=12385852416
*.memory_target=12385852416
*.open_cursors=300
*.pga_aggregate_target=0
*.processes=1673
*.recyclebin='OFF'
*.sga_target=0
*.undo_tablespace='UNDO_T1'
*.use_large_pages='FALSE'
*.DB_FILE_NAME_CONVERT='/rdsdbdata/db/ORCL_A/datafile/','/u01/app/oracle/oradata/ORCL/datafile/'
*.LOG_FILE_NAME_CONVERT='/rdsdbdata/db/ORCL_A/onlinelog/','/u01/app/oracle/oradata/ORCL/onlinelog/'
```

**Example 多租戶參數檔案範例 (`initORCL.ora`)：**  

```
ORCL.__data_transfer_cache_size=0
ORCL.__db_cache_size=6006243328
ORCL.__inmemory_ext_roarea=0
ORCL.__inmemory_ext_rwarea=0
ORCL.__java_pool_size=0
ORCL.__large_pool_size=33554432
ORCL.__oracle_base='/u01/app/oracle'
ORCL.__pga_aggregate_target=4966055936
ORCL.__sga_target=7415529472
ORCL.__shared_io_pool_size=134217728
ORCL.__shared_pool_size=1207959552
ORCL.__streams_pool_size=0
ORCL.__unified_pga_pool_size=0
*.archive_lag_target=300
*.audit_file_dest='/u01/app/oracle/admin/ORCL/adump'
*.compatible='19.0.0'
*.control_files='/u01/app/oracle/oradata/ORCL/controlfile/control-01.ctl'
*.db_block_checking='MEDIUM'
*.db_create_file_dest='/u01/app/oracle/oradata/ORCL/pdb/datafile'
*.db_create_online_log_dest_1='/u01/app/oracle/oradata/ORCL'
*.db_name='ORCL'
*.db_recovery_file_dest_size=1073741824
*.db_unique_name='ORCL'
*.dbfips_140=FALSE
*.diagnostic_dest='/u01/app/oracle'
*.enable_pluggable_database=TRUE
*.filesystemio_options='setall'
*.heat_map='OFF'
*.job_queue_processes=50
*.local_listener='(address=(protocol=tcp)(host=)(port=1521))'
*.log_archive_dest_1='location="/u01/app/oracle/oradata/ORCL/arch", valid_for=(ALL_LOGFILES,ALL_ROLES)'
*.log_archive_format='-%s-%t-%r.arc'
*.max_string_size='STANDARD'
*.memory_max_target=12361688064
*.memory_target=12361688064
*.noncdb_compatible=TRUE
*.open_cursors=300
*.pga_aggregate_target=0
*.processes=1670
*.recyclebin='OFF'
*.sga_target=0
*.undo_tablespace='UNDO_T1'
*.use_large_pages='FALSE'
*.DB_FILE_NAME_CONVERT='/rdsdbdata/db/cdb/RDSCDB/datafile/','/u01/app/oracle/oradata/ORCL/cdb/datafile/','/rdsdbdata/db/cdb/pdbseed/','/u01/app/oracle/oradata/ORCL/pdbseed/datafile/','/rdsdbdata/db/pdb/RDSCDB_A/','/u01/app/oracle/oradata/ORCL/pdb/datafile/'
*.LOG_FILE_NAME_CONVERT='/rdsdbdata/db/cdb/RDSCDB_A/onlinelog/','/u01/app/oracle/oradata/ORCL/onlinelog/'
```

**金鑰參數說明：**
+ `enable_pluggable_database=TRUE`：多租戶 CDB 的必要項目。此參數會啟用可插入的資料庫功能。
+ `noncdb_compatible=TRUE`：由 RDS Custom 設定以獲得回溯相容性。您可以根據您的需求保留或移除 。
+ `db_create_file_dest`：指定 Oracle 受管檔案 (OMF) 的預設位置。對於多租戶，這會指向 PDB 資料檔案目錄。
+ `db_create_online_log_dest_1`：指定使用 OMF 時線上重做日誌的位置。
+ `DB_FILE_NAME_CONVERT`：對 RMAN 重複至關重要。將來源資料檔案路徑映射至目標路徑。
+ `LOG_FILE_NAME_CONVERT`：將來源重做日誌路徑映射至目標路徑。
+ `memory_target` 和 `memory_max_target`：根據您的 EC2 執行個體記憶體調整這些項目。顯示的值為範例。
+ `processes`：可連線至 Oracle 的作業系統程序數目上限。根據您的工作負載調整 。

**記憶體大小調整準則：**

調整 EC2 執行個體的記憶體參數時：


|  **EC2 執行個體記憶體**  |  **建議的 memory\_target**  |  **建議的 memory\_max\_target**  | 
| --- | --- | --- | 
| 16 GB | 12 GB (12884901888 位元組） | 14 GB (15032385536 位元組） | 
| 32 GB | 24 GB (25769803776 位元組） | 28 GB (30064771072 位元組） | 
| 64 GB | 48 GB (51539607552 位元組） | 56 GB (60129542144 位元組） | 
| 128 GB | 96 GB (103079215104 位元組） | 112 GB (120259084288 位元組） | 

為作業系統和其他程序保留大約 20-25% 的系統記憶體。

### 步驟 5：設定 TNS 和接聽程式
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-5"></a>

在這兩個執行個體上，將 TNS 項目新增至 `tnsnames.ora`：

**Example 非 CDB：**  

```
DB_SOURCE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = {{<RDS_CUSTOM_IP>}})(PORT = 1521)) (CONNECT_DATA = (SID = ORCL)))
DB_TARGET = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = {{<EC2_IP>}})(PORT = 1521)) (CONNECT_DATA = (SID = ORCL)))
```

**Example 多租戶：**  

```
DB_SOURCE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = {{<RDS_CUSTOM_IP>}})(PORT = 1521)) (CONNECT_DATA = (SID = RDSCDB)))
DB_TARGET = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = {{<EC2_IP>}})(PORT = 1521)) (CONNECT_DATA = (SID = ORCL)))
```

**Example 在 EC2 上設定接聽程式 (`$ORACLE_HOME/network/admin/listener.ora`)：**  

```
LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = {{<EC2_IP>}})(PORT = 1521)))
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCL) (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1) (SID_NAME = ORCL)))
```

**Example 啟動接聽程式：**  

```
lsnrctl start
```

**注意**  
對於 RMAN 作用中重複，TNS 項目會使用 SID （非 SERVICE\_NAME) 連線至資料庫執行個體。對於多租戶，這會連接到 CDB，而 RMAN 會自動複製所有 PDBs。

### 步驟 6：在 EC2 `NOMOUNT` 的 中啟動資料庫
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-6"></a>

**Example**  

```
export ORACLE_SID=ORCL
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

sqlplus / as sysdba

SQL> STARTUP NOMOUNT PFILE='$ORACLE_HOME/dbs/initORCL.ora';
```

**Example 驗證參數：**  

```
SQL> SHOW PARAMETER db_name
SQL> SHOW PARAMETER control_files
SQL> SHOW PARAMETER enable_pluggable_database -- For multitenant
```

### 步驟 7：執行 RMAN 作用中重複
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-7"></a>

RMAN 作用中重複會將資料庫從即時執行的來源複製到目標。在整個過程中，來源資料庫會保持線上狀態，可供應用程式存取。

將 RMAN 連線至來源和目標執行個體：

**Example**  

```
rman target sys/{{<password>}}@DB_SOURCE auxiliary sys/{{<password>}}@DB_TARGET
```

**Example 非 CDB 的預期輸出：**  

```
Recovery Manager: Release 19.0.0.0.0 - Production
connected to target database: ORCL (DBID=4089929259)
connected to auxiliary database: ORCL (not mounted)
```

**Example 多租戶的預期輸出：**  

```
Recovery Manager: Release 19.0.0.0.0 - Production
connected to target database: RDSCDB (DBID=4089929259)
connected to auxiliary database: ORCL (not mounted)
```

**Example 執行作用中的重複命令：**  

```
RMAN> DUPLICATE DATABASE TO 'ORCL' FROM ACTIVE DATABASE NOFILENAMECHECK;
```

**注意**  
**來源保持線上**狀態：來源資料庫會在重複期間繼續為應用程式請求提供服務
**對於非 CDB**：這會複製整個資料庫，同時保持線上狀態
**對於多租戶**：這會在來源保持線上時，在單一操作中複製整個 CDB`CDB$ROOT`，包括 `PDB$SEED`、 和所有 PDBs 
**NOFILENAMECHECK**：允許 RMAN 繼續進行，即使來源和目標之間的檔案名稱不同
**持續時間**：取決於資料庫大小和網路頻寬。對於 100GB 資料庫，預期 30-60 分鐘
**網路影響：**重複期間高網路頻寬使用量，但來源資料庫仍可存取

**RMAN 作用中重複程序包含數個階段：**

1. 連線至來源和目標資料庫

1. `SPFILE` 從目標上的記憶體建立

1. 將控制檔案還原至目標

1. 掛載目標資料庫

1. 透過網路將所有資料檔案從來源複製到目標 （來源保持線上狀態）

1. 復原目標資料庫

1. 使用 開啟目標資料庫 `RESETLOGS`

**在重複期間，來源資料庫：**
+ 保持 `READ WRITE` 模式
+ 繼續接受連線
+ 正常處理交易
+ 正常產生重做日誌
+ 應用程式可完全存取

**Example 監控另一個工作階段的進度：**  

```
SQL> SELECT sid, serial#, sofar, totalwork, ROUND(sofar/totalwork*100,2) pct_complete
FROM v$session_longops WHERE totalwork > 0 AND sofar <> totalwork;
```

 **RMAN 複製期間的詳細監控和故障診斷：**

當 RMAN 重複執行時，您可以使用數種方法來監控其進度：

1. **監控 RMAN 輸出：**

   RMAN 工作階段會顯示詳細的進度資訊，包括：
   + 頻道配置
   + 資料檔案複製進度
   + 預估完成時間
   + 處理的位元組數

   ```
   channel ORA_AUX_DISK_1: starting datafile copy
   input datafile file number=00001 name=/rdsdbdata/db/ORCL_A/datafile/system01.dbf
   output file name=/u01/app/oracle/oradata/ORCL/datafile/system01.dbf tag=TAG20260303T120000
   channel ORA_AUX_DISK_1: datafile copy complete, elapsed time: 00:05:23
   channel ORA_AUX_DISK_1: starting datafile copy
   input datafile file number=00003 name=/rdsdbdata/db/ORCL_A/datafile/sysaux01.dbf
   output file name=/u01/app/oracle/oradata/ORCL/datafile/sysaux01.dbf tag=TAG20260303T120000
   ```  
**Example 輸出範例：**  

   ```
   channel ORA_AUX_DISK_1: starting datafile copy
   input datafile file number=00001 name=/rdsdbdata/db/ORCL_A/datafile/system01.dbf
   output file name=/u01/app/oracle/oradata/ORCL/datafile/system01.dbf tag=TAG20260303T120000
   channel ORA_AUX_DISK_1: datafile copy complete, elapsed time: 00:05:23
   channel ORA_AUX_DISK_1: starting datafile copy
   input datafile file number=00003 name=/rdsdbdata/db/ORCL_A/datafile/sysaux01.dbf
   output file name=/u01/app/oracle/oradata/ORCL/datafile/sysaux01.dbf tag=TAG20260303T120000
   ```

1.  **監控長時間執行的操作：**  
**Example 在目標 EC2 執行個體上的個別 SQL\*Plus 工作階段中：**  

   ```
   SQL> SELECT sid, serial#, opname, sofar, totalwork,
          ROUND(sofar/totalwork*100,2) pct_complete,
          time_remaining, elapsed_seconds
   FROM v$session_longops
   WHERE totalwork > 0 AND sofar <> totalwork
   ORDER BY start_time;
   ```

**此查詢會顯示：**
   + `opname`：操作名稱 （例如 "RMAN： full datafile restore")
   + `sofar`：到目前為止處理的區塊
   + `totalwork`：要處理的區塊總數
   + `pct_complete`：完成百分比
   + `time_remaining`：剩餘預估秒數
   + `elapsed_seconds`：到目前為止經過的時間

1. **監控 RMAN 頻道：**  
**Example**  

   ```
   SQL> SELECT sid, serial#, context, sofar, totalwork,
          ROUND(sofar/totalwork*100,2) pct_complete
          FROM v$session_longops
   WHERE opname LIKE 'RMAN%'
          AND totalwork > 0
          AND sofar <> totalwork;
   ```

1. **檢查提醒日誌：**  
**Example 在目標 EC2 執行個體上，監控警示日誌是否有任何錯誤或警告：**  

   ```
   tail -f $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log
   ```

**RMAN 複製期間的常見問題：**
   + **網路逾時**

     ```
     RMAN-03009: failure of duplicate command on ORA_AUX_DISK_1 channel
     ORA-03135: connection lost contact
     ```

     **解決方案**：在兩個執行個體`sqlnet.ora`上增加 中的網路逾時值：

     ```
     SQLNET.RECV_TIMEOUT=600
     SQLNET.SEND_TIMEOUT=600
     ```
   + **目標上的空間不足**

     ```
     RMAN-03009: failure of duplicate command
     ORA-19504: failed to create file "/u01/app/oracle/oradata/ORCL/datafile/users01.dbf"
     ORA-27040: file create error, unable to create file
     Linux-x86_64 Error: 28: No space left on device
     ```

     **解決方案**：檢查可用空間並新增更多 EBS 磁碟區容量：

     ```
     df -h /u01/app/oracle/oradata
     ```
   + **參數檔案錯誤**

     ```
     RMAN-05021: this configuration cannot be used
     RMAN-06004: ORACLE error from auxiliary database: ORA-01261: Parameter db_create_file_dest destination string cannot be translated
     ```

     **解決方案**：確認參數檔案中的所有目錄都存在並具有適當的許可。
   + **密碼檔案不相符**

     ```
     RMAN-00571: ===========================================================
     RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
     RMAN-00571: ===========================================================
     RMAN-03002: failure of duplicate command at 03/03/2026 12:00:00
     RMAN-06136: ORACLE error from auxiliary database: ORA-01017: invalid username/password; logon denied
     ```

     **解決方案**：確保目標上的密碼檔案符合來源並具有正確的名稱 (`orapwORCL`)。

### 步驟 8：開啟 PDBs（僅限多租戶）
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-8"></a>

RMAN 複製完成後，EC2 上的 CDB 會在 `READ WRITE` 模式下開啟，但所有 PDBs都處於 `MOUNTED` 狀態。這是預期的行為 - 您必須手動開啟。

檢查目前的 PDB 狀態：

```
SQL> SELECT con_id, name, open_mode FROM v$pdbs;
```

預期的輸出 （一個 PDB 名為 的範例`ORCLDB`)：

```
CON_ID     NAME                           OPEN_MODE
---------- ------------------------------ ----------
2          PDB$SEED                       READ ONLY
3          ORCLDB                         MOUNTED
```

開啟所有 PDBs：

```
SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
Pluggable database altered.
```

確認所有 PDBs 現在都以 `READ WRITE` 模式開啟：

```
SQL> SELECT con_id, name, open_mode, restricted FROM v$pdbs;
```

預期的輸出結果：

```
CON_ID     NAME                           OPEN_MODE  RES
---------- ------------------------------ ---------- ---
2          PDB$SEED                       READ ONLY  NO
3          ORCLDB                         READ WRITE NO
```

使用儲存狀態方法設定啟動時自動開啟 （建議使用 Oracle 19c)：

```
SQL> ALTER PLUGGABLE DATABASE ALL SAVE STATE;
Pluggable database altered.
```

這可讓 Oracle 記住 PDBs的目前開啟狀態，並在 CDB 啟動時將其還原。

驗證儲存的狀態：

```
SQL> SELECT con_name, instance_name, state FROM dba_pdb_saved_states;
```

確認 PDB 服務已向接聽程式註冊：

```
lsnrctl services
```

預期的輸出應會顯示 CDB 和每個 PDB 的服務。如果服務未顯示：

```
SQL> ALTER SYSTEM REGISTER;
```

然後再次使用 檢查`lsnrctl services`。

### 步驟 9：移除 RDS Custom 物件
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-9"></a>

由於這是 EC2 上的自我管理資料庫，因此您應該移除 RDS Custom 特定的使用者和物件。清理程序在非 CDB 和多租戶架構之間有所不同。

**重要**  
在捨棄 RDS 特定的使用者和資料表空間之前，請確認這些結構描述下沒有應用程式物件：

```
SQL> SELECT owner, object_type, COUNT(*)
FROM dba_objects
WHERE owner IN ('RDSADMIN', 'RDS_DATAGUARD')
  AND object_name NOT LIKE 'RDS%'
  AND object_name NOT LIKE 'SYS_%'
GROUP BY owner, object_type;
```

如果找到任何應用程式物件，請先將其遷移至適當的應用程式結構描述，再繼續。

**Example 非 CDB：**  

```
SQL> DROP USER RDSADMIN CASCADE;
SQL> DROP USER RDS_DATAGUARD CASCADE;
SQL> DROP DIRECTORY OPATCH_INST_DIR;
SQL> DROP DIRECTORY OPATCH_LOG_DIR;
SQL> DROP DIRECTORY OPATCH_SCRIPT_DIR;
SQL> DROP TABLESPACE RDSADMIN INCLUDING CONTENTS AND DATAFILES;

-- Verify removal
SQL> SELECT username FROM dba_users WHERE username LIKE '%RDS%';
```

預期的輸出： `no rows selected`

**多租戶：**

在多租戶環境中，RDS Custom 會在 `CDB$ROOT` 中建立可在所有 PDBs 中看見的常見使用者。您必須從 清除 `CDB$ROOT`。

```
-- Connect to CDB$ROOT
SQL> SHOW CON_NAME;
-- Check for RDS-specific common users (including C## prefixed users)
SQL> SELECT username, common, con_id FROM cdb_users
WHERE username LIKE '%RDS%' OR username LIKE 'C##RDS%'
ORDER BY username;

-- Drop non-common users
SQL> DROP USER RDSADMIN CASCADE;
SQL> DROP USER RDS_DATAGUARD CASCADE;

-- If any C## common users exist
-- SQL> DROP USER C##RDSADMIN CASCADE
;
-- Drop directories and tablespace
SQL> DROP DIRECTORY OPATCH_INST_DIR;
SQL> DROP DIRECTORY OPATCH_LOG_DIR;
SQL> DROP DIRECTORY OPATCH_SCRIPT_DIR;
SQL> DROP TABLESPACE RDSADMIN INCLUDING CONTENTS AND DATAFILES;

-- Verify removal from CDB$ROOT
SQL> SELECT username FROM dba_users WHERE username LIKE '%RDS%';

-- Verify removal from each PDB
SQL> ALTER SESSION SET CONTAINER = {{<PDB_NAME>}};
SQL> SELECT username FROM dba_users WHERE username LIKE '%RDS%';
```

所有查詢的預期輸出： `no rows selected`

### 步驟 10：設定自動啟動
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-10"></a>

建立 `SPFILE`：

```
SQL> CREATE SPFILE FROM PFILE='$ORACLE_HOME/dbs/initORCL.ora';
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
```

對於多租戶，請確保 PDBs開啟：

```
SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
```

編輯 `/etc/oratab`：

```
ORCL:/u01/app/oracle/product/19.0.0/dbhome_1:Y
```

### 步驟 11：最終驗證
<a name="RDS-Custom-for-Oracle-end-of-support-option-1-step-11"></a>

**Example 非 CDB：**  

```
SQL> SELECT name, open_mode, log_mode FROM v$database;
SQL> SELECT SUM(bytes)/1024/1024/1024 AS size_gb FROM dba_data_files;
SQL> SELECT COUNT(*) FROM dba_objects WHERE status = 'INVALID';
```

**Example 多租戶：**  

```
SQL> SELECT name, open_mode, log_mode, cdb FROM v$database;
SQL> SELECT con_id, name, open_mode FROM v$pdbs;
SQL> SELECT SUM(bytes)/1024/1024/1024 AS total_size_gb FROM cdb_data_files;
SQL> SELECT con_id, COUNT(*) FROM cdb_objects WHERE status = 'INVALID' GROUP BY con_id;
```

```
Test application connectivity:
# Non-CDB
sqlplus {{<app_user>}}/{{<password>}}@{{<EC2_IP>}}:1521/ORCL

# Multitenant (connect to PDB)
sqlplus {{<app_user>}}/{{<password>}}@{{<EC2_IP>}}:1521/{{<PDB_NAME>}}
```

 **步驟 12：繼續 RDS Custom 自動化** 

```
aws rds modify-db-instance \
--db-instance-identifier my-custom-instance \
--automation-mode full \
--region us-east-1
```

 

## 選項 2：使用 Oracle Data Guard 進行實體遷移
<a name="RDS-Custom-for-Oracle-end-of-support-option-2"></a>



本節提供使用 Oracle Data Guard 將 Oracle 資料庫從 RDS Custom for Oracle 遷移至 EC2 的詳細步驟。此方法適用於需要最短停機時間的遷移。

### 何時使用 Oracle Data Guard
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-when-use-odg"></a>

**在下列情況下選擇 Oracle Data Guard：**
+ 您需要最短的停機時間 （切換需要幾秒到幾分鐘）
+ 您正在遷移生產或關鍵任務資料庫
+ 您需要在切換前持續同步
+ 您想要內建的備用功能
+ 您需要先測試目標資料庫，才能進行遷移

### Oracle Data Guard 概觀
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-odg-overview"></a>

Oracle Data Guard 會透過持續從主要資料庫傳送和套用重做日誌，來維護同步待命資料庫。當您準備好完成遷移時，您可以執行切換，將 EC2 待命提升為主要節點，並將停機時間降到最低 （秒到分鐘）。對於多租戶資料庫，Data Guard 會自動保護整個 CDB，包括所有 PDBs。由任何 PDB 產生的重做會運送到待命，並套用到待命上的對應 PDB。

### Oracle Data Guard 的遷移工作流程
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-odg-workflow"></a>

**RDS Custom 資料庫執行個體 （主要） 步驟：**

1. 暫停 Amazon RDS Custom 自動化

1. 驗證資料庫架構 （非 CDB 或具有 PDBs)

1. 確認主要資料庫正在封存日誌模式下執行，並`FORCE_LOGGING`已啟用

1. 建立密碼檔案

1. 執行主要資料庫的 RMAN 線上備份 （或使用作用中的重複）

1. 從來源資料庫建立參數檔案

1. 將備份集、參數檔案和密碼檔案複製到目標 EC2 執行個體

**EC2 資料庫執行個體 （待命） 步驟：**

1. 將所有檔案從來源複製到 EC2 執行個體

1. 將密碼檔案複製到 EC2 執行個體

1. 編輯 EC2 的參數檔案 （架構特定）

1. 從參數檔案建立伺服器參數檔案

1. 還原待命控制檔案和資料庫

**Data Guard 組態步驟：**

1. 在兩個執行個體上設定 Oracle 接聽程式

1. 在兩個執行個體上設定 tnsnames.ora

1. 在兩個執行個體上啟動 Oracle Data Guard 代理程式 （選用但建議）

1. 啟用 Oracle Data Guard 組態

1. 在 EC2 待命執行個體上設定 fal\_server 和 fal\_client

1. 在兩個執行個體上設定待命重做日誌檔案

1. 復原待命執行個體

1. 執行手動切換

1. 開啟資料庫 （以及多租戶PDBs)

1. 設定 PDB 自動開啟 （僅限多租戶）

1. 移除 RDS Custom 特定使用者和物件

1. 建立 SPFILE 並設定自動啟動

### 步驟 1：暫停 Amazon RDS Custom 自動化
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-1"></a>

在 RDS Custom 執行個體上暫停自動化模式。`--resume-full-automation-mode-minute` 參數應根據您的資料庫大小和預期的 Data Guard 設定時間進行調整。

```
aws rds modify-db-instance \
  --db-instance-identifier my-custom-instance \
  --automation-mode all-paused \
  --resume-full-automation-mode-minute 480 \
  --region us-east-1
```

驗證自動化狀態：

```
aws rds describe-db-instances \
  --db-instance-identifier my-custom-instance \
  --region us-east-1 \
  --query 'DBInstances[0].AutomationMode'
```

預期輸出："`all-paused`"

### 步驟 2：確認封存日誌模式和 `FORCE_LOGGING`
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-2"></a>

Oracle Data Guard 要求主要資料庫處於封存日誌模式，並啟用強制記錄：

```
sqlplus / as sysdba
SQL> SELECT log_mode, force_logging FROM v$database;
```

預期的輸出結果：

```
LOG_MODE     FORCE_LOGGING
------------ -------------
ARCHIVELOG   YES
```

如果未啟用強制記錄，請執行：

```
SQL> ALTER DATABASE FORCE LOGGING;
```

### 步驟 3：建立密碼和參數檔案
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-3"></a>

使用 建立密碼檔案`orapwd`。從 AWS Secrets Manager 擷取 SYS 密碼。

```
# Non-CDB
$ORACLE_HOME/bin/orapwd file=/rdsdbdata/config/orapwORCL password={{<SYS_PASSWORD>}} entries=10

# Multitenant
$ORACLE_HOME/bin/orapwd file=/rdsdbdata/config/orapwRDSCDB password={{<SYS_PASSWORD>}} entries=10
```

從來源資料庫建立參數檔案：

```
sqlplus / as sysdba
SQL> CREATE PFILE='/tmp/initORCL.ora' FROM SPFILE; -- Non-CDB
SQL> CREATE PFILE='/tmp/initRDSCDB.ora' FROM SPFILE; -- Multitenant
```

### 步驟 4：執行 RMAN 備份或使用作用中的重複
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-4"></a>

您有兩種建立待命資料庫的選項：

#### 選項 A：RMAN 線上備份 （建議大多數案例使用）
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-4-a"></a>

建立備份目錄並備份資料庫：

```
mkdir -p /rdsdbdata/backup
rman target /
RMAN> run {
  backup as compressed backupset
  filesperset 2
  format '/rdsdbdata/backup/db_%U'
  database;
  sql 'alter system archive log current';
  backup as compressed backupset
  filesperset 50
  format '/rdsdbdata/backup/arch_%U'
  archivelog all;
}

RMAN> backup current controlfile for standby format '/rdsdbdata/backup/standby.ctl';
```

**注意**  
對於多租戶，資料庫關鍵字會自動備份整個 CDB，包括所有 PDBs。

#### 選項 B：作用中重複 （替代方法）
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-4-b"></a>

略過備份步驟，並使用 RMAN 主動複製直接透過網路建置待命。這樣就不需要備份儲存和檔案傳輸。設定 TNS 和接聽程式後 （請參閱下文），請執行：

```
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER;
```

本指南著重於選項 A （備份型），但選項 B 是有效的替代方案。

### 步驟 5：將檔案傳輸至 EC2
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-5"></a>

選擇您偏好的檔案傳輸方法。本指南使用 Amazon S3 做為範例。

**使用 Amazon S3：**

**Example 對於非 CDB：**  

```
# Copy files to Amazon S3 from the RDS Custom instance
aws s3 cp /rdsdbdata/backup s3://{{<YOUR_BUCKET>}}/ --recursive
aws s3 cp /tmp/initORCL.ora s3://{{<YOUR_BUCKET>}}/
aws s3 cp /rdsdbdata/config/orapwORCL s3://{{<YOUR_BUCKET>}}/

# On EC2, download files
aws s3 cp s3://{{<YOUR_BUCKET>}}/backup /u01/app/oracle/backup/ --recursive
aws s3 cp s3://{{<YOUR_BUCKET>}}/initORCL.ora $ORACLE_HOME/dbs/
aws s3 cp s3://{{<YOUR_BUCKET>}}/orapwORCL $ORACLE_HOME/dbs/
```

**Example 對於多租戶：**  

```
# Copy files to Amazon S3 from the RDS Custom instance
aws s3 cp /rdsdbdata/backup s3://{{<YOUR_BUCKET>}}/ --recursive
aws s3 cp /tmp/initRDSCDB.ora s3://{{<YOUR_BUCKET>}}/
aws s3 cp /rdsdbdata/config/orapwRDSCDB s3://{{<YOUR_BUCKET>}}/

# On EC2, download and rename files to use ORCL naming
aws s3 cp s3://{{<YOUR_BUCKET>}}/backup /u01/app/oracle/backup/ --recursive
aws s3 cp s3://{{<YOUR_BUCKET>}}/initRDSCDB.ora $ORACLE_HOME/dbs/initORCL.ora
aws s3 cp s3://{{<YOUR_BUCKET>}}/orapwRDSCDB $ORACLE_HOME/dbs/orapwORCL
```

### 步驟 6：在 EC2 上編輯參數檔案
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-6"></a>

在 EC2 執行個體`$ORACLE_HOME/dbs/initORCL.ora`上編輯 ，並進行下列重要變更：

1. **更新資料庫名稱**：對於多租戶，`RDSCDB`將 的所有出現變更為 `ORCL`

1. **將 db\_unique\_name**：從 `ORCL_A`（或 `RDSCDB_A`) 變更為 `ORCL_B`

1. **將 RDS Custom 路徑轉換為 EC2 路徑**：`/rdsdbdata/`以 取代 `/u01/app/oracle/`

1. 

****移除 RDS Custom 特定參數****
   + `dg_broker_config_file1` 和 `dg_broker_config_file2`（如果有）
   + `standby_file_management` （如果有）
   + `spfile` （稍後我們會建立新的 `SPFILE` )
   + 指向待命目的地的任何`log_archive_dest`參數

1. 根據您的 EC2 執行個體大小**調整記憶體參數** （選用但建議）

 **路徑映射：**

**非 CDB：**
+ `/rdsdbdata/db/ORCL_A/datafile/` → `/u01/app/oracle/oradata/ORCL/datafile/`
+ `/rdsdbdata/db/ORCL_A/controlfile/` → `/u01/app/oracle/oradata/ORCL/controlfile/`
+ `/rdsdbdata/db/ORCL_A/onlinelog/` → `/u01/app/oracle/oradata/ORCL/onlinelog/`
+ `/rdsdbdata/admin/ORCL/adump` → `/u01/app/oracle/admin/ORCL/adump`

**多租戶：**
+ `/rdsdbdata/db/cdb/RDSCDB/datafile/` → `/u01/app/oracle/oradata/ORCL/cdb/datafile/`
+ `/rdsdbdata/db/cdb/pdbseed/` → `/u01/app/oracle/oradata/ORCL/pdbseed/datafile/`
+ `/rdsdbdata/db/pdb/RDSCDB_A/` → `/u01/app/oracle/oradata/ORCL/pdb/datafile/`
+ `/rdsdbdata/db/cdb/RDSCDB_A/controlfile/` → `/u01/app/oracle/oradata/ORCL/controlfile/`
+ `/rdsdbdata/admin/RDSCDB/adump` → `/u01/app/oracle/admin/ORCL/adump`

**重要**：對於多租戶，請確保參數檔案中存在 `enable_pluggable_database`=`TRUE`。

### 步驟 7：建立`SPFILE`和還原待命資料庫
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-7"></a>

啟動執行個體並建立 SPFILE：

```
sqlplus / as sysdba
SQL> STARTUP NOMOUNT PFILE='$ORACLE_HOME/dbs/initORCL.ora';
SQL> CREATE SPFILE='/u01/app/oracle/admin/ORCL/pfile/spfileORCL.ora' FROM PFILE='$ORACLE_HOME/dbs/initORCL.ora';
SQL> SHUTDOWN IMMEDIATE;
```

建立符號連結：

```
ln -sfn /u01/app/oracle/admin/ORCL/pfile/spfileORCL.ora $ORACLE_HOME/dbs/spfileORCL.ora
```

啟動執行個體並還原：

```
SQL> STARTUP NOMOUNT;
rman target /
```

如果備份檔案與來源位於不同的路徑中，請先為其編製目錄：

```
RMAN> catalog start with '/u01/app/oracle/backup/';
```

還原待命控制檔案和掛載：

```
RMAN> restore standby controlfile from '/u01/app/oracle/backup/standby.ctl';
RMAN> alter database mount;
```

如果資料檔案路徑不同 （例如使用 ASM)，請使用 `SET NEWNAME`：

```
RMAN> run {
set newname for database to '+DATA/%b';
restore database;
switch datafile all;
}
```

否則，只要還原：

```
RMAN> restore database;
```

將資料庫復原至最後一個可用的序列：

```
RMAN> list backup of archivelog all;
RMAN> recover database until sequence <LAST_SEQ + 1>;
```

**注意**  
對於多租戶，RMAN 會自動還原和復原所有 PDBs。您不需要個別還原每個 PDB。

### 步驟 8：設定 TNS 和接聽程式
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-8"></a>

在這兩個執行個體上，將 TNS 項目新增至 `tnsnames.ora`：

**Example 非 CDB：**  

```
ORCL_A = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = {{<RDS_CUSTOM_IP>}})(PORT = 1521)) (CONNECT_DATA = (SID = ORCL)))
ORCL_B = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = {{<EC2_IP>}})(PORT = 1521)) (CONNECT_DATA = (SID = ORCL)))
```

**Example 多租戶：**  

```
RDSCDB_A = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = {{<RDS_CUSTOM_IP>}})(PORT = 1521)) (CONNECT_DATA = (SID = RDSCDB)))
ORCL_B = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = {{<EC2_IP>}})(PORT = 1521)) (CONNECT_DATA = (SID = ORCL)))
```

在兩個執行個體上設定接聽程式。在 RDS Custom 上，附加至 `listener.ora`：

**Example 對於非 CDB：**  

```
SID_LIST_L_ORCL_DG=(SID_LIST = (SID_DESC = (SID_NAME = ORCL)(GLOBAL_DBNAME = ORCL) (ORACLE_HOME = /rdsdbbin/oracle.19.custom.r1.EE.1)))
L_ORCL_DG=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(PORT = 1521)(HOST = {{<RDS_CUSTOM_IP>}})))
```

**Example 對於多租戶：**  

```
SID_LIST_L_RDSCDB_DG=(SID_LIST = (SID_DESC = (SID_NAME = RDSCDB)(GLOBAL_DBNAME = RDSCDB) (ORACLE_HOME = /rdsdbbin/oracle.19.custom.r1.EE-CDB.1)))
L_RDSCDB_DG=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(PORT = 1521)(HOST = {{<RDS_CUSTOM_IP>}})))
```

啟動接聽程式：

```
$ORACLE_HOME/bin/lsnrctl start L_ORCL_DG # or L_RDSCDB_DG for multitenant
```

在 EC2 上，建立 `$ORACLE_HOME/network/admin/listener.ora`：

```
SID_LIST_L_ORCL_DG=(SID_LIST = (SID_DESC = (SID_NAME = ORCL)(GLOBAL_DBNAME = ORCL) (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)))
L_ORCL_DG=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(PORT = 1521)(HOST = {{<EC2_IP>}})))
```

啟動接聽程式：

```
$ORACLE_HOME/bin/lsnrctl start L_ORCL_DG
```

**注意**  
您可以視需要在 RDS Custom 上使用現有的接聽程式，但建立單獨的 Data Guard 接聽程式可提供更好的隔離。

**重要**  
如果 `tnsping`或 `listener` 連線失敗，請檢查 EC2 上的`iptables`規則。許多 EC2 Linux 執行個體都有預設`iptables`規則來封鎖連接埠 1521。新增規則： `sudo iptables -I INPUT 5 -p tcp --dport 1521 -j ACCEPT`

### 步驟 9：啟用 Data Guard 代理程式和組態
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-9"></a>

在這兩個執行個體上，啟用 Data Guard 代理程式：

```
sqlplus / as sysdba
SQL> ALTER SYSTEM SET dg_broker_start=true;
```

在 RDS Custom 主要伺服器上，連線至 Data Guard 代理程式並建立組態：

```
dgmgrl /
```

**Example 對於非 CDB：**  

```
DGMGRL> CREATE CONFIGURATION my_dg_config AS PRIMARY DATABASE IS ORCL_A CONNECT IDENTIFIER IS ORCL_A;
DGMGRL> ADD DATABASE ORCL_B AS CONNECT IDENTIFIER IS ORCL_B MAINTAINED AS PHYSICAL;
```

 

**Example 對於多租戶：**  

```
DGMGRL> CREATE CONFIGURATION my_dg_config AS PRIMARY DATABASE IS RDSCDB_A CONNECT IDENTIFIER IS RDSCDB_A;
DGMGRL> ADD DATABASE ORCL_B AS CONNECT IDENTIFIER IS ORCL_B MAINTAINED AS PHYSICAL;
```

設定靜態連線識別符並啟用：

 

**Example 對於非 CDB：**  

```
DGMGRL> edit database orcl_a set property StaticConnectIdentifier='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(PORT=1521)(HOST=<RDS_CUSTOM_IP>))(CONNECT_DATA=(SID=ORCL)(SERVER=DEDICATED)))';
DGMGRL> edit database orcl_b set property StaticConnectIdentifier='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(PORT=1521)(HOST={{<EC2_IP>}}))(CONNECT_DATA=(SID=ORCL)(SERVER=DEDICATED)))';
DGMGRL> ENABLE CONFIGURATION;
```

 

**Example 對於多租戶：**  

```
DGMGRL> edit database rdscdb_a set property StaticConnectIdentifier='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(PORT=1521)(HOST=<RDS_CUSTOM_IP>))(CONNECT_DATA=(SID=RDSCDB)(SERVER=DEDICATED)))';
DGMGRL> edit database orcl_b set property StaticConnectIdentifier='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(PORT=1521)(HOST={{<EC2_IP>}}))(CONNECT_DATA=(SID=ORCL)(SERVER=DEDICATED)))';
DGMGRL> ENABLE CONFIGURATION;
```

**注意**  
Data Guard 代理程式是選用的，但建議用於更輕鬆的管理。對於簡單的遷移，您可以手動設定 Data Guard，無需代理程式。

**注意**  
當您為 CDB 啟用 Data Guard 時，它會自動保護所有 PDBs。任何 PDB 產生的重做都會運送到待命，並套用到待命上的對應 PDB。

### 步驟 10：設定待命重做日誌並開始復原
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-10"></a>

在 EC2 待命執行個體上，新增待命重做日誌檔案 (n\+1，其中 n 是線上重做日誌群組的數量）：

```
ALTER DATABASE ADD STANDBY LOGFILE ('slog1.rdo') SIZE 128M;
ALTER DATABASE ADD STANDBY LOGFILE ('slog2.rdo') SIZE 128M;
ALTER DATABASE ADD STANDBY LOGFILE ('slog3.rdo') SIZE 128M;
ALTER DATABASE ADD STANDBY LOGFILE ('slog4.rdo') SIZE 128M;
ALTER DATABASE ADD STANDBY LOGFILE ('slog5.rdo') SIZE 128M;
```

**注意**  
對於多租戶，待命重做日誌會在 CDB 層級建立，並由所有 PDBs共用。

在待命上設定 FAL 參數：

 

**Example 對於非 CDB：**  

```
SQL> alter system set fal_server = 'ORCL_A';
SQL> alter system set fal_client = 'ORCL_B';
```

 

**Example 對於多租戶：**  

```
SQL> alter system set fal_server = 'RDSCDB_A';
SQL> alter system set fal_client = 'ORCL_B';
```

開始受管復原：

```
SQL> recover managed standby database disconnect from session;
```

監控套用延遲：

```
SQL> SELECT name, value FROM v$dataguard_stats WHERE name = 'apply lag';
```

**Data Guard 同步的詳細監控和管理：**

監控 Data Guard 對確保成功遷移至關重要。以下是全方位的監控技術：

1. **監控 Data Guard 統計資料：**

   ```
   -- Comprehensive Data Guard statistics
   SQL> SELECT name, value, unit, time_computed, datum_time
   FROM v$dataguard_stats
   ORDER BY name;
   ```

   要監控的關鍵指標：
   + 傳輸延遲：在主要 上產生重做和待命時收到重做之間的時間差異
   + 套用延遲：產生重做並在待命時套用之間的時間差異
   + 套用率：套用重做的速率 (MB/秒）
   + 已收到重做：待命接收到的重做總數
   + 已套用重做：待命套用的重做總數

1. **監控封存日誌運送：**

   在主要 (RDS Custom) 上：

   ```
   -- Check archive log generation rate
   SQL> SELECT TO_CHAR(first_time, 'YYYY-MM-DD HH24') AS hour,
          COUNT(*) AS log_count,
          ROUND(SUM(blocks * block_size)/1024/1024/1024, 2) AS size_gb
   FROM v$archived_log
   WHERE first_time > SYSDATE - 1
   GROUP BY TO_CHAR(first_time, 'YYYY-MM-DD HH24')
   ORDER BY hour;
   
   -- Check archive log destination status
   SQL> SELECT dest_id, status, error, destination
   FROM v$archive_dest
   WHERE status != 'INACTIVE';
   ```

   在待命 (EC2) 上：

   ```
   -- Check archive log apply status
   SQL> SELECT sequence#, first_time, next_time, applied
   FROM v$archived_log
   WHERE applied = 'NO'
   ORDER BY sequence#;
   
   -- Check archive log gap
   SQL> SELECT thread#, low_sequence#, high_sequence#
   FROM v$archive_gap;
   ```

1. **監控受管復原程序：**

   ```
   -- Check if managed recovery is running
   SQL> SELECT process, status, thread#, sequence#, block#, blocks
   FROM v$managed_standby
   WHERE process LIKE 'MRP%' OR process LIKE 'RFS%';
   
   -- Check recovery progress
   SQL> SELECT process, status, sequence#,
          TO_CHAR(timestamp, 'YYYY-MM-DD HH24:MI:SS') AS timestamp
   FROM v$managed_standby
   ORDER BY process;
   ```

1. **監控多租戶的重做套用率：**

   對於多租戶資料庫，請監控每個 PDB 的套用率：

   ```
   -- Check redo apply rate per container
   SQL> SELECT con_id, name,
          ROUND(SUM(value)/1024/1024, 2) AS redo_applied_mb
   FROM v$con_sysstat cs, v$containers c
   WHERE cs.con_id = c.con_id
     AND cs.name = 'redo size'
   GROUP BY con_id, name
   ORDER BY con_id;
   ```

1. **監控待命重做日誌：**

   ```
   -- Check standby redo log status
   SQL> SELECT group#, thread#, sequence#, bytes/1024/1024 AS size_mb, status
   FROM v$standby_log
   ORDER BY group#;
   
   -- Check if standby redo logs are being used
   SQL> SELECT group#, thread#, sequence#, status, archived
   FROM v$standby_log
   WHERE status = 'ACTIVE';
   ```

1. **估計同步完成：**

   根據套用率計算剩餘時間：

   ```
   -- Calculate estimated time to catch up
   SQL> SELECT
          ROUND((SELECT value FROM v$dataguard_stats WHERE name = 'apply lag')/60, 2) AS lag_minutes,
          ROUND((SELECT value FROM v$dataguard_stats WHERE name = 'apply rate')/1024, 2) AS apply_rate_mbps,
          ROUND(
            (SELECT value FROM v$dataguard_stats WHERE name = 'apply lag') /
            NULLIF((SELECT value FROM v$dataguard_stats WHERE name = 'apply rate'), 0) / 60,
            2
          ) AS estimated_catchup_minutes
   FROM dual;
   ```

#### 常見的 Data Guard 同步問題：
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-10-common-issues"></a>



##### 問題 1：高套用延遲
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-10-common-issues-1"></a>

徵狀：

```
SQL> SELECT name, value FROM v$dataguard_stats WHERE name = 'apply lag';
NAME                             VALUE
-------------------------------- -----
apply lag                        +00 01:30:00
```

原因和解決方案：
+ **待命 CPU/IO 不足**：升級 EC2 執行個體類型或增加 EBS IOPS
+ **網路頻寬限制**：使用增強型聯網或更高頻寬的執行個體類型
+ 具有**高交易速率PDBs**：考慮增加重做套用平行處理 （需要 Active Data Guard 授權）

```
-- Increase apply parallelism (requires Active Data Guard)
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE PARALLEL 4 DISCONNECT FROM SESSION;
```

##### 問題 2：封存日誌間隙
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-10-common-issues-2"></a>

徵狀：

```
SQL> SELECT * FROM v$archive_gap;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
------- ------------- --------------
      1          1234           1240
```

解決方案：

```
-- FAL (Fetch Archive Log) will automatically fetch missing logs
-- Verify FAL parameters are set correctly
SQL> SHOW PARAMETER fal_server
SQL> SHOW PARAMETER fal_client

-- Manually register missing archive logs if needed
-- On primary, check if logs still exist
SQL> SELECT name FROM v$archived_log WHERE sequence# BETWEEN 1234 AND 1240;

-- If logs are missing on primary, you may need to rebuild the standby
```

##### 問題 3：重做傳輸失敗
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-10-common-issues-3"></a>

徵狀：

```
SQL> SELECT dest_id, status, error FROM v$archive_dest WHERE dest_id = 2;
DEST_ID STATUS    ERROR
------- --------- ----------------------------------------
2       ERROR     ORA-16191: Primary log shipping client not logged on standby
```

解決方案：

```
-- Check network connectivity
-- Verify TNS configuration
-- Check listener status on standby
-- Restart log transport

SQL> ALTER SYSTEM SET log_archive_dest_state_2 = 'DEFER';
SQL> ALTER SYSTEM SET log_archive_dest_state_2 = 'ENABLE';
```

##### 問題 4：未套用重做的受管復原
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-10-common-issues-4"></a>

徵狀：

```
SQL> SELECT process, status FROM v$managed_standby WHERE process = 'MRP0';
PROCESS   STATUS
--------- ------------
MRP0      WAIT_FOR_LOG
```

解決方案：

```
# Check if archive logs are arriving
ls -ltr /u01/app/oracle/oradata/ORCL/arch/

# Check alert log for errors
tail -100 $ORACLE_BASE/diag/rdbms/orcl_b/ORCL/trace/alert_ORCL.log

# Restart managed recovery
sqlplus / as sysdba
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
```

**對於多租戶**，您也可以檢查待命上每個 PDB 的狀態：

```
SQL> SELECT con_id, name, open_mode, restricted FROM v$pdbs;
```

預期的輸出 （處於待命`MOUNTED`狀態PDBs)：

```
CON_ID     NAME                           OPEN_MODE  RES
---------- ------------------------------ ---------- ---
2          PDB$SEED                       MOUNTED
3          ORCLDB                         MOUNTED
```

**注意**  
在實體待命上，PDBs受管復原期間會保持 `MOUNTED` 狀態。

### 步驟 11：執行切換
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-11"></a>

一旦您滿意待命已完全同步並就緒，請執行切換。對於多租戶，切換會將整個 CDB （所有 PDBs) 從 RDS Custom 主要節點切換到 EC2 待命。

在 RDS Custom 主要執行個體上，連線至 Data Guard 代理程式，並驗證這兩個資料庫都已準備好進行切換：

**Example 對於非 CDB：**  

```
DGMGRL> VALIDATE DATABASE ORCL_A;
DGMGRL> VALIDATE DATABASE ORCL_B;
```

 

**Example 對於多租戶：**  

```
DGMGRL> VALIDATE DATABASE RDSCDB_A;
DGMGRL> VALIDATE DATABASE ORCL_B;
```

兩者都應該顯示 `Ready for Switchover: Yes`

從 RDS Custom 主要節點切換到 EC2 待命：

```
DGMGRL> SWITCHOVER TO ORCL_B;
```

驗證切換是否成功：

```
DGMGRL> SHOW CONFIGURATION VERBOSE;
```

EC2 執行個體 (`ORCL_B`) 現在是主要資料庫，RDS Custom 執行個體是實體待命。

### 步驟 12：開啟 PDBs（僅限多租戶）
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-12"></a>

切換後，EC2 上的 CDB 會在 READ WRITE 模式中開啟，但所有 PDBs都處於 MOUNTED 狀態。您必須手動開啟它們。

連線至 EC2 上的新主要節點：

```
sqlplus / as sysdba
SQL> SELECT name, open_mode, database_role, cdb FROM v$database;
```

預期的輸出結果：

```
NAME      OPEN_MODE            DATABASE_ROLE    CDB
--------- -------------------- ---------------- ---
ORCL      READ WRITE           PRIMARY          YES
```

檢查目前的 PDB 狀態：

```
SQL> SELECT con_id, name, open_mode, restricted FROM v$pdbs;
```

預期的輸出 (`MOUNTED`處於 狀態PDBs - 具有一個名為 的 PDB 的範例`ORCLDB`)：

```
CON_ID     NAME                           OPEN_MODE  RES
---------- ------------------------------ ---------- ---
2          PDB$SEED                       READ ONLY  NO
3          ORCLDB                         MOUNTED
```

開啟所有 PDBs：

```
SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
```

插入式資料庫已變更。

確認所有 PDBs 現在都以 `READ WRITE` 模式開啟：

```
SQL> SELECT con_id, name, open_mode, restricted FROM v$pdbs;
```

預期的輸出結果：

```
CON_ID     NAME                           OPEN_MODE  RES
---------- ------------------------------ ---------- ---
2          PDB$SEED                       READ ONLY  NO
3          ORCLDB                         READ WRITE NO
```

### 步驟 13：在啟動時設定 PDB 自動開啟 （僅限多租戶）
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-13"></a>

設定 PDBs CDB 開始使用儲存狀態方法時自動開啟 （建議使用 Oracle 19c)：

```
SQL> ALTER PLUGGABLE DATABASE ALL SAVE STATE;
Pluggable database altered.
```

驗證儲存的狀態：

```
SQL> SELECT con_name, instance_name, state FROM dba_pdb_saved_states;
```

確認 PDB 服務已向接聽程式註冊：

```
lsnrctl services
```

預期的輸出應會顯示 CDB 和每個 PDB 的服務。如果服務未顯示：

```
SQL> ALTER SYSTEM REGISTER;
```

然後使用 再次檢查`lsnrctl services`。

### 步驟 14：移除 RDS Custom 物件
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-14"></a>

由於現在這是 EC2 上的自我管理資料庫，您應該移除 RDS Custom 特定的使用者和物件。非 CDB 和多租戶架構之間的清除程序略有不同。

**重要**  
在捨棄 RDS 特定的使用者和資料表空間之前，請確認這些結構描述下沒有應用程式物件：

```
SQL> SELECT owner, object_type, COUNT(*)
FROM dba_objects
WHERE owner IN ('RDSADMIN', 'RDS_DATAGUARD')
  AND object_name NOT LIKE 'RDS%'
  AND object_name NOT LIKE 'SYS_%'
GROUP BY owner, object_type;
```

如果找到任何應用程式物件，請先將其遷移至適當的應用程式結構描述，再繼續。

**非 CDB 清除：**

```
sqlplus / as sysdba

-- Drop RDS-specific users
SQL> DROP USER RDSADMIN CASCADE;
SQL> DROP USER RDS_DATAGUARD CASCADE;

-- Drop RDS-specific directories
SQL> DROP DIRECTORY OPATCH_INST_DIR;
SQL> DROP DIRECTORY OPATCH_LOG_DIR;
SQL> DROP DIRECTORY OPATCH_SCRIPT_DIR;

-- Drop the RDSADMIN tablespace
SQL> DROP TABLESPACE RDSADMIN INCLUDING CONTENTS AND DATAFILES;

-- Verify removal
SQL> SELECT username FROM dba_users WHERE username LIKE '%RDS%';
```

預期的輸出： `no rows selected`

**多租戶清除：**

在多租戶環境中，RDS Custom 會在 `CDB$ROOT` 中建立可在所有 PDBs 中看見的常見使用者。您必須從 清除 `CDB$ROOT`。

```
sqlplus / as sysdba

-- Verify you are in CDB$ROOT
SQL> SHOW CON_NAME;

-- Check for RDS-specific common users (including C## prefixed users)
SQL> SELECT username, common, con_id FROM cdb_users
WHERE username LIKE 'RDS%' OR username LIKE 'C##RDS%'
ORDER BY username;

-- Drop non-common users
SQL> DROP USER RDSADMIN CASCADE;
SQL> DROP USER RDS_DATAGUARD CASCADE;

-- If any C## common users exist
-- Example (adjust based on your findings):
-- SQL> DROP USER C##RDS_DATAGUARD CASCADE;
-- Drop RDS-specific directories
SQL> DROP DIRECTORY OPATCH_INST_DIR;
SQL> DROP DIRECTORY OPATCH_LOG_DIR;
SQL> DROP DIRECTORY OPATCH_SCRIPT_DIR;

-- Drop the RDSADMIN tablespace
SQL> DROP TABLESPACE RDSADMIN INCLUDING CONTENTS AND DATAFILES;

-- Verify removal from CDB$ROOT
SQL> SELECT username FROM dba_users WHERE username LIKE '%RDS%';

-- Verify removal from each PDB (example with one PDB named ORCLDB)
SQL> ALTER SESSION SET CONTAINER = ORCLDB;
SQL> SELECT username FROM dba_users WHERE username LIKE '%RDS%';
```

所有查詢的預期輸出：未選取任何資料列

### 步驟 15：設定自動啟動
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-15"></a>

確認`SPFILE`正在使用 ：

```
sqlplus / as sysdba
SQL> SHOW PARAMETER spfile;
```

如果`spfile`路徑正確，則不需要採取任何動作。如果沒有，請建立一個：

```
SQL> CREATE SPFILE FROM MEMORY;
```

重新啟動資料庫：

```
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
```

對於多租戶，開啟所有 PDBs（如果您稍早儲存狀態，它們應該自動開啟）：

```
SQL> SELECT con_id, name, open_mode FROM v$pdbs;
```

如果 PDBs未開啟，請手動開啟它們：

```
SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
```

編輯 `/etc/oratab`：

```
vi /etc/oratab
```

將 的行`ORCL`從 `N`變更為 `Y`：

```
ORCL:/u01/app/oracle/product/19.0.0/dbhome_1:Y
```

### 步驟 16：最終驗證
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-16"></a>

在遷移的資料庫上執行全面的驗證。

**Example 對於非 CDB：**  

```
sqlplus / as sysdba

-- Verify database role and status
SQL> SELECT name, open_mode, log_mode, database_role FROM v$database;

-- Check database size
SQL> SELECT SUM(bytes)/1024/1024/1024 AS size_gb FROM dba_data_files;

-- Verify all objects are valid
SQL> SELECT owner, object_type, COUNT(*)
     FROM dba_objects
     WHERE status = 'INVALID'
     GROUP BY owner, object_type;

-- Verify data files
SQL> SELECT name, status FROM v$datafile;

-- Test application connectivity
SQL> SELECT username, machine, program FROM v$session WHERE username IS NOT NULL;
```

**Example 對於多租戶：**  

```
sqlplus / as sysdba

-- Verify CDB status
SQL> SELECT name, open_mode, log_mode, cdb, database_role FROM v$database;

-- Verify all PDBs are open
SQL> SELECT con_id, name, open_mode, restricted FROM v$pdbs;

-- Check total CDB size
SQL> SELECT SUM(bytes)/1024/1024/1024 AS total_size_gb FROM cdb_data_files;

-- Check size per PDB
SQL> SELECT p.name AS pdb_name,
       ROUND(SUM(d.bytes)/1024/1024/1024, 2) AS size_gb
FROM v$pdbs p
JOIN cdb_data_files d ON p.con_id = d.con_id
GROUP BY p.name,p.con_id
ORDER BY p.con_id;

-- Verify all objects are valid across all PDBs
SQL> SELECT con_id, owner, object_type, COUNT(*)
     FROM cdb_objects
     WHERE status = 'INVALID'
     GROUP BY con_id, owner, object_type;

-- Verify PDB services are registered
SQL> SELECT name FROM v$services ORDER BY name;

Test application connectivity:

# Non-CDB
sqlplus {{<app_user>}}/{{<password>}}@{{<EC2_IP>}}:1521/ORCL

# Multitenant (connect to PDB)
sqlplus {{<app_user>}}/{{<password>}}@{{<EC2_IP}}>:1521/{{<PDB_NAME>}}
```

測試應用程式連線：

```
# Non-CDB
sqlplus {{<app_user>}}/{{<password>}}@{{<EC2_IP>}}:1521/ORCL

# Multitenant (connect to PDB)
sqlplus {{<app_user>}}/{{<password>}}@{{<EC2_IP>}}:1521/{{<PDB_NAME>}}
```

### 步驟 17：清除備份檔案
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-17"></a>

成功驗證後，如果使用單獨的 EBS 磁碟區，請移除備份檔案並分離備份磁碟區：

```
rm -rf /u01/app/oracle/backup/*
```

如果使用單獨的 EBS 磁碟區進行備份：

```
# Unmount the volume
sudo umount /u01/app/oracle/backup

# Detach and delete the EBS volume from AWS Console or CLI
aws ec2 detach-volume --volume-id {{<volume-id>}}
aws ec2 delete-volume --volume-id {{<volume-id>}}
```

### 步驟 18：繼續 RDS Custom 自動化
<a name="RDS-Custom-for-Oracle-end-of-support-option-2-step-18"></a>

如果您計劃在驗證期間讓 RDS Custom 執行個體做為備用執行個體執行，請繼續自動化：

```
aws rds modify-db-instance \
  --db-instance-identifier my-custom-instance \
  --automation-mode full \
  --region us-east-1
```

## 排解常見問題
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting"></a>



本節涵蓋 RMAN 重複和 Oracle Data Guard 方法在遷移期間可能遇到的常見問題，涵蓋非 CDB 和多租戶架構。

### ORA-09925：無法建立稽核追蹤檔案
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting-ora-09925"></a>

**原因：**在 `audit_file_dest` 參數中指定的稽核目錄不存在於目標 EC2 執行個體上。

 **解決方案**：

確保稽核目錄存在且具有適當的許可：

```
mkdir -p /u01/app/oracle/admin/ORCL/adump
chown -R oracle:oinstall /u01/app/oracle/admin/ORCL
chmod -R 755 /u01/app/oracle/admin/ORCL
```

### ORA-01261：無法翻譯參數`db_create_file_dest`目的地字串
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting-ora-01261"></a>

**原因：**在 `db_create_file_dest` 參數中指定的目錄不存在於目標 EC2 執行個體。

 **解決方案**：

對於非 CDB：

```
mkdir -p /u01/app/oracle/oradata/ORCL
chown -R oracle:oinstall /u01/app/oracle/oradata/ORCL
chmod -R 755 /u01/app/oracle/oradata/ORCL
```

對於多租戶：

```
mkdir -p /u01/app/oracle/oradata/ORCL/pdb/datafile
chown -R oracle:oinstall /u01/app/oracle/oradata/ORCL
chmod -R 755 /u01/app/oracle/oradata/ORCL
```

### ORA-01804：無法初始化時區資訊
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting-ora-01804"></a>

如果 RDS 來源的時區版本高於 EC2 $ORACLE\_HOME 中安裝的時區版本，則在捨棄`RDSADMIN`使用者時可能會發生此錯誤。

 **解決方案**：

1. 檢查時區版本：

   ```
   SELECT * FROM v$timezone_file;
   SELECT PROPERTY_NAME, PROPERTY_VALUE
   FROM database_properties
   WHERE PROPERTY_NAME LIKE '%DST%';
   ```

1. 作為解決方法，請設定時區檔案環境變數，以符合您的 $ORACLE\_HOME 可用項目：

   ```
   ls $ORACLE_HOME/oracore/zoneinfo/timezlrg_*.dat
   export ORA_TZFILE=$ORACLE_HOME/oracore/zoneinfo/timezone_40.dat
   ```

   調整數字以符合安裝中可用的版本。

1. 重試捨棄：

   ```
   sqlplus / as sysdba
   SQL> DROP USER RDSADMIN CASCADE;
   ```

### 跨 RU 遷移問題 （不同的版本更新）
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting-cross-ru-migration"></a>

**原因：**目標 EC2 執行個體具有與來源 RDS Custom 執行個體不同的 Oracle Release Update (RU) 或一次性修補程式，導致遷移期間或之後發生相容性錯誤。

**常見錯誤：**
+ 套用重做期間的 ORA-00600 內部錯誤 (Data Guard)
+ ORA-39700 資料庫必須使用 `UPGRADE`選項開啟
+ 遷移後的字典不一致
+ `DBA_REGISTRY` 或 中的無效物件 `DBA_OBJECTS`

 **解決方案**：

 **最佳實務 - 完全符合 RU 版本和一次性修補程式：**

1. 檢查來源和目標的確切 RU 版本：

   ```
   -- On both source and target
   SQL> SELECT * FROM v$version;
   
   SQL> SELECT patch_id, patch_uid, version, action, status, description
   FROM dba_registry_sqlpatch
   ORDER BY action_time DESC;
   ```

1. 驗證 $ORACLE\_HOME 修補程式層級：

   ```
   # On both instances
   $ORACLE_HOME/OPatch/opatch lsinventory
   ```

1. 如果版本不相符，請在遷移之前視需要套用或轉返修補程式來對齊這些版本。

1. 如果您必須繼續進行不相符RUs，請在遷移後執行資料修補程式：

   ```
   cd $ORACLE_HOME/OPatch
   ./datapatch -verbose
   ```

1. 檢查無效物件並重新編譯：

   ```
   SQL> @?/rdbms/admin/utlrp.sql
   
   SQL> SELECT owner, object_type, COUNT(*)
   FROM dba_objects
   WHERE status = 'INVALID'
   GROUP BY owner, object_type;
   ```

### 網路連線問題
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting-network-connectivity"></a>

 

**原因：**安全群組、網路 ACLs 或`iptables`封鎖 Oracle 接聽程式連接埠。

 **解決方案**：

1. 驗證安全群組允許連接埠雙向

1. 檢查 EC2 上的 iptables：

   ```
   sudo iptables -L INPUT -n -v
   ```

1. 視需要新增規則：

   ```
   # Insert rule before the REJECT rule (typically position 5)
   sudo iptables -I INPUT 5 -p tcp --dport 1521 -j ACCEPT
   
   # For enhanced security, allow only from specific source IPs
   sudo iptables -I INPUT 5 -p tcp -s {{<RDS_Custom_IP>}} --dport 1521 -j ACCEPT
   
   # Save rules permanently
   sudo service iptables save
   ```

1. 測試連線：

   ```
   telnet {{<EC2_instance_IP>}} 1521
   tnsping DB_SOURCE
   tnsping DB_TARGET
   ```

### 遷移後未開啟 PDBs（僅限多租戶）
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting-pdbs-not-opening"></a>

**原因：**這是預期的行為。在 RMAN 重複或 Data Guard 切換之後，CDB 會開啟，但 PDBs處於 `MOUNTED` 狀態。

 **解決方案**：

手動開啟它們：

```
SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
```

如果特定 PDB 無法開啟，請檢查警示日誌是否有錯誤：

```
tail -100 $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log
```

常見原因包括遺失資料檔案或路徑映射問題。

### 找不到 PDB 資料檔案或路徑不符 （僅限多租戶）
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting-pdb-data-files-not-found"></a>

**原因：**遷移未正確對應所有來源路徑，尤其是 OMF 型 PDB 資料檔案。

 **解決方案**：

1. 檢查缺少哪些資料檔案：

   ```
   SQL> SELECT name, status FROM v$datafile WHERE status != 'ONLINE';
   ```

1. 如果檔案放置在錯誤目錄中，請在控制檔案中重新命名它們：

   ```
   SQL> ALTER DATABASE RENAME FILE '/wrong/path/datafile.dbf' TO '/correct/path/datafile.dbf';
   ```

1. 若要避免這種情況，在設定參數檔案`SELECT con_id, name FROM v$datafile ORDER BY con_id;`之前，請務必使用 驗證來源資料檔案路徑。

### PDB 服務未向接聽程式註冊 （僅限多租戶）
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting-pdb-services-not-registering"></a>

**原因：**接聽程式在開啟 PDB 後不知道 PDBs服務。

 **解決方案**：

1. 強制服務註冊：

   ```
   SQL> ALTER SYSTEM REGISTER;
   ```

1. 如果服務仍未顯示，請檢查 `local_listener` 參數：

   ```
   SQL> SHOW PARAMETER local_listener;
   ```

   確保指向正確的接聽程式地址。如有需要，請更新它：

   ```
   SQL> ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST={{<EC2_instance_IP>}})(PORT=1521))';
   SQL> ALTER SYSTEM REGISTER;
   ```

1. 使用 進行驗證：

   ```
   lsnrctl services
   ```

### PDBs （僅限多租戶）
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting-pdbs-not-opening-after-cdb-restart"></a>

**原因：**未設定 PDB 儲存狀態。

 **解決方案**：

確認 PDB 儲存狀態已設定：

```
SQL> SELECT con_name, instance_name, state FROM dba_pdb_saved_states;
```

如果未傳回任何資料列，請儲存狀態：

```
SQL> ALTER PLUGGABLE DATABASE ALL OPEN;
SQL> ALTER PLUGGABLE DATABASE ALL SAVE STATE;
```

### Data Guard 重做傳輸無法運作
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting-odg-redo-transport-failure"></a>

**原因：**網路連線問題、不正確的 TNS 組態，或未設定 FAL 參數。

 **解決方案**：

1. 確認待命處於 MOUNT 模式：

   ```
   SQL> SELECT status FROM v$instance;
   ```

1. 檢查待命上的 fal\_server 和 fal\_client 是否正確設定：

   ```
   SQL> SHOW PARAMETER fal_server
   SQL> SHOW PARAMETER fal_client
   ```

1. 驗證網路連線：

   ```
   tnsping ORCL_A # or RDSCDB_A for multitenant
   ```

1. 檢查待命主要點上的 log\_archive\_dest\_2 參數 （如果在沒有代理程式的情況下手動設定）。

 **Data Guard 會隨著多個 PDBs（僅限多租戶）** 

**原因：**對於具有多個 PDB 的 CDBs，由於所有容器的變更量，重新執行可能會較慢。 PDBs

 **解決方案**：

1. 檢查套用率：

   ```
   SQL> SELECT name, value, unit FROM v$dataguard_stats WHERE name IN ('apply rate', 'apply lag');
   ```

1. 考慮增加重複的平行處理 （需要 Active Data Guard 授權）：

   ```
   SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
   SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE PARALLEL 4 DISCONNECT FROM SESSION;
   ```

1. 確認待命執行個體上沒有資源限制 (CPU、I/O)。

 **RMAN 封存日誌備份使用 ORA-19625 失敗** 

**原因：**RDS Custom 自動化已從磁碟清除較舊的封存日誌，但 RMAN 的控制檔案仍有記錄。

 **解決方案**：

1. 交叉檢查並清除過時的封存日誌項目：

   ```
   RMAN> CROSSCHECK ARCHIVELOG ALL;
   RMAN> DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
   ```

1. 僅重新執行封存日誌備份：

   ```
   RMAN> RUN {
   SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
   BACKUP AS COMPRESSED BACKUPSET
   FILESPERSET 50
   FORMAT '/rdsdbdata/backup/arch_%U'
   ARCHIVELOG ALL;
   }
   ```

### 一般使用者捨棄在多租用戶中失敗 （僅限多租用戶）
<a name="RDS-Custom-for-Oracle-end-of-support-troubleshoting-multitenant-user-drop-fails"></a>

 

**原因：**常用使用者 （字首為 C\#\#) 必須捨棄 `CONTAINER=ALL`子句。

 **解決方案**：

```
-- For common users
SQL> DROP USER C##RDS_DATAGUARD CASCADE CONTAINER=ALL;

-- For non-common users in CDB$ROOT
SQL> DROP USER RDSADMIN CASCADE;
```

確認您已連線至 `CDB$ROOT`：

```
SQL> SHOW CON_NAME;
```

## 遷移後任務
<a name="RDS-Custom-for-Oracle-end-of-support-post-migration"></a>

遷移成功後，請完成這些額外任務，以確保 EC2 上的自我管理 Oracle 資料庫可供生產使用。

 **更新應用程式連線字串** 

**對於非 CDB：**
+ 將您的應用程式指向新的 EC2 執行個體端點
+ 更新連線字串以使用 EC2 執行個體 IP 或主機名稱
+ 徹底測試所有應用程式功能

**對於多租戶：**
+ 將您的應用程式指向新的 EC2 執行個體 PDB 服務名稱 （例如 ORCLDB 或您的特定 PDB 名稱）
+ 確保應用程式連接到正確的 PDB，而不是 CDB
+ 更新連線字串以使用 PDB 服務名稱
+ 測試每個 PDB 的所有應用程式功能

連線字串範例：

```
# Non-CDB
jdbc:oracle:thin:@{{<EC2_IP>}}:1521/ORCL

# Multitenant (connect to PDB)
jdbc:oracle:thin:@{{<EC2_IP>}}:1521/ORCLDB
```

 **設定備份策略** 

為您的自我管理資料庫設定全面的備份策略：

**RMAN 備份：**
+ 針對完整、增量和封存日誌備份設定自動化 RMAN 備份指令碼
+ 根據您的復原點目標 (RPO) 設定備份保留政策
+ 將備份存放在 Amazon S3 上，以提高耐用性和成本效益
+ 定期測試備份還原程序

**AWS Backup:**
+ [AWS Backup](https://aws.amazon.com/backup/) 用於 EBS 磁碟區快照
+ 設定備份排程和保留政策
+ 啟用跨區域備份複本以進行災難復原

**對於多租戶：**
+ CDB 的 RMAN 備份會自動包含所有 PDBs
+ 您也可以視需要備份個別 PDBs 
+ 根據業務需求考慮 PDB 特定的備份排程

RMAN 備份指令碼範例：

```
#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_SID=ORCL
export PATH=$ORACLE_HOME/bin:$PATH
rman target / << EOF
run {
  backup as compressed backupset database plus archivelog;
  delete noprompt obsolete;
}
exit;
EOF
```

 **設定監控** 

實作 EC2-hosted Oracle 資料庫的完整監控：

**Amazon CloudWatch**
+ 設定 EC2 執行個體運作狀態、磁碟用量和自訂 Oracle 指標的 CloudWatch 指標
+ 為關鍵閾值建立 CloudWatch 警示
+ 使用 CloudWatch Logs 進行資料庫警示日誌監控

**Oracle Enterprise Manager (OEM)：**
+ 如果可用，請設定 OEM 進行資料庫監控
+ 設定效能監控和診斷
+ 設定關鍵事件的自動提醒

**第三方工具：**
+ 考慮使用 Datadog、New Relic 或 Prometheus 等工具進行資料庫監控
+ 與您現有的監控基礎設施整合

**要監控的關鍵指標：**
+ 資料表空間用量
+ 封存日誌空間
+ 無效的物件
+ 工作階段計數
+ 等待事件
+ CPU 與記憶體使用率
+ I/O 效能

**對於多租戶：**
+ 同時監控 CDB 層級和 PDB 層級指標
+ 設定 PDB 資源用量和配額的提醒
+ 追蹤 PDB 特定的效能指標

 **設定安全群組和網路 ACLs** 

檢閱並加強 EC2 執行個體的安全性：

**安全群組：**
+ 限制資料庫連接埠只能存取授權的應用程式伺服器和堡壘主機
+ 移除遷移期間建立的任何過度寬鬆規則
+ 文件安全群組規則及其目的

**網路 ACLs：**
+ 為其他安全層設定 VPC 網路 ACLs 
+ 實作defense-in-depth安全策略

**SSH 存取：**
+ 限制 SSH 存取特定 IP 範圍或使用 AWS Systems Manager Session Manager
+ 停用密碼身分驗證，並僅使用金鑰型身分驗證
+ 實作多重要素驗證 (MFA) 進行特殊權限存取

**加密：**
+ 啟用 EBS 磁碟區的靜態加密
+ 使用 Oracle 原生網路加密或 TLS 為資料庫連線啟用傳輸中加密
+ 定期輪換加密金鑰

**實作高可用性**

如果您的工作負載需要高可用性，請考慮實作：

**Oracle Data Guard：**
+ 在另一個 EC2 執行個體上設定新的待命資料庫以進行災難復原
+ 對於多租戶，Data Guard 會保護整個 CDB，包括所有 PDBs
+ 待命可以位於不同的可用區域或區域
+ 使用指令碼或第三方工具實作自動化容錯移轉機制

**AWS 異地同步備份部署：**
+ 在不同的可用區域中部署待命執行個體
+ 使用 Amazon Route 53 進行 DNS 容錯移轉
+ 透過容錯移轉支援實作應用程式層級連線集區

**備份和復原：**
+ 使用經過測試的還原程序來維護定期備份
+ 文件復原時間目標 (RTO) 和復原點目標 (RPO)
+ 定期進行災難復原演練

**執行徹底的應用程式測試**

停用 RDS Custom 執行個體之前：

**功能測試：**
+ 驗證所有應用程式功能是否正常運作
+ 測試所有與資料庫相關的功能
+ 驗證資料完整性和一致性

**效能測試：**
+ 比較效能指標與 RDS Custom 基準
+ 識別並解決任何效能迴歸
+ 視需要最佳化查詢和索引

**負載測試：**
+ 在預期的尖峰負載下測試資料庫
+ 驗證資源使用率是否保持在可接受的限制內
+ 識別並解決任何瓶頸

**容錯移轉測試 （如果已設定 HA)：**
+ 測試容錯移轉案例
+ 驗證應用程式重新連線邏輯
+ 測量實際 RTO 和 RPO

**備份和還原測試：**
+ 驗證備份和還原程序是否正常運作
+ 測試point-in-time復原
+ 驗證備份完整性

**對於多租戶：**
+ 獨立測試每個 PDB
+ 驗證 PDB 隔離和資源配置
+ 測試 PDB 特定的操作 （複製、拔除/插入等）

**停用 RDS Custom 執行個體**

驗證期間成功後 （通常為 1-2 週）：

1. **最終備份**：基於封存目的，取得 RDS Custom 執行個體的最終備份

   ```
   # Create final snapshot
   aws rds create-db-snapshot \
     --db-instance-identifier my-custom-instance \
     --db-snapshot-identifier my-custom-instance-final-snapshot \
     --region us-east-1
   ```

1. **記錄遷移**：使用新的 EC2 組態更新 Runbook 和文件

1. **刪除 RDS Custom 執行個體**：使用 AWS 主控台或 CLI 刪除執行個體

   ```
   # Delete RDS Custom instance without final snapshot (if already created above)
   aws rds delete-db-instance \
     --db-instance-identifier my-custom-instance \
     --skip-final-snapshot \
     --region us-east-1
   
   # Or create a final snapshot before deletion
   aws rds delete-db-instance \
     --db-instance-identifier my-custom-instance \
     --final-db-snapshot-identifier my-custom-instance-final-snapshot \
     --region us-east-1
   ```

1. **清除資源**：如果不再需要，請移除相關聯的快照、參數群組和選項群組

1. **更新文件**：確保所有操作文件反映新的 EC2-based 

## 比較：RMAN Active Duplication 與 Oracle Data Guard
<a name="RDS-Custom-for-Oracle-end-of-support-RMAN-vs-ODG"></a>

下表摘要說明兩個遷移選項之間的主要差異：


|  **Aspect**  |  **RMAN 作用中複製**  |  **Oracle Data Guard**  | 
| --- | --- | --- | 
| **來源資料庫可用性** | 在整個重複期間上線 | 在整個程序期間上線 | 
| **停機時間** | 分鐘 （僅限最終切換） | 秒到分鐘 （切換） | 
| **複雜性** | 較低 | 較高 | 
| **遷移持續時間** | 單一重複操作 | 初始設定 \+ 持續同步 | 
| **持續同步** | 否 | 是 | 
| **備用功能** | 手動 （保持來源執行） | 內建 （自動） | 
| **切換前測試** | 有限 （重複後測試） | 可進行完整測試 （可測試待命） | 
| **網路頻寬** | 重複期間高 | 中等 （連續） | 
| **來源資料庫影響** | 最小 （讀取操作） | 最小 （重做運送） | 
| **最適合** | 大多數遷移、直接的切換 | 關鍵任務，需要幾近零的停機時間 | 
| **非 CDB 支援** | 是 | 是 | 
| **多租戶支援** | 是 （整個 CDB) | 是 （整個 CDB) | 
| **遷移後 PDB 狀態** | CDB 開啟，PDBs已掛載 | CDB 開啟，PDBs已掛載 | 
| **需要 RMAN** | 是 | 是 （用於以備份為基礎的方法進行初始備份） | 
| **需要 Data Guard** | 否 | 是 | 
| **需要技能層級** | 中級 | Advanced (進階) | 
| **切換程序** | 將應用程式重新導向至 EC2 | 切換命令 \+ 重新導向應用程式 | 

## 比較：非 CDB 與多租戶遷移
<a name="RDS-Custom-for-Oracle-end-of-support-non-cdb-va-multitenant"></a>

 

下表摘要說明遷移非 CDB 和多租戶資料庫之間的主要差異：


|  **Aspect**  |  **非 CDB 遷移**  |  **多租戶 (CDB 搭配 PDBs遷移**  | 
| --- | --- | --- | 
| **資料庫類型** | 單一執行個體非 CDB （例如 ORCL) | CDB （來源：RDSCDB，目標：ORCL) 搭配 CDB$ROOT \+ PDB$SEED \+ 一或多個 PDBs | 
| **遷移範圍** | 單一資料庫 | 整個 CDB （自動包含所有 PDBs) | 
| **RMAN 重複範圍** | 複製單一資料庫 | 複製整個 CDB （所有容器） | 
| **Data Guard 範圍** | 保護單一資料庫 | 保護整個 CDB （自動包含所有 PDBs) | 
| **參數檔案** | 標準 init 參數 | 必須包含 enable\_pluggable\_database=TRUE | 
| **遷移後資料庫狀態** | 資料庫以讀取寫入模式開啟 | CDB 以 READ WRITE 模式開啟；PDBs保持 MOUNTED 狀態 | 
| **PDB 開啟** | N/A | 必須使用 手動開啟所有 PDBs ALTER PLUGGABLE DATABASE ALL OPEN | 
| **PDB 啟動時自動開啟** | N/A | 必須設定 PDB 儲存狀態或啟動觸發 | 
| **驗證** | 單一資料庫檢查 | 必須個別驗證 CDB 和每個 PDB | 
| **RDS 特定的清除** | 從單一資料庫捨棄使用者/物件 | 從 捨棄常用使用者 CDB$ROOT（串聯到 PDBs)；處理 C\#\# 使用者 | 
| **TNS/Listener 組態** | 資料庫的單一服務 | CDB 服務 \+ 動態註冊的個別 PDB 服務 | 
| **應用程式連線字串** | 連線至單一資料庫 | 連線至個別 PDB 服務 （非 CDB) | 
| **備份策略** | 備份單一資料庫 | 備份整個 CDB （包括所有 PDBs) 或個別 PDBs | 
| **資源管理** | 資料庫層級資源管理 | 使用 Resource Manager 進行 CDB 層級和 PDB 層級的資源管理 | 
| **複雜性** | 較低複雜性 | 由於多個容器和 OMF 路徑，複雜性更高 | 

## 最佳實務與建議
<a name="RDS-Custom-for-Oracle-end-of-support-best-practices"></a>

本節提供從 RDS Custom for Oracle 成功遷移至 EC2 的完整最佳實務。

### 遷移前規劃
<a name="RDS-Custom-for-Oracle-end-of-support-best-practices-pre-migration"></a>

1. 進行徹底的評估：

   開始遷移之前，請執行環境的全面評估：
   + **資料庫清查**：記錄所有資料庫、其大小、架構 （非 CDB 與多租戶） 和相依性
   + **應用程式相依性**：識別連線至資料庫的所有應用程式及其連線方法
   + **效能基準**：擷取效能指標 (CPU、記憶體、I/O、網路） 以進行遷移後比較
   + **備份和復原需求**：文件 RPO （復原點目標） 和 RTO （復原時間目標）
   + **合規要求**：識別可能影響遷移的任何法規或合規要求

1. 選擇正確的 EC2 執行個體類型：

   根據您的工作負載特性選取 EC2 執行個體類型：    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/RDS-Custom-for-Oracle-end-of-support.html)

    **執行個體大小調整準則：**
   + 從與 RDS Custom 執行個體相同的執行個體類別開始
   + 在測試遷移期間監控資源使用率
   + 考慮使用 AWS Compute Optimizer 進行建議
   + 規劃 20-30% 的成長和尖峰負載空間

1. 設計您的儲存架構：

   **EBS 磁碟區類型：**    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/RDS-Custom-for-Oracle-end-of-support.html)

   **儲存體配置建議：**

   ```
   # Recommended layout for production databases
         /u01/app/oracle          # Oracle software (50-100 GB, gp3)
         /u01/app/oracle/oradata  # Data files (sized for database, gp3 or io2)
         /u01/app/oracle/arch     # Archive logs (separate volume, gp3)
         /u01/app/oracle/backup   # Backups (separate volume, gp3, can be detached post-migration)
   ```

    **不同磁碟區的優點：**
   + 獨立 IOPS 配置
   + 更輕鬆的容量管理
   + 簡化的備份和快照策略
   + 更好的效能隔離

1.  建立復原計劃：

   一律有復原策略：
   + **在驗證期間保持執行 RDS Custom 執行個體** （建議 1-2 週）
   + **維護來源和目標的定期備份** 
   + **文件轉返程序**，包括連線字串變更
   + 在非生產環境中**測試轉返程序** 
   + **定義復原條件** （效能降級、資料不一致、應用程式錯誤）

### 遷移執行最佳實務
<a name="RDS-Custom-for-Oracle-end-of-support-migration-best-practices"></a>

1. **遷移的時間：**

   選擇最佳時段：
   + **低流量時段**：週末、假日或離峰時間
   + **維護時段**：盡可能與排定的維護保持一致
   + **避免月末/季末**：這些期間通常具有較高的交易量
   + **考慮時區**：針對全域應用程式，選擇可將跨區域影響降至最低的時間

1. **通訊計劃：**

   建立明確的溝通：
   + **利益相關者通知**：至少提前 2 週通知所有利益相關者
   + **應用程式團隊**：與應用程式團隊協調連線字串更新
   + **狀態更新**：在遷移期間提供定期更新
   + **呈報路徑**：定義問題的明確呈報程序
   + **遷移後通訊**：確認成功完成和任何後續動作

1. **驗證檢查點：**

   在每個階段實作驗證：

    **遷移前驗證：**

   ```
   -- Capture object counts
   SQL> SELECT object_type, COUNT(*) FROM dba_objects GROUP BY object_type ORDER BY object_type;
   
   -- Capture tablespace usage
   SQL> SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024/1024, 2) AS size_gb
   FROM dba_data_files GROUP BY tablespace_name;
   
   -- Capture user counts
   SQL> SELECT COUNT(*) FROM dba_users;
   
   -- For multitenant, capture PDB information
   SQL> SELECT con_id, name, open_mode FROM v$pdbs;
   ```

    **遷移後驗證：**

   ```
   -- Verify object counts match
   SQL> SELECT object_type, COUNT(*) FROM dba_objects GROUP BY object_type ORDER BY object_type;
   
   -- Verify no invalid objects
   SQL> SELECT owner, object_type, object_name FROM dba_objects WHERE status = 'INVALID';
   
   -- Verify tablespace usage
   SQL> SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024/1024, 2) AS size_gb
   FROM dba_data_files GROUP BY tablespace_name;
   
   -- Verify database size matches
   SQL> SELECT SUM(bytes)/1024/1024/1024 AS total_size_gb FROM dba_data_files;
   
   -- For multitenant, verify all PDBs are open
   SQL> SELECT con_id, name, open_mode FROM v$pdbs;
   ```

1. **效能驗證：**

   比較遷移前後的效能指標：

   ```
   -- Capture AWR snapshots before migration (on RDS Custom)
   SQL> EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;
   
   -- After migration (on EC2), compare metrics
   SQL> SELECT snap_id, begin_interval_time, end_interval_time
   FROM dba_hist_snapshot
   ORDER BY snap_id DESC
   FETCH FIRST 10 ROWS ONLY;
   
   -- Generate AWR report for comparison
   SQL> @?/rdbms/admin/awrrpt.sql
   ```

   要比較的關鍵指標：
   + 平均作用中工作階段
   + 每筆交易的資料庫時間
   + 每秒實體讀取數
   + 每秒邏輯讀取數
   + 每秒重做大小
   + 每秒的使用者呼叫數
   + 每次執行的剖析時間

### 遷移後最佳化
<a name="RDS-Custom-for-Oracle-end-of-support-best-practices-post-migration-optimization"></a>

1. 遷移後，最佳化資料庫效能：

   1. **資料庫效能調校：**

       **收集統計資料：**

      ```
      -- Gather dictionary statistics
      SQL> EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;
      
      -- Gather fixed object statistics
      SQL> EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;
      
      -- Gather schema statistics
      SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCHEMA_NAME', cascade=>TRUE);
      
      -- For multitenant, gather statistics for each PDB
      SQL> ALTER SESSION SET CONTAINER = PDB_NAME;
      SQL> EXEC DBMS_STATS.GATHER_DATABASE_STATS(cascade=>TRUE);
      ```

      **最佳化記憶體參數：**

      ```
      -- Enable Automatic Memory Management (if not already enabled)
      SQL> ALTER SYSTEM SET MEMORY_TARGET = 24G SCOPE=SPFILE;
      SQL> ALTER SYSTEM SET MEMORY_MAX_TARGET = 28G SCOPE=SPFILE;
      SQL> SHUTDOWN IMMEDIATE;
      SQL> STARTUP;
      
      -- Or use Automatic Shared Memory Management
      SQL> ALTER SYSTEM SET SGA_TARGET = 16G SCOPE=SPFILE;
      SQL> ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 8G SCOPE=SPFILE;
      ```

      **設定結果快取：**

      ```
      -- Enable result cache for frequently accessed queries
      SQL> ALTER SYSTEM SET RESULT_CACHE_MAX_SIZE = 1G;
      SQL> ALTER SYSTEM SET RESULT_CACHE_MODE = MANUAL;
      ```

   1. 儲存最佳化：

      **啟用壓縮：**

      ```
      -- For tables with infrequent updates
      ALTER TABLE large_table MOVE COMPRESS FOR OLTP;
      
      -- For archive/historical data
      ALTER TABLE archive_table MOVE COMPRESS FOR ARCHIVE HIGH;
      
      -- Rebuild indexes after compression
      ALTER INDEX index_name REBUILD ONLINE;
      ```

      **實作分割：**

      ```
      -- For large tables, consider partitioning
      -- Example: Range partitioning by date
      CREATE TABLE sales_partitioned (
          sale_id NUMBER,
          sale_date DATE,
          amount NUMBER
      )
      PARTITION BY RANGE (sale_date) (
          PARTITION sales_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')),
          PARTITION sales_2025 VALUES LESS THAN (TO_DATE('2026-01-01', 'YYYY-MM-DD')),
          PARTITION sales_2026 VALUES LESS THAN (MAXVALUE)
      );
      ```

   1. 實作監控和提醒：

      **CloudWatch 自訂指標：**

      建立指令碼以發佈 Oracle 指標至 CloudWatch：

      ```
      #!/bin/bash
      # publish_oracle_metrics.sh
      
      INSTANCE_ID=$(ec2-metadata --instance-id | cut -d " " -f 2)
      REGION=$(ec2-metadata --availability-zone | cut -d " " -f 2 | sed 's/[a-z]$//')
      
      # Get tablespace usage
      TABLESPACE_USAGE=$(sqlplus -s / as sysdba << EOF
      SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
      SELECT ROUND(MAX(percent_used), 2)
      FROM (
           SELECT tablespace_name,
                  ROUND((used_space/tablespace_size)*100, 2) AS percent_used
           FROM dba_tablespace_usage_metrics
      );
      EXIT;
      EOF
      )
      
      # Publish to CloudWatch
      aws cloudwatch put-metric-data \
        --region $REGION \
        --namespace "Oracle/Database" \
        --metric-name "TablespaceUsage" \
        --value $TABLESPACE_USAGE \
        --unit Percent \
        --dimensions InstanceId=$INSTANCE_ID,Database=ORCL
      # Add more metrics as needed (sessions, wait events, etc.)
      ```

      **設定 CloudWatch 警示：**

      ```
      # Create alarm for high tablespace usage
      aws cloudwatch put-metric-alarm \
        --alarm-name oracle-high-tablespace-usage \
        --alarm-description "Alert when tablespace usage exceeds 85%" \
        --metric-name TablespaceUsage \
        --namespace Oracle/Database \
        --statistic Maximum \
        --period 300 \
        --evaluation-periods 2 \
        --threshold 85 \
        --comparison-operator GreaterThanThreshold \
        --alarm-actions arn:aws:sns:region:account-id:topic-name
      ```

   1. 安全性強化：

      **資料庫安全性：**

      ```
      -- Enforce password complexity
      ALTER PROFILE DEFAULT LIMIT
          PASSWORD_LIFE_TIME 90
          PASSWORD_GRACE_TIME 7
          PASSWORD_REUSE_TIME 365
          PASSWORD_REUSE_MAX 5
          FAILED_LOGIN_ATTEMPTS 5
          PASSWORD_LOCK_TIME 1;
      
      -- Enable audit
      ALTER SYSTEM SET AUDIT_TRAIL = DB, EXTENDED SCOPE=SPFILE;
      SHUTDOWN IMMEDIATE;
      STARTUP;
      
      -- Audit critical operations
      AUDIT ALL ON SYS.AUD$ BY ACCESS;
      AUDIT CREATE USER BY ACCESS;
      AUDIT DROP USER BY ACCESS;
      AUDIT ALTER USER BY ACCESS;
      AUDIT CREATE SESSION BY ACCESS WHENEVER NOT SUCCESSFUL;
      ```

      **網路安全：**

      ```
      # Restrict SSH access
      sudo vi /etc/ssh/sshd_config
      # Set: PermitRootLogin no
      # Set: PasswordAuthentication no
      
      # Configure firewall
      sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port="1521" protocol="tcp" accept'
      sudo firewall-cmd --reload
      
      # Enable Oracle Native Network Encryption
      # Edit sqlnet.ora
      SQLNET.ENCRYPTION_SERVER = REQUIRED
      SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
      SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
      SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA384, SHA512)
      ```

1. 備份和復原策略：

   **實作全面的備份策略：**

   ```
   #!/bin/bash
   # rman_backup.sh - Daily incremental backup script
   
   export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
   export ORACLE_SID=ORCL
   export PATH=$ORACLE_HOME/bin:$PATH
   
   # Backup to local disk
   rman target / << EOF
   RUN {
       ALLOCATE CHANNEL ch1 DEVICE TYPE DISK FORMAT '/u01/app/oracle/backup/inc_%U';
       BACKUP INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG;
       DELETE NOPROMPT OBSOLETE;
       CROSSCHECK BACKUP;
       DELETE NOPROMPT EXPIRED BACKUP;
   }
   EXIT;
   EOF
   
   # Copy backups to S3
   aws s3 sync /u01/app/oracle/backup/ s3://my-oracle-backups/$(date +%Y%m%d)/ \
       --storage-class STANDARD_IA \
       --exclude "*" \
       --include "inc_*" \
       --include "arch_*"
   
   # Clean up local backups older than 7 days
   find /u01/app/oracle/backup/ -name "inc_*" -mtime +7 -delete
   find /u01/app/oracle/backup/ -name "arch_*" -mtime +7 -delete
   ```

   **使用 Cron 排程備份：**

   ```
   # Edit crontab
   crontab -e
   
   # Add backup schedule
   # Full backup on Sunday at 2 AM
   0 2 * * 0 /home/oracle/scripts/rman_full_backup.sh >> /home/oracle/logs/backup_full.log 2>&1
   
   # Incremental backup Monday-Saturday at 2 AM
   0 2 * * 1-6 /home/oracle/scripts/rman_incremental_backup.sh >> /home/oracle/logs/backup_inc.log 2>&1
   
   # Archive log backup every 4 hours
   0 */4 * * * /home/oracle/scripts/rman_archivelog_backup.sh >> /home/oracle/logs/backup_arch.log 2>&1
   ```

### 成本最佳化
<a name="RDS-Custom-for-Oracle-end-of-support-cost-optimization"></a>

 **1。適當調整大小：**

遷移後，監控和最佳化成本：
+ **使用 AWS Cost Explorer** 分析 EC2 和 EBS 成本
+ 針對執行個體類型建議**啟用 AWS Compute Optimizer** 
+ **檢閱 CloudWatch 指標**以識別未充分利用的資源
+ **針對可預測的工作負載考慮預留執行個體**或 Savings Plans 

 **2. 儲存最佳化：**
+ 實作 S3 備份的**生命週期政策** (30 天後移至 Glacier)
+ 定期**刪除未使用的 EBS 快照** 
+ **使用 gp3 而非 gp2**，以相同的效能節省成本
+ 遷移完成後**分離和刪除備份磁碟區** 

 **3. 自動化：**
+ 在非上班時間**自動啟動/停止**非生產資料庫
+ **使用 AWS Systems Manager** 進行修補程式管理
+ 如果使用 Data Guard，請實作僅供讀取複本的**自動擴展** 

## 結論
<a name="RDS-Custom-for-Oracle-end-of-support-conclusion"></a>

此方案指引提供詳細的遷移策略，將您的 Oracle 資料庫從 Amazon RDS Custom for Oracle 移至 Amazon EC2 上的自我管理 Oracle 資料庫。RDS Custom for Oracle 服務棄用自 2027 年 3 月 31 日開始生效，請務必事先規劃和執行遷移。

 **關鍵要點** 

 **遷移選項：**
+ **RMAN Active Duplication**：最適合大多數遷移，在複製期間保持來源資料庫上線，只需要短暫的切換時段進行應用程式重新導向
+ **Oracle Data Guard**：最適合需要接近零停機時間的任務關鍵工作負載，提供持續同步和內建切換功能

 **架構支援：**
+ 這兩個遷移選項都支援非 CDB （傳統單一執行個體） 和多租戶 (CDB 搭配 PDBs架構
+ 對於多租戶，這兩種方法都會自動處理整個 CDB，包括單一操作中的所有 PDBs 
+ PDBs遷移後需要手動開啟和自動開啟組態

 **關鍵成功因素：**
+ 來源和目標之間的適當網路組態和連線能力
+ 精確版本相容性 （主要版本、次要版本、版本更新和一次性修補程式）
+ 資料傳輸 (RMAN) 或重做運送 (Data Guard) 的適當網路頻寬
+ 了解 RMAN 主動重複保持來源上線 - 只需要短暫的切換
+ 在停用來源之前進行徹底的測試和驗證
+ 完整的遷移後任務，包括備份、監控和安全性組態

 **後續步驟：**

1. 評估您的資料庫架構 （非 CDB 或多租戶）

1. 根據您的停機時間公差和複雜性需求，選擇適當的遷移選項

1. 完成所有先決條件步驟，包括 EC2 執行個體設定和網路組態

1. 遵循所選選項的詳細遷移步驟

1. 執行徹底的驗證和測試

1. 完成遷移後任務，以確保生產準備

1. 驗證成功後停用 RDS Custom 執行個體

 **其他資源** 
+ [Amazon RDS Custom for Oracle 使用者指南](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom.html)
+ [Oracle 資料庫文件](https://docs.oracle.com/en/database/)
+ [Oracle RMAN 文件](https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/)
+ [Oracle Data Guard 文件](https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/)
+ [AWS 資料庫遷移服務](https://aws.amazon.com/dms/)
+ [AWS 方案指引](https://aws.amazon.com/prescriptive-guidance/)

 **支援** 

如需遷移的協助：
+ 透過 AWS 管理主控台聯絡 AWS Support
+ 有關資料庫特定問題，請諮詢 Oracle 支援

## **文件資訊**
<a name="RDS-Custom-for-Oracle-end-of-support-document-information"></a>

**上次更新時間：**2026 年 3 月

**貢獻者：**
+ Sharath Chandra Kampili，Amazon Web Services 資料庫專家解決方案架構師
+ Ibrahim Emara，Amazon Web Services 資料庫專家解決方案架構師
+ Vetrivel Subramani，Amazon Web Services 資料庫專家解決方案架構師