oracle nologging用法(轉)


一、oracle日志模式分為(logging,force logging,nologging)

默認情況是logging,就是會記錄到redo日志中,force logging是強制記錄日志,nologging是盡量減少日志。FORCE LOGGING可以在數據庫級別、表空間級別進行設定、而LOGGING與NOLOGGING可以在表級別設定。

注:FORCE LOGGING並不比一般的LOGGING記錄的日志多,數據庫在FORCE LOGGING狀態下,NOLOGGING選項將無效,因為NOLOGGING將破壞DATAGUARD的可恢復性.FORCE LOGGING強制數據庫在任何狀態下必須記錄日志。

logging,force logging和nologging是只記錄到redo日志中,歸檔不歸檔是另外的設置,但是如果用nologging了,那么顯然就算歸檔的話,歸檔日志就少了,但是可能不能用於介質回復了,因為有些根本沒有記錄。

二、使用情況

1.logging模式

這是日志記錄的缺省模式,無論數據庫是否處於歸檔模式,這並不改變表空間與對象級別上的缺省的日志記錄模式。對於臨時表空間將不記錄日志到聯機重做日志文件。

2.nologing模式

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

nologing模式通常和append聯合使用。

append介紹:

/*+append*/ 

(1)  append 屬於direct insert,歸檔模式下append+table nologging會大量減少日志,非歸檔模式append會大量減少日志,append方式插入只會產生很少的undo

使用append,一是減少對空間的搜索;二是有可能減少redolog的產生。所以append方式會快很多,一般用於大數據量的處理。建議不要經常使用append,這樣表空間會一直在高水位上,除非你這個表只插不刪
論壇append解釋:
請教一下,oracle中append是做什么用的。
  insert /*+append*/ into table1 select * from table2
在使用了append選項以后,insert數據會直接加到表的最后面,而不會在表的空閑塊中插入數據。使用append會增加數據插入的速度。
/*+APPEND*/的作用是在表的高水位上分配空間,不再使用表的extent中的空余空間
append 屬於direct insert,歸檔模式下append+table nologging會大量減少日志,非歸檔模式append會大量減少日志,append方式插入只會產生很少的undo
不去尋找 freelist 中的free block , 直接在table HWM 上面加入數據。
 
查redo大小語句:
select name,value,class from v$sysstat where name='redo size';
顯示的好方法:
select (1745704-582728) redo1,(1839872-1745704) redo2 from dual;//注意,括號里其實就是兩個數減法,然后寫進去顯示出來而已
 
(2)NOLOGGING與表模式,插入模式,數據庫運行模式(archived/unarchived)的關系:
下面僅說明使用append方式插入數據時日志產生的情況,如使用下面的方式進行插入(這里是表是否事先設置成nologging)

            insert/*+append+*/into tb_name select colnam1,colname2 from table_name;    

        數據庫處於歸檔模式

            當表模式為logging狀態時,無論是否使用append模式,都會生成redo.當表模式為nologging狀態時,只有append模式,不會生成redo。

        數據庫處於非歸檔模式

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

alter table aa nologging

 

alter table aa logging

 

insert /*+append*/ into ...nologing
select * from ...

 

insert /*+ append, parallel */ into ods_list_t nologging
select * from ods_list;

 

但這樣不行:整個表可以插入,但要某一個字段則不能加入nologging
insert /*+ append, parallel */ into ods_list_t(a,b) nologging
select a,b from ods_list;

 

但可以這樣:
insert /*+ append, parallel */ into ods_list_t  nologging(a,b)
select a,b from ods_list;

 

create table ods_list_t nologging as select * from ods_list;

 

insert /*+ append, parallel */ into ods_list_t nologging 
select * from ods_list;


insert /*+ Append parallel(tablename,number) */ into ods_list_t nologging 
select * from ods_list;

tablename: 表名
number: 並行度

 

使用批量拷貝方法
set arraysize 20
set copycommit 5000
copy from username/password@oracle_name append table_name1 
using select * from table_name2;

 

用EXP/IMP 處理大量數據

