Oracle 10.2.0.3 升級至 10.2.0.4 (Patch Set) 時,執行 catupgrd.sql 過程中或後出現 ORA-01092: ORACLE instance terminated. Disconnection forced,導致升級中斷。本文提供標準化解決流程:完整備份 → 正規升級腳本執行 → 無效物件重編譯,避免手工 Hack 引入隱患。
catupgrd.sql 內部執行大量 DDL/DML,若觸發未修復的 Bug (如 Bug 5866410, 6448763) 導致背景進程異常終止,實例拋出 ORA-1092 自殺保護。JAVAVM 元件升級失敗、XDB 重編譯死鎖、記憶體參數不足 (PGA/SGA)、OS 核心參數未調校。
# 冷備份 (資料庫關閉狀態)
cp -r /u01/oradata/ORCL /backup/ORCL_pre_10204_$(date +%Y%m%d)
# 或 RMAN 備份
rman target / <
SHARED_POOL_SIZE >= 200M, JAVA_POOL_SIZE >= 50M, PGA_AGGREGATE_TARGET >= 256M (建議更大)。
sqlplus / as sysdba
SQL> STARTUP UPGRADE; -- 關鍵:UPGRADE 模式啟動,限制非 SYS 連線、禁用作業佇列
SQL> SPOOL upgrade_10204.log
SQL> @?/rdbms/admin/catupgrd.sql
SQL> SPOOL OFF
關鍵點:STARTUP UPGRADE 會設定 _SYSTEM_TRIG_ENABLED=FALSE 等內部參數,確保升級腳本安全執行。
grep -i "ORA-\|ERROR\|FAIL" upgrade_10204.log
# 若僅有警告 (如 ORA-00001 唯一鍵衝突在內部表) 通常可忽視
# 若有嚴重錯誤導致實例終止,檢查 Alert Log 對應時間點背景進程 trace 檔
SQL> @?/rdbms/admin/utlrp.sql
-- 或並行重編譯 (10g+)
SQL> EXEC utl_recomp.recomp_parallel(4); -- CPU 核心數
-- 驗證
SELECT COUNT(*) FROM dba_objects WHERE status = 'INVALID'; -- 應為 0
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP
SQL> SELECT * FROM v$version; -- 確認 10.2.0.4.0
SQL> SELECT comp_name, version, status FROM dba_registry; -- 所有元件 VALID
| 現象 | 可能原因 | 對策 |
|---|---|---|
| catupgrd.sql 執行中實例 Crash (ORA-1092) | 特定 Bug 觸發 (如 JAVAVM 類別載入失敗) | 1. 確認已應用 10.2.0.4 專用一次性補丁 (One-off patches) 2. 嘗試 STARTUP UPGRADE PFILE=... 降低記憶體參數 3. 臨時關閉 Java: ALTER SYSTEM SET JAVA_POOL_SIZE=0 SCOPE=SPFILE (升級後重開) 4. 開 SR 請 Oracle Support 提供修補腳本 |
| utlrp.sql 重編譯卡住/極慢 | 物件相依循環、鎖爭用 | 識別阻塞 Session -> Kill -> 重跑 utlrp; 或分 Schema 手工重編譯 |
| 元件狀態 INVALID/OPTION OFF | 升級腳本步驟失敗 | 查詢 dba_registry_history 定位失敗步驟 -> 手工重跑對應腳本 (如 catjava.sql, catxdb.sql) |
SHARED_POOL, JAVA_POOL, PGA,觀察無誤後再升級。utlrp.sql 確保零無效物件起跑。DBMS_STATS.GATHER_DICTIONARY_STATS,升級後再收集一次。