
我正在為 Oracle 資料庫建立 Docker 映像,並且將從同一映像生成許多不同的容器。
當我啟動 Oracle 實例時,由於某種原因,一些位元組被寫入所有活動資料檔案中。 Docker 將容器中的差異保存到基礎映像,而差異是更改的整個文件,因此每次啟動容器時,都會將超過 6 GB 的資料寫入磁碟以用於啟動資料庫。
那麼,為什麼Oracle在啟動資料庫時要寫入資料檔呢?最符合邏輯的行為是僅在資料變更和提交時才寫入資料檔案。我可以做點什麼來改變這一點嗎?
除了 Oracle Linux(這是我的映像的基礎)之外,我還在 Windows 上嘗試過,行為是相同的,所有資料檔案都被寫入。
我嘗試將表空間設為唯讀。這避免了寫入操作,但是當我將表空間設為讀寫時,它會立即寫入文件,再次導致問題。
需要明確的是,我需要表空間可寫,但前提是資料實際發生變更。
答案1
沒有辦法避免這種情況。除了用戶資料之外,Oracle 還包含大量元資料 - 這些也必須維護。 Oracle 在內部維護一個稱為 SCN(系統變更編號)的編號。每當資料庫中的「某些內容」發生變化時,這個數字就會增加。
此SCN號被寫入每個資料檔案的頭部以及每個控製文件中。當開啟(啟動)資料庫時,Oracle 檢查所有檔案中的該數字是否相同。然後它假設文件是一致的。
即使資料庫沒有負載,此 SCN 也會遞增。此外,諸如統計資料收集之類的後台工作也會產生一些負載。使用者還可以建立系統觸發器ON DATABASE STARTUP
,該觸發器將在資料庫啟動時執行某些作業。
一般來說,Oracle 資料庫伺服器不適合虛擬化。日誌記錄 Oracle 的工作人員也在內部進行,因此您可以將相同的資料保存兩次(這些檔案稱為存檔重做日誌)。因此,如果您刪除容器差異(僅適用於資料檔案),Oracle 將能夠倖存,因為它將能夠從重做日誌重播交易。
PS:複製資料庫時,您還應該考慮將資料庫 SID 變更為唯一。或至少您應該使用 nid 來更改資料庫唯一編號 DBID。否則,您在恢復 RMAN 資料庫備份時可能會遇到麻煩。