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
啟動階段 KZSRACCESS 核心模組需查詢 SYS.ACCESS$ 表驗證物件權限,表遺失導致遞歸 SQL 失敗,觸發 Bootstrap 失敗 → 實例終止。Bug 12733463 確認為 11.1.0.7 特有缺陷,可能由升級腳本缺陷、字典損壞、非正常關機觸發。
SQL> STARTUP UPGRADE
ORACLE instance started.
Database mounted.
Database opened.
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);
CREATE UNIQUE INDEX sys.i_access1 ON sys.access$ (d_obj#, order#)
STORAGE (INITIAL 10K NEXT 100K MAXEXTENTS UNLIMITED PCTINCREASE 0);
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;
...
SELECT COUNT(*) FROM sys.access$; 應 > 0(含預設權限記錄)。SELECT index_name, status FROM dba_indexes WHERE table_name='ACCESS$'; 索引 VALID。UTLRP.SQL 重新編譯所有無效物件。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$ 階段物件。