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 [email protected]_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)
沒有優化前:
(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
查看對象級別的日誌記錄模式
[email protected]>select table_name,logging from user_tables;
TABLE_NAME LOG
------------------------------ ---
TB_A YES
TB_B YES
2.日誌記錄模式的轉換
a.數據庫從非強制日子模式切換到強制日誌模式
[email protected]>alterdatabase force logging;
b.數據庫從強制日誌模式切換到非強制日誌模式
[email protected]>alterdatabaseno force logging;
c.表空間級別從強制日誌模式切換到非強制日誌模式
[email protected]>alterdatabaseno force logging;
d.表空間級別從非強制日誌模式切換到強制日誌模式
[email protected]>alterdatabaseno force logging;
e.對象級別日誌記錄模式
[email protected]>altertable tb_a nologging; --不記錄日誌模式
[email protected]>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語句。因此在有業務運行的上傳環境下要慎重使用。
oracle nologging用法(轉)