oracle技術之日誌記錄模式詳解

來源:互聯網
上載者:User

--==================================================

-- 日誌記錄模式(LOGGING 、FORCE LOGGING 、NOLOGGING)

--==================================================


一、日誌記錄模式(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.與歸檔模式及非歸檔模式之間的關係

日誌記錄模式與歸檔模式之間並不能等同,歸檔模式是指對系統產生的日誌是否進行歸檔或不歸檔。

歸檔模式下,將日誌記錄到記錄檔,並進行歸檔。非歸檔模式下,同樣將日誌記錄到記錄檔,只不過不歸檔而已,容易丟失日誌。

日誌的記錄模式則不論是否處于歸檔或非歸檔,可以對日誌進行記錄,強制記錄,或少記錄日誌。

歸檔模式中的LOGGING或FORCE LOGGING 支援介質恢複,而NOLOGGING 模式不支援介質恢複。

基於NOLOGGING模式操作所產生的日誌遠小於LOGGING模式產生的日誌,即NOLOGGING模式最小化日誌記錄。

3.優先順序別:

當資料庫使用FORCE LOGGING時,具有最高優先順序別,其次是資料表空間層級的FORCE LOGGING。即是當一個對象指定NOLOGGING時,而表空

間或資料庫層級的記錄模式為FORCE LOGGING,則該選項不起作用,直到資料表空間或資料庫層級的FORCE LOGGING解除。

一般建議將整個資料庫設定為FORCE LOGGING或基於資料表空間層級設定FORCE LOGGING,而不建議兩者都設定為FORCE LOGGING。

當資料庫或資料表空間使用非強制記錄模式時,則日記記錄優先順序別由低到高為:資料庫、資料表空間、資料對象

二、三者的使用方式

1.LOGGING模式

這是日誌記錄的預設模式,無論資料庫是否處于歸檔模式,這並不改變資料表空間與對象層級上的預設的日誌記錄模式。

對於暫存資料表空間將不記錄日誌到聯機重做記錄檔。

2.NOLOGGING模式

此模式不是不記錄日誌,而是最小化日誌產生的數量,通常在下列情況下使用NOLOGGING

SQL*Loader in direct mode

INSERT /*+APPEND*/ ...

CTAS

ALTER TABLE statements (move/add/split/merge partitions)

CREATE INDEX

ALTER INDEX statements (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。

資料庫處於非歸檔模式

無論是在logging還是nologing的模式下,append的模式都不會產生redo,而no append模式下都會產生redo。

2.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;

3.查看不同層級的記錄模式

查看資料庫層級日誌的歸檔模式、記錄模式

SQL> select log_mode,force_logging from v$database;


LOG_MODE FORCE_LOGGING

------------ -------------

ARCHIVELOG NO


查看錶空間層級的日誌記錄模式

SQL> select tablespace_name,logging,force_logging from dba_tablespaces;


TABLESPACE_NAME LOGGING FORCE_LOGGING

--------------- --------- -------------

SYSTEM LOGGING NO

UNDOTBS1 LOGGING NO

SYSAUX LOGGING NO

TEMP NOLOGGING NO

USERS LOGGING NO


查看對象層級的日誌記錄模式

scott@ORCL> select table_name,logging from user_tables;


TABLE_NAME LOG

------------------------------ ---

TB_A YES

TB_B YES


4.日誌記錄模式的轉換

a.資料庫從非強制日子模式切換到強制記錄模式

sys@ORCL> alter database force logging;

b.資料庫從強制記錄模式切換到非強制記錄模式

sys@ORCL> alter database no force logging;

c.資料表空間層級從強制記錄模式切換到非強制記錄模式

sys@ORCL> alter database no force logging;

d.資料表空間層級從非強制記錄模式切換到強制記錄模式

sys@ORCL> alter database no force logging;

e.對象層級日誌記錄模式

sys@ORCL> alter table tb_a nologging; --不記錄記錄模式

sys@ORCL> alter table tb_a logging; --採用日誌記錄模式

三、LOB段上有關NOLOGGING與LOGGING的情況

計算所有LOB的大小:

SELECT SUM(BYTES)/1024/1024/1024 as LOB_Size FROM user_segments

WHERE segment_type='LOBSEGMENT';


計算所有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;


列出所有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;


計算LOB段上nologging/logging的數量


SELECT COUNT(*) FROM user_lobs WHERE logging='NO';

SELECT COUNT(*) FROM user_lobs WHERE logging='YES';



oracle視頻教程請關注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.