本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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 |
|
複雜性 |
較低 | 由於多個容器而更高 |
兩個遷移選項的常見先決條件
在開始任一個遷移選項之前,請完成下列先決條件步驟:
-
啟動和設定 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 用於高效能工作負載。
-
-
設定儲存架構
-
檔案系統儲存 (建議大多數案例使用)
-
使用 Oracle 資料檔案的標準檔案系統目錄
-
更輕鬆地管理和適用於大多數工作負載
-
本指南使用檔案系統儲存範例
-
-
Oracle 自動儲存管理 (ASM)
-
如果您的工作負載需要 ASM,請在 EC2 執行個體上安裝和設定獨立 ASM
-
相應地調整 init 檔案中的所有路徑參數,以使用 ASM 磁碟群組 (例如 +DATA、+FRA)
-
ASM 的遷移程序類似,具有路徑調整
-
-
-
設定檔案傳輸機制
建立在 RDS Custom 和 EC2 執行個體之間傳輸檔案的機制。您有多種選擇:
-
選項 A:Amazon S3 (建議大多數案例使用)
-
建立 Amazon S3 儲存貯體或使用現有的儲存貯體
-
在兩個執行個體上安裝和設定 AWS CLI
-
如需說明,請參閱 入門 AWS CLI。
-
-
選項 B:直接 SCP/SFTP
-
如果在執行個體之間開啟 SSH 連接埠,您可以直接傳輸檔案
-
適合參數檔案和密碼檔案等小型檔案
-
-
選項 C:Amazon EFS
-
如果您已在兩個執行個體上掛載 Amazon EFS,則可以將其用作共用檔案系統
-
適用於具有現有 EFS 基礎設施的環境
本指南使用 Amazon S3 做為範例,但您可以調整所選方法的命令。
-
-
-
設定網路連線
確保 RDS Custom 和 EC2 執行個體之間的網路連線:
-
相同的 VPC:安全群組必須允許 Oracle 接聽程式連接埠上的雙向流量 (預設 1521,或您的自訂連接埠)
-
不同的 VPCs(相同帳戶):設定 VPC 對等互連並設定路由表和安全群組
-
不同的帳戶:設定跨帳戶的 VPC 對等互連或使用 AWS Transit Gateway
-
驗證連線:使用 ping 和 telnet 測試資料庫連接埠上的連線
-
-
在 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/) 的 PDB 資料檔案。遷移程序會自動在目標上建立必要的子目錄結構。您只需要建立父目錄。{GUID}/datafile/儲存策略:考慮為 /u01/app/oracle/backup 使用單獨的 EBS 磁碟區,以便在遷移完成後輕鬆分離和移除它,從而釋放儲存成本。
-
驗證來源資料庫組態
開始遷移之前,請確認您的來源資料庫組態:
-
以 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 -
連線至資料庫並檢查架構:
範例
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 -
如果您有多租戶 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 -
檢查總資料庫大小:
範例對於非 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
複製程序會在目標上建立來源資料庫的確切複本,包括所有資料檔案、控制檔案和重做日誌。來源資料庫會在整個重複過程中繼續為應用程式請求提供服務。結束時只需要短暫的切換時段,將應用程式從來源重新導向至目標。
典型時間軸
-
複製階段 (來源保持連線):30 分鐘至數小時,視資料庫大小而定
-
驗證階段 (來源保持線上狀態):視需要花費數小時至數天
-
切換階段 (短暫停機時間):將應用程式重新導向至 EC2 的分鐘數
RMAN 作用中複製的遷移工作流程
RDS Custom 資料庫執行個體 (來源) 步驟:
-
暫停 Amazon RDS Custom 自動化
-
驗證資料庫架構 (非 CDB 或具有 PDBs)
-
從來源資料庫建立密碼檔案和參數檔案
-
將密碼檔案和參數檔案複製到目標 EC2 執行個體
-
驗證來源資料庫是否以封存日誌模式執行
-
在 RDS Custom 資料庫伺服器上設定 tnsnames.ora
EC2 資料庫執行個體 (目標) 步驟:
-
編輯 EC2 的參數檔案 (架構特定)
-
在 EC2 上設定 tnsnames.ora
-
設定 EC2 執行個體的環境
-
在 EC2 上設定 Oracle 接聽程式
-
在處於 NOMOUNT 狀態的 EC2 上啟動資料庫
RMAN 重複步驟:
-
執行 RMAN 作用中重複
-
開啟資料庫 (以及多租戶PDBs)
-
設定 PDB 自動開啟 (僅限多租戶)
-
移除 RDS Custom 特定使用者和物件
-
建立 SPFILE 並設定自動啟動
-
在來源上繼續 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$ROOT、PDB$SEED和所有 PDBs 的資料檔案路徑 -
db_create_file_dest適用於 OMFdb_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上編輯 ,並進行下列重要變更:
-
更新資料庫名稱:針對多租戶,請將所有出現的 RDSCDB 變更為 ORCL
-
將 RDS Custom 路徑轉換為 EC2 路徑:將 /rdsdbdata/ 取代為 /u01/app/oracle/
-
移除 RDS Custom 特定參數
-
dg_broker_config_file1和dg_broker_config_file2(如果有 - 表示存在複本) -
standby_file_management(如果有) -
spfile(稍後我們將建立新的 SPFILE) -
指向待命目的地的任何
log_archive_dest參數 (僅保留log_archive_dest_1供本機封存)
-
-
新增檔案名稱轉換參數 (請參閱下文)
-
根據您的 EC2 執行個體大小調整記憶體參數 (選用但建議)
了解檔案名稱轉換參數:
DB_FILE_NAME_CONVERT 和 LOG_FILE_NAME_CONVERT 參數對於 RMAN 複製至關重要。它們告訴 RMAN 如何在重複過程中將來源檔案路徑映射至目標檔案路徑。如果沒有這些參數,RMAN 將嘗試在與來源相同的路徑中建立檔案,這會在 EC2 上失敗。
關鍵考量事項:
-
每個參數都接受字串對:來源路徑後面接著目標路徑
-
可以在單一參數中指定多個配對
-
對於多租戶,您必須映射
CDB$ROOT、PDB$SEED和所有 PDBs路徑 -
配對的順序很重要 - RMAN 依指定的順序處理它們
-
路徑區分大小寫,且必須完全相符
路徑映射:
|
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_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 和接聽程式
在這兩個執行個體上,將 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:這會複製整個資料庫,同時保持線上狀態
-
對於多租戶:這會在來源保持線上時,在單一操作中複製整個 CDB
CDB$ROOT,包括PDB$SEED、 和所有 PDBs -
NOFILENAMECHECK:允許 RMAN 繼續進行,即使來源和目標之間的檔案名稱不同
-
持續時間:取決於資料庫大小和網路頻寬。對於 100GB 資料庫,預期 30-60 分鐘
-
網路影響:重複期間高網路頻寬使用量,但來源資料庫仍可存取
RMAN 作用中重複程序包含數個階段:
-
連線至來源和目標資料庫
-
SPFILE從目標上的記憶體建立 -
將控制檔案還原至目標
-
掛載目標資料庫
-
透過網路將所有資料檔案從來源複製到目標 (來源保持線上狀態)
-
復原目標資料庫
-
使用 開啟目標資料庫
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 重複執行時,您可以使用數種方法來監控其進度:
-
監控 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 -
-
監控長時間執行的操作:
範例在目標 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:到目前為止經過的時間
-
-
監控 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; -
檢查提醒日誌:
範例在目標 EC2 執行個體上,監控警示日誌是否有任何錯誤或警告:
tail -f $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.logRMAN 複製期間的常見問題:
-
網路逾時
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 資料庫執行個體 (主要) 步驟:
-
暫停 Amazon RDS Custom 自動化
-
驗證資料庫架構 (非 CDB 或具有 PDBs)
-
確認主要資料庫正在封存日誌模式下執行,並
FORCE_LOGGING已啟用 -
建立密碼檔案
-
執行主要資料庫的 RMAN 線上備份 (或使用作用中的重複)
-
從來源資料庫建立參數檔案
-
將備份集、參數檔案和密碼檔案複製到目標 EC2 執行個體
EC2 資料庫執行個體 (待命) 步驟:
-
將所有檔案從來源複製到 EC2 執行個體
-
將密碼檔案複製到 EC2 執行個體
-
編輯 EC2 的參數檔案 (架構特定)
-
從參數檔案建立伺服器參數檔案
-
還原待命控制檔案和資料庫
Data Guard 組態步驟:
-
在兩個執行個體上設定 Oracle 接聽程式
-
在兩個執行個體上設定 tnsnames.ora
-
在兩個執行個體上啟動 Oracle Data Guard 代理程式 (選用但建議)
-
啟用 Oracle Data Guard 組態
-
在 EC2 待命執行個體上設定 fal_server 和 fal_client
-
在兩個執行個體上設定待命重做日誌檔案
-
復原待命執行個體
-
執行手動切換
-
開啟資料庫 (以及多租戶PDBs)
-
設定 PDB 自動開啟 (僅限多租戶)
-
移除 RDS Custom 特定使用者和物件
-
建立 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上編輯 ,並進行下列重要變更:
-
更新資料庫名稱:對於多租戶,
RDSCDB將 的所有出現變更為ORCL -
將 db_unique_name:從
ORCL_A(或RDSCDB_A) 變更為ORCL_B -
將 RDS Custom 路徑轉換為 EC2 路徑:
/rdsdbdata/以 取代/u01/app/oracle/ -
移除 RDS Custom 特定參數
-
dg_broker_config_file1和dg_broker_config_file2(如果有) -
standby_file_management(如果有) -
spfile(稍後我們會建立新的SPFILE) -
指向待命目的地的任何
log_archive_dest參數
-
-
根據您的 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 接聽程式可提供更好的隔離。
重要
如果 tnsping或 listener 連線失敗,請檢查 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 對確保成功遷移至關重要。以下是全方位的監控技術:
-
監控 Data Guard 統計資料:
-- Comprehensive Data Guard statistics SQL> SELECT name, value, unit, time_computed, datum_time FROM v$dataguard_stats ORDER BY name;要監控的關鍵指標:
-
傳輸延遲:在主要 上產生重做和待命時收到重做之間的時間差異
-
套用延遲:產生重做並在待命時套用之間的時間差異
-
套用率:套用重做的速率 (MB/秒)
-
已收到重做:待命接收到的重做總數
-
已套用重做:待命套用的重做總數
-
-
監控封存日誌運送:
在主要 (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; -
監控受管復原程序:
-- 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; -
監控多租戶的重做套用率:
對於多租戶資料庫,請監控每個 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; -
監控待命重做日誌:
-- 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'; -
估計同步完成:
根據套用率計算剩餘時間:
-- 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
將 的行ORCL從 N變更為 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使用者時可能會發生此錯誤。
解決方案:
-
檢查時區版本:
SELECT * FROM v$timezone_file; SELECT PROPERTY_NAME, PROPERTY_VALUE FROM database_properties WHERE PROPERTY_NAME LIKE '%DST%'; -
作為解決方法,請設定時區檔案環境變數,以符合您的 $ORACLE_HOME 可用項目:
ls $ORACLE_HOME/oracore/zoneinfo/timezlrg_*.dat export ORA_TZFILE=$ORACLE_HOME/oracore/zoneinfo/timezone_40.dat調整數字以符合安裝中可用的版本。
-
重試捨棄:
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 版本和一次性修補程式:
-
檢查來源和目標的確切 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; -
驗證 $ORACLE_HOME 修補程式層級:
# On both instances $ORACLE_HOME/OPatch/opatch lsinventory -
如果版本不相符,請在遷移之前視需要套用或轉返修補程式來對齊這些版本。
-
如果您必須繼續進行不相符RUs,請在遷移後執行資料修補程式:
cd $ORACLE_HOME/OPatch ./datapatch -verbose -
檢查無效物件並重新編譯:
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 接聽程式連接埠。
解決方案:
-
驗證安全群組允許連接埠雙向
-
檢查 EC2 上的 iptables:
sudo iptables -L INPUT -n -v -
視需要新增規則:
# 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 -
測試連線:
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 資料檔案。
解決方案:
-
檢查缺少哪些資料檔案:
SQL> SELECT name, status FROM v$datafile WHERE status != 'ONLINE'; -
如果檔案放置在錯誤目錄中,請在控制檔案中重新命名它們:
SQL> ALTER DATABASE RENAME FILE '/wrong/path/datafile.dbf' TO '/correct/path/datafile.dbf'; -
若要避免這種情況,在設定參數檔案
SELECT con_id, name FROM v$datafile ORDER BY con_id;之前,請務必使用 驗證來源資料檔案路徑。
PDB 服務未向接聽程式註冊 (僅限多租戶)
原因:接聽程式在開啟 PDB 後不知道 PDBs服務。
解決方案:
-
強制服務註冊:
SQL> ALTER SYSTEM REGISTER; -
如果服務仍未顯示,請檢查
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; -
使用 進行驗證:
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 參數。
解決方案:
-
確認待命處於 MOUNT 模式:
SQL> SELECT status FROM v$instance; -
檢查待命上的 fal_server 和 fal_client 是否正確設定:
SQL> SHOW PARAMETER fal_server SQL> SHOW PARAMETER fal_client -
驗證網路連線:
tnsping ORCL_A # or RDSCDB_A for multitenant -
檢查待命主要點上的 log_archive_dest_2 參數 (如果在沒有代理程式的情況下手動設定)。
Data Guard 會隨著多個 PDBs(僅限多租戶)
原因:對於具有多個 PDB 的 CDBs,由於所有容器的變更量,重新執行可能會較慢。 PDBs
解決方案:
-
檢查套用率:
SQL> SELECT name, value, unit FROM v$dataguard_stats WHERE name IN ('apply rate', 'apply lag'); -
考慮增加重複的平行處理 (需要 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; -
確認待命執行個體上沒有資源限制 (CPU、I/O)。
RMAN 封存日誌備份使用 ORA-19625 失敗
原因:RDS Custom 自動化已從磁碟清除較舊的封存日誌,但 RMAN 的控制檔案仍有記錄。
解決方案:
-
交叉檢查並清除過時的封存日誌項目:
RMAN> CROSSCHECK ARCHIVELOG ALL; RMAN> DELETE NOPROMPT EXPIRED ARCHIVELOG ALL; -
僅重新執行封存日誌備份:
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 週):
-
最終備份:基於封存目的,取得 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 -
記錄遷移:使用新的 EC2 組態更新 Runbook 和文件
-
刪除 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 -
清除資源:如果不再需要,請移除相關聯的快照、參數群組和選項群組
-
更新文件:確保所有操作文件反映新的 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 的完整最佳實務。
遷移前規劃
-
進行徹底的評估:
開始遷移之前,請執行環境的全面評估:
-
資料庫清查:記錄所有資料庫、其大小、架構 (非 CDB 與多租戶) 和相依性
-
應用程式相依性:識別連線至資料庫的所有應用程式及其連線方法
-
效能基準:擷取效能指標 (CPU、記憶體、I/O、網路) 以進行遷移後比較
-
備份和復原需求:文件 RPO (復原點目標) 和 RTO (復原時間目標)
-
合規要求:識別可能影響遷移的任何法規或合規要求
-
-
選擇正確的 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% 的成長和尖峰負載空間
-
-
設計您的儲存架構:
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 配置
-
更輕鬆的容量管理
-
簡化的備份和快照策略
-
更好的效能隔離
-
-
建立復原計劃:
一律有復原策略:
-
在驗證期間保持執行 RDS Custom 執行個體 (建議 1-2 週)
-
維護來源和目標的定期備份
-
文件轉返程序,包括連線字串變更
-
在非生產環境中測試轉返程序
-
定義復原條件 (效能降級、資料不一致、應用程式錯誤)
-
遷移執行最佳實務
-
遷移的時間:
選擇最佳時段:
-
低流量時段:週末、假日或離峰時間
-
維護時段:盡可能與排定的維護保持一致
-
避免月末/季末:這些期間通常具有較高的交易量
-
考慮時區:針對全域應用程式,選擇可將跨區域影響降至最低的時間
-
-
通訊計劃:
建立明確的溝通:
-
利益相關者通知:至少提前 2 週通知所有利益相關者
-
應用程式團隊:與應用程式團隊協調連線字串更新
-
狀態更新:在遷移期間提供定期更新
-
呈報路徑:定義問題的明確呈報程序
-
遷移後通訊:確認成功完成和任何後續動作
-
-
驗證檢查點:
在每個階段實作驗證:
遷移前驗證:
-- 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; -
效能驗證:
比較遷移前後的效能指標:
-- 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要比較的關鍵指標:
-
平均作用中工作階段
-
每筆交易的資料庫時間
-
每秒實體讀取數
-
每秒邏輯讀取數
-
每秒重做大小
-
每秒的使用者呼叫數
-
每次執行的剖析時間
-
遷移後最佳化
-
遷移後,最佳化資料庫效能:
-
資料庫效能調校:
收集統計資料:
-- 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; -
儲存最佳化:
啟用壓縮:
-- 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) ); -
實作監控和提醒:
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 -
安全性強化:
資料庫安全性:
-- 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)
-
-
備份和復原策略:
實作全面的備份策略:
#!/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 主動重複保持來源上線 - 只需要短暫的切換
-
在停用來源之前進行徹底的測試和驗證
-
完整的遷移後任務,包括備份、監控和安全性組態
後續步驟:
-
評估您的資料庫架構 (非 CDB 或多租戶)
-
根據您的停機時間公差和複雜性需求,選擇適當的遷移選項
-
完成所有先決條件步驟,包括 EC2 執行個體設定和網路組態
-
遵循所選選項的詳細遷移步驟
-
執行徹底的驗證和測試
-
完成遷移後任務,以確保生產準備
-
驗證成功後停用 RDS Custom 執行個體
其他資源
支援
如需遷移的協助:
-
透過 AWS 管理主控台聯絡 AWS Support
-
有關資料庫特定問題,請諮詢 Oracle 支援
文件資訊
上次更新時間:2026 年 3 月
貢獻者:
-
Sharath Chandra Kampili,Amazon Web Services 資料庫專家解決方案架構師
-
Ibrahim Emara,Amazon Web Services 資料庫專家解決方案架構師
-
Vetrivel Subramani,Amazon Web Services 資料庫專家解決方案架構師