(1)給當前的兩個表分別改名 
alter   table   tab1   rename   to   tab11; 
alter   table   tab2   rename   to   tab1; 
(2)導出改名前的tab2 
exp   user/pwd@...   file=...   log=...   tables=(tab1) 
(3)把名字改回來 
alter   table   tab1   rename   to   tab2; 
alter   table   tab11   rename   to   tab1; 
(4)導入數據 
imp   user/pwd@...   file=...   log=...   fromuser=user   touser=user   tables=(tab1)

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

(3)真正總結(有用的):

可以看出(這是insert /*+ append */ into ddddd  nologging as select ...... from ...)

1. 不管哪種模式下append要與nologging方式聯用才能達到很好的效果。

2. 非歸檔與歸檔方式,只用NOLOGGING是不起效果的。

3. 非歸檔下append已達到不錯的效果,但不及與nologging的聯用方式。

4. 歸檔下單append起不到效果。

另外,如果庫處在FORCELOGGING模式下,此時的nologging方式是無效的,這個我也測試過
5.非歸檔模式下:
沒有優化前    (1281372  redo size)
(1)、單一的使用nologging參數,對redo的產生沒有什么影響。  (1214836  redo size)
(2)、單一的使用append提示,redo的減少很顯著              (43872  redo size)
(3)、nologging+append,更顯著                             (1108  redo size)

6.歸檔模式下:
沒有優化前:            
(1)、單獨使用nologging參數,(1231904  redo size)
(2)、單獨使用append提示,  (1245804  redo size)
(3)、nologging + append,     (3748  redo size)

a、使用nologging參數並不代表在dml操作中,oracle不產生redo,只是對於指定表的更新數據不產生redo,但是 oracle還是要記錄這些操作,所以無論怎么優化,dml操作肯定要產生redo,但是使用這些參數對redo size的影響還是非常可觀的。
b、單獨使用nologging參數,對redo size沒有多少影響,只有和append配合時,才能產生效果。
c、單獨使用append提示,對redo的產生影響很大,這是我到現在都不明白的道理,按說append是繞過freelists,直接去尋找新塊,能減少對freelists的爭用,為什么會少這么多redo呢?
d、歸檔模式和非歸檔模式下,參數影響不一樣,尤其是單獨使用append參數時,看來oracle對歸檔模式下出於安全考慮還是要多一些。 

三、查詢總結

1.查看不同級別的日志模式

        查看數據庫級別日志的歸檔模式、記錄模式  

        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

2.日志記錄模式的轉換

        a.數據庫從非強制日子模式切換到強制日志模式

            sys@ORCL>alterdatabase force logging;      

        b.數據庫從強制日志模式切換到非強制日志模式

            sys@ORCL>alterdatabaseno force logging;

        c.表空間級別從強制日志模式切換到非強制日志模式

            sys@ORCL>alterdatabaseno force logging;

        d.表空間級別從非強制日志模式切換到強制日志模式

            sys@ORCL>alterdatabaseno force logging;

        e.對象級別日志記錄模式

            sys@ORCL>altertable tb_a nologging;     --不記錄日志模式

            sys@ORCL>altertable tb_a logging;       --采用日志記錄模式

注意:

(1)表是否是nologging模式,還需要查user_tables.logging字段才行。
我剛才在oracle 10g中測試,create table xxx nologging as select *....產生的表並不是nologging方式,還得手工改一下:
alter table xxxx nologging.
改完后,在歸檔模式,insert /*+append*/確實日志很少。

(2)在使用append 快速加載數據完成后,需要commit or roll ,才能進行進行對該表進程操作否則會報錯:ORA-12838: cannot read/modify an object after modifying it in parallel錯誤。insert和append insert的原理上是完全不同的,insert append可以實現直接路徑加載,速度比常規加載方式快很多。但有一點需要注意: insert append時在表上加“6”類型的Exclusive鎖,即排它鎖,為表級鎖,會阻塞表上的所有DML語句。因此在有業務運行的上傳環境下要慎重使用。

 

http://www.cnblogs.com/zmlctt/p/3747443.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM