Oracle

啟動數據庫時如何防止 Oracle 寫入數據文件?

  • May 23, 2015

我正在為 Oracle 數據庫創建 Docker 映像,並且將從同一個映像生成許多不同的容器。

當我啟動 Oracle 實例時,由於某種原因,一些字節被寫入所有活動數據文件。Docker 將容器的差異保存到基礎映像,差異是更改的整個文件,因此每次啟動容器時,都會將超過 6 GB 的數據寫入磁碟以啟動數據庫。

那麼,為什麼 Oracle 在啟動數據庫時會寫入數據文件呢?最符合邏輯的行為是僅在數據更改和送出時才寫入數據文件。我可以做些什麼來改變它嗎?

除了 Oracle Linux(這是我的圖像的基礎)之外,我還在 Windows 上嘗試過,並且行為是相同的,所有數據文件都被寫入。

我嘗試將表空間設置為只讀。這避免了寫操作,但是當我將表空間設置為讀寫時,它會立即寫入文件,再次導致問題。

為了清楚起見,我需要表空間是可寫的,但前提是數據實際發生變化。

沒有辦法避免這種情況。除了使用者數據,Oracle 還包含許多元數據——這些也必須維護。Oracle 在內部維護一個稱為 SCN(系統更改編號)的編號。每當數據庫中的“某些東西”發生變化時,這個數字就會增加。

這個 SCN 號被寫入每個數據文件的頭部,也被寫入每個控製文件。在打開(啟動)數據庫時,Oracle 檢查所有文件中的這個數字是否相同。然後它假定文件是一致的。

即使數據庫沒有負載,此 SCN 也會增加。還有像統計數據收集這樣的後台工作會做一些負載。使用者還可以創建系統觸發器ON DATABASE STARTUP,該觸發器將在數據庫啟動時執行某些作業。

通常,Oracle 數據庫伺服器不是虛擬化的理想選擇。記錄 Oracle 的員工也在內部進行,因此您將相同的數據保留兩次(這些文件稱為存檔重做日誌)。因此,如果您刪除容器差異(僅適用於數據文件),Oracle 將能夠倖存下來,因為它將能夠從重做日誌中重放事務。

PS:複製數據庫時,您還應該考慮將數據庫 SID 更改為唯一。或者至少您應該使用 nid 來更改數據庫唯一編號 DBID。否則在恢復 RMAN 數據庫備份時可能會遇到麻煩。

引用自:https://serverfault.com/questions/693851