View a markdown version of this page

RDS Custom for Oracle 終止支援 - Amazon Relational Database Service

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

RDS Custom for Oracle 終止支援

注意

終止支援通知:2027 年 3 月 31 日, AWS 將終止對 Amazon RDS Custom for Oracle 的支援。2027 年 3 月 31 日之後,您將無法再存取 RDS Custom for Oracle 主控台或 RDS Custom for Oracle 資源。如需詳細資訊,請參閱RDS Custom for Oracle 終止支援。

概觀

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

關鍵時間限制

  • 從 2026 年 3 月 31 日至 2027 年 3 月 31 日:我們建議您從 RDS Custom for Oracle 遷移至在 EC2 上執行 Oracle。在此期間,您可以繼續使用 RDS Custom for Oracle 搭配現有的功能和支援。

  • 2027 年 3 月 31 日之後:您將無法再使用 RDS Custom for Oracle 服務。

目標受眾

本指南適用於:

  • 負責 Oracle 資料庫遷移的資料庫管理員

  • 雲端架構師規劃遷移策略

  • 管理資料庫基礎設施的 DevOps 工程師

  • 監督遷移程序的 IT 管理員

先決條件

開始前,請確保您具備以下條件:

  • 執行 Oracle 19c Enterprise Edition 的作用中 Amazon RDS Custom for Oracle 執行個體

  • 建立和管理 EC2 執行個體的適當 AWS Identity and Access Management (IAM) 許可

  • 了解您的資料庫架構 (非 CDB 或具有 PDBs)

  • 來源和目標執行個體之間的網路連線規劃

  • 遷移的備份和復原策略

遷移選項

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

選項 1:RMAN Active Duplication (線上/離線遷移)

最適合
  • 可在最終切換期間提供計劃停機時間的工作負載

  • 以較少的移動組件簡化遷移需求

  • 您想要直接進行一次性遷移的資料庫

  • 在切換前不需要持續同步的情況

重要特性
  • 停機時間:最終切換期間的最低停機時間 (重複期間資料庫保持線上狀態、最終切換的短暫停機時間)

  • 複雜性:使用直接資料庫複製降低複雜性

  • 持續時間:遷移時間取決於資料庫大小和網路頻寬

  • 備用:需要維護來源資料庫,直到驗證完成為止

  • 線上功能:來源資料庫在重複過程中保持線上狀態並可存取

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

選項 2:Oracle Data Guard (線上遷移)

最適合
  • 需要最少停機時間的生產工作負載

  • 必須保持可用的任務關鍵資料庫

  • 在切換之前需要持續同步的情況

  • 需要內建備用功能的遷移

重要特性
  • 停機時間:接近零停機時間 (切換的秒到分鐘)

  • 複雜性:使用 Data Guard 組態提高複雜性

  • 持續時間:初始設定時間加上持續同步,直到切換

  • 備用:透過將來源保持為待命狀態來內建備用功能

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

決策矩陣

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

Aspect

RMAN 作用中複製

Oracle Data Guard

來源資料庫可用性

複製期間上線 在整個程序期間上線

可接受的停機時間

分鐘到小時 (最終切換) 秒到分鐘 (切換)

遷移複雜性

較低 較高

持續同步

備用功能

手動 (保留來源) 內建 (自動)

切換前測試

有限 可進行完整測試

網路頻寬需求

重複期間高 中等 (連續)

最適合

大多數遷移、開發/測試、計劃切換 生產、關鍵任務、幾近零的停機時間

架構考量

兩個遷移選項都支援兩種 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

複雜性

較低 由於多個容器而更高

兩個遷移選項的常見先決條件

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

  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 用於高效能工作負載。

  2. 設定儲存架構

    1. 檔案系統儲存 (建議大多數案例使用)

      • 使用 Oracle 資料檔案的標準檔案系統目錄

      • 更輕鬆地管理和適用於大多數工作負載

      • 本指南使用檔案系統儲存範例

    2. Oracle 自動儲存管理 (ASM)

      • 如果您的工作負載需要 ASM,請在 EC2 執行個體上安裝和設定獨立 ASM

      • 相應地調整 init 檔案中的所有路徑參數,以使用 ASM 磁碟群組 (例如 +DATA、+FRA)

      • ASM 的遷移程序類似,具有路徑調整

  3. 設定檔案傳輸機制

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

    1. 選項 A:Amazon S3 (建議大多數案例使用)

      • 建立 Amazon S3 儲存貯體或使用現有的儲存貯體

      • 在兩個執行個體上安裝和設定 AWS CLI

      • 如需說明,請參閱 入門 AWS CLI

    2. 選項 B:直接 SCP/SFTP

      • 如果在執行個體之間開啟 SSH 連接埠,您可以直接傳輸檔案

      • 適合參數檔案和密碼檔案等小型檔案

    3. 選項 C:Amazon EFS

      • 如果您已在兩個執行個體上掛載 Amazon EFS,則可以將其用作共用檔案系統

      • 適用於具有現有 EFS 基礎設施的環境

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

  4. 設定網路連線

    確保 RDS Custom 和 EC2 執行個體之間的網路連線:

    • 相同的 VPC:安全群組必須允許 Oracle 接聽程式連接埠上的雙向流量 (預設 1521,或您的自訂連接埠)

    • 不同的 VPCs(相同帳戶):設定 VPC 對等互連並設定路由表和安全群組

    • 不同的帳戶:設定跨帳戶的 VPC 對等互連或使用 AWS Transit Gateway

    • 驗證連線:使用 ping 和 telnet 測試資料庫連接埠上的連線

  5. 在 EC2 上建立目錄結構

    目錄結構取決於您的資料庫架構:

    範例對於非 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
    範例對於多租戶 (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 磁碟區,以便在遷移完成後輕鬆分離和移除它,從而釋放儲存成本。

  6. 驗證來源資料庫組態

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

  1. 以 rdsdb 使用者身分登入 RDS Custom 資料庫主機,並設定環境:

    範例
    # 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
  2. 連線至資料庫並檢查架構:

    範例
    sqlplus / as sysdba SQL> SELECT name, cdb, open_mode, log_mode FROM v$database;
    範例對於非 CDB,預期輸出
    NAME CDB OPEN_MODE LOG_MODE --------- --- -------------------- ------------ ORCL NO READ WRITE ARCHIVELOG
    範例對於多租戶 (CDB),預期的輸出:
    NAME CDB OPEN_MODE LOG_MODE --------- --- -------------------- ------------ RDSCDB YES READ WRITE ARCHIVELOG
  3. 如果您有多租戶 CDB,請列出所有 PDBs及其狀態:

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

    預期的輸出 (1 個 PDB 名為 ORCLDB 的範例):

    範例
    CON_ID NAME OPEN_MODE RES ---------- ------------------------------ ---------- --- 2 PDB$SEED READ ONLY NO 3 ORCLDB READ WRITE NO
  4. 檢查總資料庫大小:

    範例對於非 CDB:
    SQL> SELECT SUM(bytes)/1024/1024/1024 AS total_size_gb FROM dba_data_files;
    範例對於多租戶:
    -- 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 進行實體遷移

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

何時使用 RMAN 作用中重複

在下列情況下,選擇 RMAN 作用中重複:

  • 您想要讓來源資料庫保持連線,並在遷移期間存取

  • 您可以為最終應用程式重新導向提供短暫的切換時段

  • 您想要具有較少移動組件的直接遷移程序

  • 您的資料庫大小和網路頻寬允許合理的重複時間

  • 在切換之前,您不需要持續同步

  • 您正在遷移生產、開發或測試資料庫

RMAN 作用中重複概觀

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

主要優點:
  • 來源保持連線:應用程式可以在重複期間繼續存取來源資料庫

  • 不需要備份:不需要中繼備份儲存

  • 直接網路傳輸:資料庫檔案直接從來源複製到目標

  • 自動一致性:RMAN 確保重複的資料庫一致

  • 單一操作:對於多租戶, 會在單一操作中複製整個 CDB,包括所有 PDBs

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

典型時間軸
  1. 複製階段 (來源保持連線):30 分鐘至數小時,視資料庫大小而定

  2. 驗證階段 (來源保持線上狀態):視需要花費數小時至數天

  3. 切換階段 (短暫停機時間):將應用程式重新導向至 EC2 的分鐘數

RMAN 作用中複製的遷移工作流程

RDS Custom 資料庫執行個體 (來源) 步驟:
  1. 暫停 Amazon RDS Custom 自動化

  2. 驗證資料庫架構 (非 CDB 或具有 PDBs)

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

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

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

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

EC2 資料庫執行個體 (目標) 步驟:
  1. 編輯 EC2 的參數檔案 (架構特定)

  2. 在 EC2 上設定 tnsnames.ora

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

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

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

RMAN 重複步驟:
  1. 執行 RMAN 作用中重複

  2. 開啟資料庫 (以及多租戶PDBs)

  3. 設定 PDB 自動開啟 (僅限多租戶)

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

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

  6. 在來源上繼續 Amazon RDS Custom 自動化 (如果保持作用中狀態)

步驟 1:暫停 Amazon RDS Custom 自動化

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

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

範例
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'

驗證自動化狀態:

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

預期輸出:"all-paused"

步驟 2:建立密碼和參數檔案

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

範例
# 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

產生的參數檔案將包含 RDS Custom 特定的路徑和參數。對於多租戶,關鍵參數包括:

  • enable_pluggable_database=TRUE (對多租戶至關重要)

  • noncdb_compatible=TRUE (用於回溯相容性)

  • CDB$ROOTPDB$SEED和所有 PDBs 的資料檔案路徑

  • db_create_file_dest 適用於 OMF db_create_online_log_dest_1的 和

步驟 3:將檔案傳輸至 EC2

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

使用 Amazon S3:

使用 Amazon S3:

範例對於非 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/
範例對於多租戶
# 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 上的檔案:

範例
ls -l $ORACLE_HOME/dbs/initORCL.ora ls -l $ORACLE_HOME/dbs/orapwORCL

步驟 4:在 EC2 上編輯參數檔案

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

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

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

  2. 將 RDS Custom 路徑轉換為 EC2 路徑:將 /rdsdbdata/ 取代為 /u01/app/oracle/

  3. 移除 RDS Custom 特定參數
    • dg_broker_config_file1dg_broker_config_file2(如果有 - 表示存在複本)

    • standby_file_management (如果有)

    • spfile (稍後我們將建立新的 SPFILE)

    • 指向待命目的地的任何log_archive_dest參數 (僅保留log_archive_dest_1供本機封存)

  4. 新增檔案名稱轉換參數 (請參閱下文)

  5. 根據您的 EC2 執行個體大小調整記憶體參數 (選用但建議)

了解檔案名稱轉換參數:

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

關鍵考量事項:
  • 每個參數都接受字串對:來源路徑後面接著目標路徑

  • 可以在單一參數中指定多個配對

  • 對於多租戶,您必須映射 CDB$ROOTPDB$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 診斷目的地

新增轉換參數:

範例非 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/'
範例多租戶 (必須包含 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 資料檔案 - 路徑映射會自動處理。

完成範例參數檔案:

範例範例非 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/'
範例多租戶參數檔案範例 (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_targetmemory_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 和接聽程式

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

範例非 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)))
範例多租戶:
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)))
範例在 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)))
範例啟動接聽程式:
lsnrctl start
注意

