1. 程式人生 > >oracle nologging用法(轉)

oracle nologging用法(轉)

而是 array 類型 無效 data 還得 模式 dddd reat

一、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)

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

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

[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用法(轉)