首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 11.1.0.7 ACCESS$ 表遺失導致 ORA-00704/ORA-00942 啟動失敗修復

     編輯:Oracle 資料庫相關知識

Oracle 11.1.0.7 存在 Bug 12733463:ACCESS$ 字典表遺失導致啟動過程中遞歸 SQL 查詢失敗,拋出 ORA-00704/ORA-00604/ORA-00942,實例終止。官方建議重啟/恢復備份,實測無效。本文提供 STARTUP UPGRADE + 手工重建 ACCESS$ 表與索引 的精準修復方案。

錯誤現象

SQL> ALTER DATABASE OPEN;
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced

Alert Log:
ORA-00704: bootstrap process failure
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist

Trace (10046):
PARSE ERROR #1: len=56 dep=1 uid=0 oct=3 lid=0 tim=... err=942
select order#,columns,types from access$ where d_obj#=:1

Root Cause

啟動階段 KZSRACCESS 核心模組需查詢 SYS.ACCESS$ 表驗證物件權限,表遺失導致遞歸 SQL 失敗,觸發 Bootstrap 失敗 → 實例終止。Bug 12733463 確認為 11.1.0.7 特有缺陷,可能由升級腳本缺陷、字典損壞、非正常關機觸發。

官方建議(實測無效)

  1. SHUTDOWN ABORT 清理共享記憶體/訊號量
  2. 重新啟動
  3. 若持續發生,恢復資料庫或從備份恢復

精準修復步驟(經驗證有效)

1. 以 UPGRADE 模式啟動(繞過完整啟動流程)

SQL> STARTUP UPGRADE
ORACLE instance started.
Database mounted.
Database opened.

2. 手工重建 ACCESS$ 表結構

CREATE TABLE sys.access$ (
  d_obj#   NUMBER NOT NULL,
  order#   NUMBER NOT NULL,
  columns  RAW(126),
  types    NUMBER NOT NULL
)
STORAGE (INITIAL 10K NEXT 100K MAXEXTENTS UNLIMITED PCTINCREASE 0);

3. 建立唯一索引 I_ACCESS1

CREATE UNIQUE INDEX sys.i_access1 ON sys.access$ (d_obj#, order#)
STORAGE (INITIAL 10K NEXT 100K MAXEXTENTS UNLIMITED PCTINCREASE 0);

4. 正常重啟驗證

SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP
ORACLE instance started.
Database mounted.
Database opened.

-- 驗證核心字典完整性
SQL> ANALYZE TABLE sys.access$ VALIDATE STRUCTURE CASCADE;
Table analyzed.

-- 驗證權限查詢正常
SQL> SELECT * FROM session_privs;
...

事後檢查清單

  1. SELECT COUNT(*) FROM sys.access$; 應 > 0(含預設權限記錄)。
  2. SELECT index_name, status FROM dba_indexes WHERE table_name='ACCESS$'; 索引 VALID。
  3. 執行 UTLRP.SQL 重新編譯所有無效物件。
  4. 檢查 Alert Log 無新 ORA-600/7445/942。
  5. 若為 RAC,所有節點執行相同步驟。

預防措施

  • 打上 Patch 12733463 或升級至 11.1.0.7.10+ / 11.2.0.4+ / 12c+。
  • 啟用 DB_BLOCK_CHECKING=MEDIUM/FULL、DB_BLOCK_CHECKSUM=TYPICAL/FULL 早期發現字典損壞。
  • 定期 RMAN VALIDATE DATABASE + DBVERIFY System 表空間。
  • 建立字典表完整性監控腳本:SELECT 'ACCESS$' t, COUNT(*) c FROM sys.access$ UNION ALL SELECT 'USER$', COUNT(*) FROM sys.user$ ...

核心字典表(ACCESS$, USER$, OBJ$, TAB$, COL$, IND$, ICOL$, TS$, FILE$, SEG$, UNDO$, FET$, BOOTSTRAP$)遺失/損壞均會導致啟動失敗。掌握 STARTUP UPGRADE + 手工重建 DDL 是 DBA 搶險必備技能,配合 sql.bsq/catalog.sql 可重建所有 Bootstrap$ 階段物件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved