首页 > 代码库 > ORACLE NOLOGGING研究

ORACLE NOLOGGING研究

熟悉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] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. SQL> show user  
  2. USER is "YUE"  
  3. SQL> @redo.sql  
  4.   
  5. STATISTIC# USERNAME                       NAME                      VALUE  
  6. ---------- ------------------------------ -------------------- ----------  
  7.        178 YUE                            redo size                   684  
  8.   
  9. SQL> create table t2 as select * from t1;  
  10.   
  11. Table created.  
  12.   
  13. SQL> @redo.sql  
  14.   
  15. STATISTIC# USERNAME                       NAME                      VALUE  
  16. ---------- ------------------------------ -------------------- ----------  
  17.        178 YUE                            redo size               8573344  
  18.   
  19. SQL> create table t3 nologging  as select * from t1;  
  20.   
  21. Table created.  
  22.   
  23. SQL> @redo.sql  
  24.   
  25. STATISTIC# USERNAME                       NAME                      VALUE  
  26. ---------- ------------------------------ -------------------- ----------  
  27.        178 YUE                            redo size               8725596  

再来看一下非归档模式下:

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. SQL> @redo.sql  
  2.   
  3. STATISTIC# USERNAME                       NAME                      VALUE  
  4. ---------- ------------------------------ -------------------- ----------  
  5.        178 YUE                            redo size                  1392  
  6.   
  7. SQL> create table t4 as select * from t1;  
  8.   
  9. Table created.  
  10.   
  11. SQL> @redo.sql  
  12.   
  13. STATISTIC# USERNAME                       NAME                      VALUE  
  14. ---------- ------------------------------ -------------------- ----------  
  15.        178 YUE                            redo size                191000  
  16.   
  17. SQL> create table t5 nologging as select * from t1;  
  18.   
  19. Table created.  
  20.   
  21. SQL> @redo.sql  
  22.   
  23. STATISTIC# USERNAME                       NAME                      VALUE  
  24. ---------- ------------------------------ -------------------- ----------  
  25.        178 YUE                            redo size                297176  

由此可见,在非归档模式下,对于上述操作,oracle不管nologging是否指定,都尽量不生成redo。


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

本人,认为,所有这些操作都是生成新的数据块或者直接覆盖老数据块的所有内容,例如 insert append操作,是在高水位线上直接插入数据。这也就解释了为什么insert append操作对应的index会生成redo,因为对index的修改即不是新建块也不是覆盖老块的所有内容。

DML操作在nologging模式下之所以生成日志,是因为dml操作的不一定是新块或者覆盖老块所有内容。而对lob的dml可以不生成redo,是因为lob的dml操作始终是在新块上保存编辑后数据。

ORACLE NOLOGGING研究