ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle启用nologging

oracle启用nologging

原创 Linux操作系统 作者:尛样儿 时间:2010-04-26 01:25:02 0 删除 编辑

Oracle启用nologging

以下操作可以启用nologging
1.创建索引或重建索引。

2.通过/*+APPEND*/提示,使用直接路径(Direct Path)批量INSERT操作或3.SQL*Loader 直接路径加载数据。

4.CTAS方式创建数据表。

5.大对象(LOB)的操作。

6.一些ALTER TABLE操作,如MOVE SPLIT等。


NOLOGGING
和表模式(LOGGING/NOLOGGING),插入模式(APPEND/NOAPPEND)及数据库运行模式(归档/非归档)都有关系。

3种模式和Redo的关系

数据库模式

表模式

插入模式

REDO生成

ARCHIVELOG

LOGGING

APPEND

有REDO

NO APPEND

有REDO

NOLOGGING

APPEND

无REDO

NO APPEND

有REDO

NOARCHIVELOG

LOGGING

APPEND

无REDO

NO APPEND

有REDO

NOLOGGING

APPEND

无REDO

NO APPEND

有REDO

 
可以采用NOLOGGING模式执行以下操作:
1 索引的创建和ALTER(重建)。
2 表的批量INSERT(通过/*+APPEND */提示使用“直接路径插入“。或采用SQL*Loader直接路径加载)。表数据不生成redo,但是
所有索引修改会生成redo,但是所有索引修改会生成redo(尽管表不生成日志,但这个表上的索引却会生成redo!)。
3 LOB操作(对大对象的更新不必生成日志)。
4 通过CREATE TABLE AS SELECT创建表。
5 各种ALTER TABLE操作,如MOVE和SPLIT。
在一个ARCHIVELOG模式的数据库上,如果NOLOGGING使用得当,可以加快许多操作的速度,因为它能显著减少生成的重做日
志量。假设你有一个表,需要从一个表空间移到另一个表空间。可以适当地调度这个操作,让它在备份之后紧接着发生,这样就能把表
ALTER为NOLOGGING模式,移到表,创建索引(也不生成日志),然后再把表ALTER回LOGGING模式。现在,原先需要X小时才能
完成的操作可能只需要X/2 小时(运行是会不会真的减少50%的时间,这一点我不敢打保票!)。要想适当地使用这个特性,需要DBA的
参与,或者必须与负责数据库备份和恢复(或任何备用数据库)的人沟通。如果这个人不知道使用了这个特性,一旦出现介质失败,就可
能丢失数据,或者备用数据库的完整性可能遭到破坏。对此一定要三思。
使用范例
create table t
NOLOGGING
as
select * from all_objects
关于NOLOGGING操作,需要注意以下几点:
1 事实上,还是会生成一定数量的redo。这些redo的作用是保护数据字典。这是不可避免的。与以前(不使用NOLOGGING)相
比,尽管生成的redo量要少多了,但是确实会有一些redo。
2 NOLOGGING不能避免所有后续操作生成redo。在前面的例子中,我创建的并非不生成日志的表。只是创建表(CREATE TABLE)
这一个操作没有生成日志。所有后续的“正常“操作(如INSERT、UPDATE和DELETE)还是会生成日志。其他特殊的操作(如
使用SQL*Loader的直接路径加载,或使用INSERT /*+ APPEND */语法的直接路径插入)不生成日志(除非你ALTER这个表,
再次启用完全的日志模式)。不过,一般来说,应用对这个表执行的操作都会生成日志。
3 在一个ARCHIVELOG 模式的数据库上执行NOLOGGING 操作后,必须尽快为受影响的数据文件建立一个新的基准备份,从而
避免由于介质失败而丢失对这些对象的后续修改。实际上,我们并不会丢失后来做出的修改,因为这些修改确实在重做日志中;
我们真正丢失的只是要应用这些修改的数据(即最初的数据)。

有许多朋友误已写SQL或把表的属性加NOLOGGING,就可以不采成日志。这是一个误解。

在数据迁移或大量的数据insert入库时,由于大量数据的insert或修改,经常引起redo log sync的等待,造成数据库性能缓慢。
因为许多朋友对NOLOGGING的误解,所以许多人在insert数据时,在SQL后加nologging,想通过该用法使操作不采生日记录。但无效果。
这里讨论nologging的具体用法:

数据库操作,只有如下几种情况下不产成redo记录:
1.用sql*load的direct load方式时,不采用redo记录
2.用insert的direct方式,即在append方式insert
3.create table .... as select
4.create index
5.alter table ... move partition
6.alter table ... split partition
7.alter index ... split partition
8.alter index ... rebuild
9.alter index ... rebuild partition
10.INSERT, UPDATE, and DELETE on LOBs in NOCACHE NOLOGGING mode stored out of line 
 

参考文章:http://hi.baidu.com/bystander1983/blog/item/ceea53edd6409c2e62d09ff1.html

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23135684/viewspace-660708/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Redo RBA
请登录后发表评论 登录
全部评论
Oracle数据库管理员,Oracle数据库系统构架员;2012年7月出版《构建最高可用Oracle数据库系统:Oracle 11gR2 RAC管理、维护与性能优化》一书;Oracle 10g OCM。

注册时间:2010-01-05

  • 博文量
    483
  • 访问量
    5648606