Oracle 版本: 19.16
OS 版本: Aix 7.2
問題描述:
MATERIALIZED View Refresh 失敗,於 DB alert log 發現 ORA-31934 錯誤訊息:
問題分析:
從 Oracle 12c 開始,在 MATERIALIZED View Refresh 之後會自動觸發 Segment Advisor 並對 MATERIALIZED View Log 進行 Shrink 的動作,由於 MATERIALIZED View Log 預設是使用 delete 進行資料的刪除,進行 Shrink 的動作可以避免 MATERIALIZED View Log 的空間越來越大, ORA-31934 就是由於 Segment Advisor 所觸發 Shrink 動作所造成的錯誤。
ORA-31934 很有可能是由於 Bug 32433627 所引起的,原因在於 Segment Advisor 對 MATERIALIZED View Log 的處理上不夠完善,可以設定參數 "_mv_refresh_shrink_log"=false 來停用 MATERIALIZED View Refresh 時所觸發的 Segment Advisor 。
解決方法:
設定參數 "_mv_refresh_shrink_log"=false 避免觸發 Segment Advisor 。
除此之外,設定 atomic_refresh 為 false 來進行 MATERIALIZED View Refresh 的動作。 atomic_refresh 預設為 true ,表示 MATERIALIZED View Log 會使用 delete 來刪除資料,設定為 false 表示使用 truncate 來刪除MATERIALIZED View Log 的資料。
由於設定了 "_mv_refresh_shrink_log"=false 使得 MATERIALIZED View Log 不再 Shrink ,此時使用 truncate 來刪除 MATERIALIZED View Log 就可以避免其空間越來越大。