對於 RMAN 作用中重複,TNS 項目會使用 SID (非 SERVICE_NAME) 連線至資料庫執行個體。對於多租戶,這會連接到 CDB,而 RMAN 會自動複製所有 PDBs。

步驟 6:在 EC2 NOMOUNT 的 中啟動資料庫

範例
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';
範例驗證參數:
SQL> SHOW PARAMETER db_name SQL> SHOW PARAMETER control_files SQL> SHOW PARAMETER enable_pluggable_database -- For multitenant

步驟 7:執行 RMAN 作用中重複

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

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

範例
rman target sys/<password>@DB_SOURCE auxiliary sys/<password>@DB_TARGET
範例非 CDB 的預期輸出:
Recovery Manager: Release 19.0.0.0.0 - Production connected to target database: ORCL (DBID=4089929259) connected to auxiliary database: ORCL (not mounted)
範例多租戶的預期輸出:
Recovery Manager: Release 19.0.0.0.0 - Production connected to target database: RDSCDB (DBID=4089929259) connected to auxiliary database: ORCL (not mounted)
範例執行作用中的重複命令:
RMAN> DUPLICATE DATABASE TO 'ORCL' FROM ACTIVE DATABASE NOFILENAMECHECK;
注意
  • 來源保持線上狀態:來源資料庫會在重複期間繼續為應用程式請求提供服務

  • 對於非 CDB:這會複製整個資料庫,同時保持線上狀態

  • 對於多租戶:這會在來源保持線上時,在單一操作中複製整個 CDBCDB$ROOT,包括 PDB$SEED、 和所有 PDBs

  • NOFILENAMECHECK:允許 RMAN 繼續進行,即使來源和目標之間的檔案名稱不同

  • 持續時間:取決於資料庫大小和網路頻寬。對於 100GB 資料庫,預期 30-60 分鐘

  • 網路影響:重複期間高網路頻寬使用量,但來源資料庫仍可存取

RMAN 作用中重複程序包含數個階段:
  1. 連線至來源和目標資料庫

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

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

  4. 掛載目標資料庫

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

  6. 復原目標資料庫

  7. 使用 開啟目標資料庫 RESETLOGS

在重複期間,來源資料庫:
  • 保持 READ WRITE 模式

  • 繼續接受連線

  • 正常處理交易

  • 正常產生重做日誌

  • 應用程式可完全存取

範例監控另一個工作階段的進度:
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
    範例輸出範例:
    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
  2. 監控長時間執行的操作:

    範例在目標 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:到目前為止經過的時間

  3. 監控 RMAN 頻道:

    範例
    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;
  4. 檢查提醒日誌:

    範例在目標 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(僅限多租戶)

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 物件

由於這是 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:
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:設定自動啟動

建立 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:最終驗證

範例非 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';
範例多租戶:
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 進行實體遷移

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

何時使用 Oracle Data Guard

在下列情況下選擇 Oracle Data Guard:
  • 您需要最短的停機時間 (切換需要幾秒到幾分鐘)

  • 您正在遷移生產或關鍵任務資料庫

  • 您需要在切換前持續同步

  • 您想要內建的備用功能

  • 您需要先測試目標資料庫,才能進行遷移

Oracle Data Guard 概觀

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

Oracle Data Guard 的遷移工作流程

RDS Custom 資料庫執行個體 (主要) 步驟:
  1. 暫停 Amazon RDS Custom 自動化

  2. 驗證資料庫架構 (非 CDB 或具有 PDBs)

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

  4. 建立密碼檔案

  5. 執行主要資料庫的 RMAN 線上備份 (或使用作用中的重複)

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

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

EC2 資料庫執行個體 (待命) 步驟:
  1. 將所有檔案從來源複製到 EC2 執行個體

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

  3. 編輯 EC2 的參數檔案 (架構特定)

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

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

Data Guard 組態步驟:
  1. 在兩個執行個體上設定 Oracle 接聽程式

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

  3. 在兩個執行個體上啟動 Oracle Data Guard 代理程式 (選用但建議)

  4. 啟用 Oracle Data Guard 組態

  5. 在 EC2 待命執行個體上設定 fal_server 和 fal_client

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

  7. 復原待命執行個體

  8. 執行手動切換

  9. 開啟資料庫 (以及多租戶PDBs)

  10. 設定 PDB 自動開啟 (僅限多租戶)

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

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

步驟 1:暫停 Amazon RDS Custom 自動化

在 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

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:建立密碼和參數檔案

使用 建立密碼檔案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:RMAN 線上備份 (建議大多數案例使用)

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

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:作用中重複 (替代方法)

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

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

本指南著重於選項 A (備份型),但選項 B 是有效的替代方案。

步驟 5:將檔案傳輸至 EC2

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

使用 Amazon S3:

