Oracle 服務器進程在處理用戶進程提交的 SQL 請求時,會依次完成七大核心任務:SQL 解析、數據塊讀入緩存、記錄 Redo 日志、建立回滾段、修改數據塊、標記髒數據塊、處理提交或回滾。本文將逐一拆解各環節的內部機制。
用戶提交 SQL(如 UPDATE temp SET a=a*2)後,服務器進程在 PGA 分配會話內存,將 SQL 文本轉為 ASCII 並經 Hash 函數生成 Hash 值,到 Shared Pool 的 Library Cache 查找:
服務器進程先檢查所需塊是否在 Buffer Cache(LRU 列表):
數據讀入後,服務器進程將修改前的舊值、新值、RowID、SCN 等信息寫入 PGA 中的 Redo Log Buffer(需獲取 Redo Log Buffer Latch)。觸發 LGWR 寫入磁盤 Redo Log File 的條件:Buffer 達 1/3、累積 1MB、超過 3 秒、Checkpoint 發生、或 DBWn 寫入前。Redo Log File 循環使用,歸檔模式下 ARCn 處理歸檔。
修改數據塊頭部事務列表並寫入 SCN,將塊頭副本(含 SCN)寫入 Undo Segment,形成「前映像」,用於後續回滾、恢復與一致性讀。Undo Segment 可存放於專用 Undo 表空間或其他表空間。
在 Buffer Cache 中直接修改數據塊內容,並在塊頭記錄指向 Undo Segment 的地址。
若同一塊多次更新未提交,Undo 中會產生多個「前映像」(首個含 SCN,後續含 SCN 及指向前一映像的指針)。服務器進程在 Dirty List 建立指向該塊的指針,便於 DBWn 尋找寫入。當 Dirty Queue 長度達閾值(默認 25%)時通知 DBWn 刷盤。Oracle 支持多塊讀(db_file_multiblock_read_count)。
服務器進程根據數據塊頭事務列表、SCN 及 Undo 地址,按「前映像」鏈逆向還原未提交修改。發出 COMMIT 後不可 ROLLBACK,保障了提交後 DBWn 尚未完成的後續寫入。
理解這七大步驟的協作關係,是掌握 Oracle 事務處理、性能調優與故障診斷的基石。