Oracle

如何禁用特定表(Oracle)的閃回查詢日誌記錄?

  • November 1, 2016

我們有一個特定的表,它有很多活動,它會創建很多更改記錄。結果是閃回數據只能追溯到幾天前。這在許多情況下都可以,但訪問更多歷史數據會很有好處。

我們想限制對該表的登錄。或者完全禁用它。我想我們也許可以通過表空間來做到這一點,我只是沒有找到太多關於如何進行這些更改的資訊。

您可以將表聲明為 NOLOGGING。那麼部分 DML 和 DDL 操作將不會記錄在重做日誌中。

Oracle logging_clause

當然,這有很多警告:

  • 如果您有許多 NOLOGGING 操作,基本上您將無法閃回或恢復表
  • 在任何情況下都會記錄 UPDATE 或 DELETE 操作
  • 只有直接路徑 INSERTS 可以跳過日誌記錄。但這意味著此類 INSERT 不會重用表段中的空白空間,並且每次執行此類 INSERT 時都會對其進行擴展。

根據我的經驗,在某些情況下,使用 NOLOGGING 可以節省大量重做/歸檔日誌空間,但您必須使程式碼適應它。

1)在修改數據庫中的數據之前,原始數據儲存在撤消表空間中:這可以通過撤消事務來回滾

使用儲存在撤消段中的原始數據進行修改

2)在將數據寫入數據庫之前,將其寫入重做日誌:這使數據庫能夠在數據庫崩潰或數據文件損壞時重建其狀態(使用備份和作為重做副本的存檔日誌)日誌)

這是兩個不同的東西。兩者都是必要的,以保證交易所需的重要ACID屬性。

特徵 1) 具有額外的優勢:

  1. 如果一個語句想要讀取在語句啟動後被另一個事務修改的數據,它可以在 undo 段中找到原始數據,因此可以獲得一致的數據視圖

2)撤消數據可用於從數據庫中檢索過去的數據(閃回查詢)

僅當啟用自動撤消管理(Oracle 11r2 中的預設設置)時才支持閃回查詢。因此,與閃回查詢的文章標題相反,使用的是撤消資訊而不是重做日誌資訊。

與行的刪除和更新相比,行的插入會產生大量重做但幾乎沒有撤消資訊。因此,一個會話可能會產生很多重做但不會產生很多撤消。

我不知道有任何方法可以找出撤消段中有多少撤消資訊來自特殊表,但性能視圖v$transactionUSED_UBLK:使用的撤消塊數)可幫助您辨識使用大量撤消空間的事務。

如果您沒有足夠的舊曆史數據,您可以嘗試減少應用程序寫入的撤消資訊,保持事務簡短並增加撤消表空間的大小。如果這還不夠,您可以將表綁定到閃回數據存檔,以保證表的修改數據保留足夠長的時間。Oracle Flashback Data Archive(也稱為 Oracle Total Recall)是 Oracle 企業版的一個選項,需要額外的許可。

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