一、oracle對logging與nologging的控制。
Oracle在4個級別 提供對操作是否記錄redo日志進行控制
- 數據庫級別
Force_logging, 數據庫級別開啟force logging ,將忽略一切nologging的操作,即使顯示加上nologging也不起作用。所以搭建物理standby時,一定要將force logging開啟。
開啟關閉語句
Alter database force logging;
Alter database no force logging;
- 表空間級別
Force_logging屬性 , 表空間是否開啟強制記日志,如果開啟,表空間上所屬對象上的操作都會記日志到redo log ,忽略一切nologging操作。
Logging/nologging屬性,為表空間上的對象提供logging屬性的默認值,如果創建對象時不顯示指定是logging還是nologging,則取表空間的logging屬性。
開啟關閉語句
Alter tablespace users force logging;
Alter tablespace users no force logging;
Alter tablespace users logging;
Alter tablespace users nologging;
查詢表空間的日志記錄屬性
Select tablespace_name,force_logging,logging from dba_tablespaces where tablespace_name=’USERS’;
- 對象級別
Logging屬性取值為yes或no,對該對象的更改是否記錄日志。
查詢對象的logging屬性
Select logging from dba_tables where table_name=’T’;
對象的logging開啟與關閉
Alter table t logging;
Alter table t nologging;
- 語句級別
指定該sql語句是否記錄日志,默認依賴對象的logging屬性。
Insert into t nologging select object_id,object_name from dba_objects;
二、nologging的好處與影響
好處:
(1)可以大大減少插入大型表的時間
(2)提高並行創建大型表或索引的性能
(3)減少日志生成量,節省磁盤空間
影響:
(1) 無法從重做日志中恢復更改,帶來數據丟失的風險
(2) 對於物理standby,數據庫一旦應用了無效的重做日志,所有相應的數據塊將標記為邏輯壞塊,查詢引用時將報錯。
(3) 對於邏輯standby,SQL apply會忽略無效的重做日志,因為它無法將其轉換為有效的sql,邏輯standby也不會立即收到任何錯誤,只是在查詢引用丟失的數據時報錯。
實驗:
數據庫表空間對象的logging屬性都設為no
把數據庫的force logging設為no,表空間的force logging設為no,logging設為nologging,對象的logging屬性設為nologging
在這個基礎上,sql語句顯示加nologging 並不是都不記錄日志。
Insert into .... values 不管是否加hint /*+append*/, 始終會記錄redo log
以下語句可以調用nologging, 使nologging生效
(1) Insert /*+append*/ select .....
(2) CTAS , nologging模式下只記錄建表的日志
(3) Create index....
(4) Alter index ... rebuild
(5) Alter table ....move ...
(6) Sqlloader, datapump加載數據
三,如何防止nologging帶來的風險
- 對於有standby的數據庫,一定要開啟數據庫級別的force logging
- 對於核心的生產數據庫,為了避免數據丟失的風險,一定要開啟force logging
- 重要程度不高的數據庫上可以考慮使用nologging,臨時性批量操作可以考慮使用nologging,或在nologging操作之后及時做一次全備。