程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORACLENOLOGGING研究

ORACLENOLOGGING研究

編輯:Oracle教程

ORACLENOLOGGING研究


熟悉oracle的人都知道,通過設置oracle的nologging選項,可以使某些操作快速完成,風險是數據庫備份可能失效。可以使用nologging的操作有很多,搜集資料整理如下:

1.索引的創建和ALTER(重建)。
2.表的批量INSERT(通過/*+append */提示使用“直接路徑插入“。或采用SQL*Loader直接路徑加載)。表數據生成少量redo,但是所有索引修改會生成大量redo(盡管表不生成日志,但這個表上的索引卻會生成redo!)。
3.Lob操作(對大對象的更新不必生成日志)。
4.通過create table as select創建表。
5.各種alter table操作,如move和split。

6. dml操作始終生成redo,對於lob字段例外(與lob字段的undo方式有關)

下面,我們來使用一下:

首先是歸檔模式下:

SQL> show user
USER is "YUE"
SQL> @redo.sql

STATISTIC# USERNAME                       NAME                      VALUE
---------- ------------------------------ -------------------- ----------
       178 YUE                            redo size                   684

SQL> create table t2 as select * from t1;

Table created.

SQL> @redo.sql

STATISTIC# USERNAME                       NAME                      VALUE
---------- ------------------------------ -------------------- ----------
       178 YUE                            redo size               8573344

SQL> create table t3 nologging  as select * from t1;

Table created.

SQL> @redo.sql

STATISTIC# USERNAME                       NAME                      VALUE
---------- ------------------------------ -------------------- ----------
       178 YUE                            redo size               8725596
再來看一下非歸檔模式下:

SQL> @redo.sql

STATISTIC# USERNAME                       NAME                      VALUE
---------- ------------------------------ -------------------- ----------
       178 YUE                            redo size                  1392

SQL> create table t4 as select * from t1;

Table created.

SQL> @redo.sql

STATISTIC# USERNAME                       NAME                      VALUE
---------- ------------------------------ -------------------- ----------
       178 YUE                            redo size                191000

SQL> create table t5 nologging as select * from t1;

Table created.

SQL> @redo.sql

STATISTIC# USERNAME                       NAME                      VALUE
---------- ------------------------------ -------------------- ----------
       178 YUE                            redo size                297176
由此可見,在非歸檔模式下,對於上述操作,oracle不管nologging是否指定,都盡量不生成redo。

那麼,上面所有的可以nologging的操作具有什麼共性那?

本人,認為,所有這些操作都是生成新的數據塊或者直接覆蓋老數據塊的所有內容,例如 insert append操作,是在高水位線上直接插入數據。這也就解釋了為什麼insert append操作對應的index會生成redo,因為對index的修改即不是新建塊也不是覆蓋老塊的所有內容。

DML操作在nologging模式下之所以生成日志,是因為dml操作的不一定是新塊或者覆蓋老塊所有內容。而對lob的dml可以不生成redo,是因為lob的dml操作始終是在新塊上保存編輯後數據。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved