一、日志記錄模式(LOGGING 、FORCE LOGGING 、NOLOGGING)
1. 三者的含義
LOGGING:當創建一個數據庫對象時將記錄日志信息到聯機重做日志文件。LOGGING實際上是對象的一個屬性,用來表示在創建對象時是否記錄REDO日志,包括在做DML時是否記錄REDO日志。一般表上不建議使用NOLOGGING,在創建索引或做大量數據導入時,可以使用NOLOGGING
FORCE LOGGING:簡言之,強制記錄日志,即對數據庫中的所有操作都產生日志信息,並將該信息寫入到聯機重做日志文件。
NOLOGGING:正好與LOGGING、FORCE LOGGING 相反,盡可能的記錄最少日志信息到聯機日志文件。
FORCE LOGGING可以在數據庫級別、表空間級別進行設定、而LOGGING與NOLOGGING可以在數據對象級別設定。
在使用DATA GUARD 時,要求使用強制記錄日志模式。注:FORCE LOGGING並不比一般的LOGGING記錄的日志多,數據庫在FORCE LOGGING狀態下,NOLOGGING選項將無效,因為NOLOGGING將破壞DATAGUARD的可恢復性.FORCE LOGGING強制數據庫在任何狀態下必須記錄日志。
2. 歸檔模式和非歸檔模式
在DBA部署數據庫之初,必須要做出的最重要決定之一就是選擇歸檔模式(ARCHIVELOG)或者非歸檔模式(NOARCHIVELOG )下運行數據庫。我們知道,Oracle 數據庫需要至少兩組聯機日志,每當一組聯機日志寫滿后會發生日志切換,繼續向下一組聯機日志寫入。如果是歸檔模式,日志切換會觸發歸檔進程 (ARCn)進行歸檔,生成歸檔日志。Oracle 保證歸檔完成前,聯機日志不會被覆蓋,如果是非歸檔模式, 則不會觸發歸檔動作。
3. 與歸檔模式及非歸檔模式之間的關系
日志記錄模式與歸檔模式之間並不能等同,歸檔模式是指對系統產生的日志是否進行歸檔或不歸檔。歸檔模式下,將日志記錄到日志文件,並進行歸檔。非歸檔模式下,同樣將日志記錄到日志文件,只不過不歸檔而已,容易丟失日志。日志的記錄模式則不論是否處於歸檔或非歸檔,可以對日志進行記錄,強制記錄,或少記錄日志。歸檔模式中的LOGGING或FORCE LOGGING 支持介質恢復,而NOLOGGING 模式不支持介質恢復。基於NOLOGGING模式操作所產生的日志遠小於LOGGING模式產生的日志,即NOLOGGING模式最小化日志記錄。
4. 優先級別
當數據庫使用FORCE LOGGING時,具有最高優先級別,其次是表空間級別的FORCE LOGGING。即是當一個對象指定NOLOGGING時,而表空間或數據庫級別的日志模式為FORCE LOGGING,則該選項不起作用,直到表空間或數據庫級別的FORCE LOGGING解除。
一般建議將整個數據庫設置為FORCE LOGGING或基於表空間級別設定FORCE LOGGING,而不建議兩者都設置為FORCE LOGGING。
當數據庫或表空間使用非強制日志模式時,則日記記錄優先級別由低到高為:數據庫、表空間、數據對象。
二、三種日志模式的使用情況
1. LOGGING模式
這是日志記錄的缺省模式,無論數據庫是否處於歸檔模式,這並不改變表空間與對象級別上的缺省的日志記錄模式。對於臨時表空間將不記錄日志到聯機重做日志文件。
2. NOLOGGING模式
此模式不是不記錄日志,而是最小化日志產生的數量,通常在下列情況下使用NOLOGGING
SQL*Loader indirect mode
INSERT/*+APPEND*/... CTAS ALTERTABLEstatements (move/add/split/merge partitions) CREATEINDEX ALTERINDEXstatements (move/add/split/merge partitions)
NOLOGGING與表模式,插入模式,數據庫運行模式(archived/unarchived)的關系:下面僅說明使用append方式插入數據時日志產生的情況,如使用下面的方式進行插入
insert /*+append+*/ into tb_name select colnam1,colname2 from table_name;
數據庫處於歸檔模式:
當表模式為logging狀態時,無論是否使用append模式,都會生成redo.當表模式為nologging狀態時,只有append模式,不會生成redo
3. FORCE LOGGING模式
設定數據庫為Force Logging模式后,數據庫將會記錄除臨時表空間或臨時回滾段外所有的操作,而忽略類似NOLOGGING之類的指定參數。
通過下面的操作來修改
ALTER DATABASE FORCE LOGGING; ALTER TABLESPACE tablespace_name FORCE LOGGING;
取消FORCE LOGGING模式
ALTER DATABASE NO FORCE LOGGING; ALTER TABLESPACE tablespace_name NO FORCE LOGGING;
4. 查看不同級別的日志模式
查看數據庫級別日志的歸檔模式、記錄模式
sys@ORCL> select log_mode,force_logging from v$database; LOG_MODE FOR ------------ --- NOARCHIVELOG NO
查看表空間級別的日志記錄模式
sys@ORCL> select tablespace_name,logging,force_logging from dba_tablespaces;
TABLESPACE_NAME LOGGING FOR
------------------------------ --------- ---
SYSTEM LOGGING NO UNDOTBS1 LOGGING NO SYSAUX LOGGING NO TEMP NOLOGGING NO USERS LOGGING NO LINUX LOGGING NO ASK1 LOGGING NO ASK2 LOGGING NO ASK3 LOGGING NO
查看對象級別的日志記錄模式
scott@ORCL> select table_name,logging from user_tables;
TABLE_NAME LOG
------------------------------ ---
DEPT YES EMP YES BONUS YES SALGRADE YES EMPLOYEE YES EMP_HIST YES DUMMY_EMP YES ASKORACLE_RANGE_LIST ASKORACLE_RANGE_HASH1 ASKORACLE_RANGE_HASH ASKORACLE_LIST TABLE_NAME LOG ------------------------------ --- ASKORACLE_HASH ASKORACLE EMP_TEST YES
5. 日志模式記錄轉換
1.數據庫從非強制日志模式切換到強制日志模式
sys@ORCL>alter database force logging; 2.數據庫從強制日志模式切換到非強制日志模式 sys@ORCL>alter database no force logging; 3.表空間級別從非強制日志模式切換到強制日志模式 sys@ORCL>alter tablespace tablespace_name force logging; 4.表空間級別從強制日志模式切換到非強制日志模式 sys@ORCL>alter tablespace tablespace_name no force logging; 5.對象級別日志記錄模式 sys@ORCL>alter table tb_a nologging; -- 不記錄日志模式 sys@ORCL>alter table tb_a logging; -- 采用日志記錄模式
三、LOB段上有關NOLOGGING與LOGGING的情況
1. 計算所有LOB的大小
SELECT SUM(BYTES)/1024/1024/1024 as LOB_Size FROM user_segments WHERE segment_type='LOBSEGMENT';
2. 計算所有nologging的大小
SELECT SUM(s.BYTES)/1024/1024/1024 as Nologging_size FROM user_segments s,user_lobs l WHERE s.segment_type='LOBSEGMENT' AND l.LOGGING='NO'AND l.SEGMENT_NAME=s.SEGMENT_NAME;
3. 列出所有nologging/logging 的lobs和對應的表空間及其大小
SELECT s.segment_name,s.bytes,s.TABLESPACE_NAME FROM user_segments s,user_lobs l WHERE s.segment_type='LOBSEGMENT' AND l.LOGGING='NO'AND l.SEGMENT_NAME=s.SEGMENT_NAME; SELECT s.segment_name,s.bytes,s.TABLESPACE_NAME FROM user_segments s,user_lobs l WHERE s.segment_type='LOBSEGMENT' AND l.LOGGING='YES'AND l.SEGMENT_NAME=s.SEGMENT_NAME;
4. 計算LOB段上nologging/logging的數量
SELECT COUNT(*) FROM user_lobs WHERE logging='NO'; SELECT COUNT(*) FROM user_lobs WHERE logging='YES';
轉載:https://blog.csdn.net/wuya814070935/article/details/79092604