Oracle

Oracle:即使有多個重做日誌,數據庫編寫器也會一直閒置到“檢查點未完成”

  • February 5, 2022

我正在開發一個穩定數據收入為 400 MB/小時的應用程序。為此,我們設置了 10 個重做日誌組,每個組的大小為 100MB。因此,我們將日誌翻轉大約。每 15 分鐘

由於磁碟空間有限,我們有一個保留作業,它會在一定時間後刪除“舊”數據。當此作業執行時,它會根據時間戳執行刪除級聯。到目前為止,一切都很好…

當數據刪除過程執行時,重做日誌間隔縮短到 15 秒,在 9 次日誌翻轉後,我們看到臭名昭著的“檢查點未完成”消息。

我們用 top 和 iotop 觀察了日誌寫入器 (ora_lgwr_XXXX) 和數據庫寫入器 (ora_dbwX_XXXX) 的行為,發現數據庫寫入器完全空閒,直到“檢查點未完成”點。日誌寫入器以 MB/s 寫入,而數據庫寫入器空閒。關於文件,數據庫編寫者從創建的檢查點開始,這些檢查點是在每次重做日誌翻轉後創建的。

那麼,為什麼數據庫寫入器在重做日誌全部滿之前不工作呢?

在第一個檢查點通過第一個重做日誌翻轉完成後,我不應該看到數據庫寫入器的一些重要 I/O 嗎?

在“檢查點未完成”消息之前,我們看到兩個數據庫寫入器的一些累積 kB,至少有 9 次重做日誌翻轉。之後,數據庫寫入者以 MB/s 的速率將數據儲存到數據庫中。

數據庫編寫器程序可以變得更激進嗎?理想情況下取決於重做日誌中待處理的數據量?我不需要立即將每個字節都集成到數據庫文件中,但是當大量數據在數據庫緩衝區記憶體中待處理(並且重做日誌仍然處於活動狀態)並且大量數據進入時,應該有一種機制推動數據庫編寫者獲得更高的性能?

元數據:

  • 8 個 vCPU
  • 56 GB 記憶體
  • 甲骨文 11.2.0.3
  • log_checkpoint_interval=0
  • log_checkpoint_timeout=1800
  • db_writer_processes=1
  • 10 個重做日誌組,每個 100MB
  • 1 個 1TB 分區,通過 iSCSI 儲存所有數據 (oradata)

我想您可以使用fast_start_io_targetlog_checkpoint_timeout初始化參數來誘使數據庫編寫者更積極地寫出臟塊。除非您的重做日誌與您的數據文件位於不同的 I/O 路徑上,否則您不太可能從中看到任何好處,因為日誌和數據庫編寫器將競爭相同的 I/O 頻寬。正如其他人所提到的,更好的選擇是增加重做日誌的大小以適應長時間執行的事務。

… 400 MB/hr 的穩定數據收入 … 10 個重做日誌組,每個組大小為 100MB … 滾動日誌約。每 15 分鐘

… 數據刪除過程 … 重做日誌間隔縮短到 15 秒 …

您已經調整了系統的大小以應對每小時到達的 400MB 新內容。這是一個好的開始。

但是,您的重做日誌需要處理數據庫中發生的所有事情,而不僅僅是傳入的內容。請記住:刪除也會創建重做!

您的“數據刪除過程”顯然正在處理更大的數據量,而您沒有考慮到這一點。

您需要計算出實際生成了多少重做並相應地調整重做日誌的大小。

引用自:https://dba.stackexchange.com/questions/176978