一、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
insert /*+append*/ into table1 select * from table2
在使用了append選項以后,insert數據會直接加到表的最后面,而不會在表的空閑塊中插入數據。使用append會增加數據插入的速度。
append 屬於direct insert,歸檔模式下append+table nologging會大量減少日志,非歸檔模式append會大量減少日志,append方式插入只會產生很少的undo
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)
沒有優化前:
(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