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

Oracle 刪除 DUAL 表導致資料庫無法啟動:緊急恢復指南

     編輯:MySQL 資料庫相關知識

Oracle DUAL 表被誤刪:ORA-1092 崩潰恢復完整步驟

警示:Oracle 系統核心表 DUAL(單列單行虛表)雖可執行 DML/DDL 操作,但絕對禁止執行 DROP TABLE dual。刪除後資料庫啟動將報 ORA-1092: ORACLE instance terminated. Disconnection forced,導致實例無法掛載。

緊急恢復步驟(需 SYS 權限)

  1. 建立參數檔備份:
    SQL> CREATE PFILE='d:\pfile.bak' FROM SPFILE;
  2. 關閉實例:
    SQL> SHUTDOWN IMMEDIATE;
  3. 修改參數檔:
    用文本編輯器開啟 d:\pfile.bak,在末尾新增:
    replication_dependency_tracking = FALSE
    此參數繞過複製相關依賴檢查,允許在缺少 DUAL 表的情況下啟動實例進行修復。
  4. 使用參數檔啟動實例:
    SQL> STARTUP PFILE='d:\pfile.bak';
  5. 重建 DUAL 表:
    SQL> CREATE TABLE "SYS"."DUAL" ("DUMMY" VARCHAR2(1));
    SQL> INSERT INTO "SYS"."DUAL" VALUES ('X');
    SQL> COMMIT;
  6. 移除臨時參數並重啟:
    編輯 pfile.bak 移除新增參數,或重新生成 SPFILE:
    SQL> CREATE SPFILE FROM PFILE='d:\pfile.bak';
    SQL> SHUTDOWN IMMEDIATE;
    SQL> STARTUP;

核心原理解析

  • DUAL 為 SYS Schema 核心物件,內部代碼大量硬編碼依賴(如 SELECT SYSDATE FROM DUAL)。
  • 啟動階段 replication_dependency_tracking 會檢查複製相關物件,觸發對 DUAL 的存取導致崩潰。
  • 設為 FALSE 可跳過該檢查,賴以啟動實例完成 DDL 修復。

預防措施

  1. 核心 Schema 嚴禁 DDL:SYS、SYSTEM 下物件禁止 DROP/ALTER。
  2. 生產環境啟用 DDL 觸發器審計:
    CREATE OR REPLACE TRIGGER prevent_core_ddl
    BEFORE DROP ON DATABASE
    WHEN (ORA_DICT_OBJ_OWNER IN ('SYS','SYSTEM'))
    BEGIN
      RAISE_APPLICATION_ERROR(-20001, '核心 Schema 禁止 DROP 操作');
    END;
  3. 定期備份與恢復演練:確保具備時間點恢復(PITR)能力。

若無備份且上述方法失效,僅能重建資料庫並從邏輯備份導入。切記:DUAL 表只能查詢,不可刪除。

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