範例對於非 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/
範例對於多租戶:
# 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 上編輯參數檔案

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

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

  2. 將 db_unique_name:從 ORCL_A(或 RDSCDB_A) 變更為 ORCL_B

  3. 將 RDS Custom 路徑轉換為 EC2 路徑/rdsdbdata/以 取代 /u01/app/oracle/

  4. 移除 RDS Custom 特定參數
    • dg_broker_config_file1dg_broker_config_file2(如果有)

    • standby_file_management (如果有)

    • spfile (稍後我們會建立新的 SPFILE )

    • 指向待命目的地的任何log_archive_dest參數

  5. 根據您的 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和還原待命資料庫

啟動執行個體並建立 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 和接聽程式

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

範例非 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)))
範例多租戶:
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

範例對於非 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>)))
範例對於多租戶:
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 接聽程式可提供更好的隔離。

重要

如果 tnspinglistener 連線失敗,請檢查 EC2 上的iptables規則。許多 EC2 Linux 執行個體都有預設iptables規則來封鎖連接埠 1521。新增規則: sudo iptables -I INPUT 5 -p tcp --dport 1521 -j ACCEPT

步驟 9:啟用 Data Guard 代理程式和組態

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

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

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

dgmgrl /
範例對於非 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;

範例對於多租戶:
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;

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

範例對於非 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;

範例對於多租戶:
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:設定待命重做日誌並開始復原

在 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 參數:

範例對於非 CDB:
SQL> alter system set fal_server = 'ORCL_A'; SQL> alter system set fal_client = 'ORCL_B';

範例對於多租戶:
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/秒)

    • 已收到重做:待命接收到的重做總數

    • 已套用重做:待命套用的重做總數

  2. 監控封存日誌運送:

    在主要 (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;
  3. 監控受管復原程序:

    -- 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;
  4. 監控多租戶的重做套用率:

    對於多租戶資料庫,請監控每個 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;
  5. 監控待命重做日誌:

    -- 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';
  6. 估計同步完成:

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

    -- 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 同步問題:

問題 1:高套用延遲

徵狀:

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:封存日誌間隙

徵狀:

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:重做傳輸失敗

徵狀:

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:未套用重做的受管復原

徵狀:

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:執行切換

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

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

範例對於非 CDB:
DGMGRL> VALIDATE DATABASE ORCL_A; DGMGRL> VALIDATE DATABASE ORCL_B;

範例對於多租戶:
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(僅限多租戶)

切換後,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 自動開啟 (僅限多租戶)

設定 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 物件

由於現在這是 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:設定自動啟動

確認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

將 的行ORCLN變更為 Y

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

步驟 16:最終驗證

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

範例對於非 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;
範例對於多租戶:
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:清除備份檔案

成功驗證後,如果使用單獨的 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 自動化

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

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

排解常見問題

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

ORA-09925:無法建立稽核追蹤檔案

原因: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目的地字串

原因: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:無法初始化時區資訊

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

解決方案

  1. 檢查時區版本:

    SELECT * FROM v$timezone_file; SELECT PROPERTY_NAME, PROPERTY_VALUE FROM database_properties WHERE PROPERTY_NAME LIKE '%DST%';
  2. 作為解決方法,請設定時區檔案環境變數,以符合您的 $ORACLE_HOME 可用項目:

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

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

  3. 重試捨棄:

    sqlplus / as sysdba SQL> DROP USER RDSADMIN CASCADE;

跨 RU 遷移問題 (不同的版本更新)

原因:目標 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;
  2. 驗證 $ORACLE_HOME 修補程式層級:

    # On both instances $ORACLE_HOME/OPatch/opatch lsinventory
  3. 如果版本不相符,請在遷移之前視需要套用或轉返修補程式來對齊這些版本。

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

    cd $ORACLE_HOME/OPatch ./datapatch -verbose
  5. 檢查無效物件並重新編譯:

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

網路連線問題

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

解決方案

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

  2. 檢查 EC2 上的 iptables:

    sudo iptables -L INPUT -n -v
  3. 視需要新增規則:

    # 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
  4. 測試連線:

    telnet <EC2_instance_IP> 1521 tnsping DB_SOURCE tnsping DB_TARGET

遷移後未開啟 PDBs(僅限多租戶)

原因:這是預期的行為。在 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 資料檔案或路徑不符 (僅限多租戶)

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

解決方案

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

    SQL> SELECT name, status FROM v$datafile WHERE status != 'ONLINE';
  2. 如果檔案放置在錯誤目錄中,請在控制檔案中重新命名它們:

    SQL> ALTER DATABASE RENAME FILE '/wrong/path/datafile.dbf' TO '/correct/path/datafile.dbf';
  3. 若要避免這種情況,在設定參數檔案SELECT con_id, name FROM v$datafile ORDER BY con_id;之前,請務必使用 驗證來源資料檔案路徑。

PDB 服務未向接聽程式註冊 (僅限多租戶)

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

解決方案

  1. 強制服務註冊:

    SQL> ALTER SYSTEM REGISTER;
  2. 如果服務仍未顯示,請檢查 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;
  3. 使用 進行驗證:

    lsnrctl services

PDBs (僅限多租戶)

原因:未設定 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 重做傳輸無法運作

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

解決方案

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

    SQL> SELECT status FROM v$instance;
  2. 檢查待命上的 fal_server 和 fal_client 是否正確設定:

    SQL> SHOW PARAMETER fal_server SQL> SHOW PARAMETER fal_client
  3. 驗證網路連線:

    tnsping ORCL_A # or RDSCDB_A for multitenant
  4. 檢查待命主要點上的 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');
  2. 考慮增加重複的平行處理 (需要 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;
  3. 確認待命執行個體上沒有資源限制 (CPU、I/O)。

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

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

解決方案

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

    RMAN> CROSSCHECK ARCHIVELOG ALL; RMAN> DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
  2. 僅重新執行封存日誌備份:

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

一般使用者捨棄在多租用戶中失敗 (僅限多租用戶)

原因:常用使用者 (字首為 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;

遷移後任務

遷移成功後,請完成這些額外任務,以確保 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 用於 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
  2. 記錄遷移:使用新的 EC2 組態更新 Runbook 和文件

  3. 刪除 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
  4. 清除資源:如果不再需要,請移除相關聯的快照、參數群組和選項群組

  5. 更新文件:確保所有操作文件反映新的 EC2-based

比較:RMAN Active Duplication 與 Oracle Data Guard

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

Aspect

RMAN 作用中複製

Oracle Data Guard

來源資料庫可用性

在整個重複期間上線 在整個程序期間上線

停機時間

分鐘 (僅限最終切換) 秒到分鐘 (切換)

複雜性

較低 較高

遷移持續時間

單一重複操作 初始設定 + 持續同步

持續同步

備用功能

手動 (保持來源執行) 內建 (自動)

切換前測試

有限 (重複後測試) 可進行完整測試 (可測試待命)

網路頻寬

重複期間高 中等 (連續)

來源資料庫影響

最小 (讀取操作) 最小 (重做運送)

最適合

大多數遷移、直接的切換 關鍵任務,需要幾近零的停機時間

非 CDB 支援

多租戶支援

是 (整個 CDB) 是 (整個 CDB)

遷移後 PDB 狀態

CDB 開啟,PDBs已掛載 CDB 開啟,PDBs已掛載

需要 RMAN

是 (用於以備份為基礎的方法進行初始備份)

需要 Data Guard

需要技能層級

中級 Advanced (進階)

切換程序

將應用程式重新導向至 EC2 切換命令 + 重新導向應用程式

比較:非 CDB 與多租戶遷移

下表摘要說明遷移非 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 路徑,複雜性更高

最佳實務與建議

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

遷移前規劃

  1. 進行徹底的評估:

    開始遷移之前,請執行環境的全面評估:

    • 資料庫清查:記錄所有資料庫、其大小、架構 (非 CDB 與多租戶) 和相依性

    • 應用程式相依性:識別連線至資料庫的所有應用程式及其連線方法

    • 效能基準:擷取效能指標 (CPU、記憶體、I/O、網路) 以進行遷移後比較

    • 備份和復原需求:文件 RPO (復原點目標) 和 RTO (復原時間目標)

    • 合規要求:識別可能影響遷移的任何法規或合規要求

  2. 選擇正確的 EC2 執行個體類型:

    根據您的工作負載特性選取 EC2 執行個體類型:

    工作負載類型

    建議的執行個體系列

    關鍵特性

    一般用途 OLTP M6i、M6a、M7i 平衡運算、記憶體和網路
    記憶體密集型 R6i、R6a、R7i、X2idn 高memory-to-CPU比率
    運算密集 C6i、C6a、C7i 高 CPU 效能
    I/O 密集型 I4i、Im4gn 高本機 NVMe SSD 儲存體
    混合工作負載 M5、M5a、M5n 經濟實惠的平衡效能

    執行個體大小調整準則:

    • 從與 RDS Custom 執行個體相同的執行個體類別開始

    • 在測試遷移期間監控資源使用率

    • 考慮使用 AWS Compute Optimizer 進行建議

    • 規劃 20-30% 的成長和尖峰負載空間

  3. 設計您的儲存架構:

    EBS 磁碟區類型:

    磁碟區類型

    使用案例

    效能

    成本

    gp3 一般用途,大多數工作負載 高達 16,000 IOPS、1,000 MB/s
    io2 Block Express 關鍵任務、高效能 高達 256,000 IOPS、4,000 MB/s
    Io1 高效能資料庫 高達 64,000 IOPS、1,000 MB/s 中高
    gp2 傳統一般用途 高達 16,000 IOPS

    儲存體配置建議:

    # 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 配置

    • 更輕鬆的容量管理

    • 簡化的備份和快照策略

    • 更好的效能隔離

  4. 建立復原計劃:

    一律有復原策略:

    • 在驗證期間保持執行 RDS Custom 執行個體 (建議 1-2 週)

    • 維護來源和目標的定期備份

    • 文件轉返程序,包括連線字串變更

    • 在非生產環境中測試轉返程序

    • 定義復原條件 (效能降級、資料不一致、應用程式錯誤)

遷移執行最佳實務

  1. 遷移的時間:

    選擇最佳時段:

    • 低流量時段:週末、假日或離峰時間

    • 維護時段:盡可能與排定的維護保持一致

    • 避免月末/季末:這些期間通常具有較高的交易量

    • 考慮時區:針對全域應用程式,選擇可將跨區域影響降至最低的時間

  2. 通訊計劃:

    建立明確的溝通:

    • 利益相關者通知:至少提前 2 週通知所有利益相關者

    • 應用程式團隊:與應用程式團隊協調連線字串更新

    • 狀態更新:在遷移期間提供定期更新

    • 呈報路徑:定義問題的明確呈報程序

    • 遷移後通訊:確認成功完成和任何後續動作

  3. 驗證檢查點:

    在每個階段實作驗證:

    遷移前驗證:

    -- 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;
  4. 效能驗證:

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

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

    要比較的關鍵指標:

    • 平均作用中工作階段

    • 每筆交易的資料庫時間

    • 每秒實體讀取數

    • 每秒邏輯讀取數

    • 每秒重做大小

    • 每秒的使用者呼叫數

    • 每次執行的剖析時間

遷移後最佳化

  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;
    2. 儲存最佳化:

      啟用壓縮:

      -- 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) );
    3. 實作監控和提醒:

      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
    4. 安全性強化:

      資料庫安全性:

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

成本最佳化

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,請實作僅供讀取複本的自動擴展

結論

此方案指引提供詳細的遷移策略,將您的 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 或多租戶)

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

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

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

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

  6. 完成遷移後任務,以確保生產準備

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

其他資源

支援

如需遷移的協助:

  • 透過 AWS 管理主控台聯絡 AWS Support

  • 有關資料庫特定問題,請諮詢 Oracle 支援

文件資訊

上次更新時間:2026 年 3 月

貢獻者:
  • Sharath Chandra Kampili,Amazon Web Services 資料庫專家解決方案架構師

  • Ibrahim Emara,Amazon Web Services 資料庫專家解決方案架構師

  • Vetrivel Subramani,Amazon Web Services 資料庫專家解決方案架構師