精华内容
下载资源
问答
  • 关于oracleNOLOGGING

    千次阅读 2012-02-24 17:22:48
    关于oracleNOLOGGING OracleSQL 可以采用NOLOGGING模式执行以下操作: 1 索引的创建和ALTER(重建)。 2 表的批量INSERT(通过/*+APPEND */提示使用“直接路径插入“。或采用SQL*Loader直接路径加载...
     
    
    可以采用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 操作后,必须尽快为受影响的数据文件建立一个新的基准备份,从而
    避免由于介质失败而丢失对这些对象的后续修改。实际上,我们并不会丢失后来做出的修改,因为这些修改确实在重做日志中;
    我们真正丢失的只是要应用这些修改的数据(即最初的数据)。

    展开全文
  • oracle nologging 总结

    2020-04-11 18:03:17
    oracle nologging全面总结,从数据库级别,对象以及表级别都有说明,以及在生产环境的影响,和及时止损的处理方法。
  • Oracle nologging

    2013-12-15 00:10:49
    The size of a redo log generated for an operation in NOLOGGING mode is significantly smaller than the log generated in LOGGING mode. The NOLOGGING clause causes minimal redo information to be gener
    The size of a redo log generated for an operation in NOLOGGING mode is significantly smaller than the log generated in LOGGING mode.
    

    The NOLOGGING clause causes minimal redo information to be generated during the table creation. And direct-path inserts will not be logged.

    However, DML statements (UPDATE, DELETE, and conventional path insert) are unaffected by the NOLOGGING attribute of the table and generate redo.

    If the object for which you are specifying the logging attributes resides in a database or tablespace in force logging mode, then Oracle Database ignores any NOLOGGING setting until the database or tablespace is taken out of force logging mode.




    展开全文
  • ORACLE NOLOGGING研究

    千次阅读 2014-12-18 12:11:10
    熟悉oracle的人都知道,通过设置oraclenologging选项,可以使某些操作快速完成,风险是数据库备份可能失效。可以使用nologging的操作有很多,搜集资料整理如下: 1.索引的创建和ALTER(重建)。 2.表的批量...

    熟悉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操作始终是在新块上保存编辑后数据。



    展开全文
  • oracle nologging用法

    千次阅读 2016-07-12 14:46:04
    一、oracle日志模式分为(logging,force logging,nologging) 默认情况是logging,就是会记录到redo日志中,force logging是强制记录日志,nologging是尽量减少日志。FORCE LOGGING可以在数据库级别、表空间...

    http://www.cnblogs.com/zmlctt/p/3747443.html

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

    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    

            查看对象级别的日志记录模式

            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语句。因此在有业务运行的上传环境下要慎重使用。


    展开全文
  • oracle nologging operation

    2014-03-20 14:30:19
    我们都知道redo日志是oracle恢复的基础,但是有时候我们为了增加数据库运行的速度常常会通过减少redo log的产生来加快数据库的运行速度。 一般常规的dml语句insert、update、delete是不能制止redo log 的,这是...
  • Oracle DML NOLOGGING

    2011-10-17 18:15:41
    Nologging 并不是不产生redo,nologging + direct 只是不会对数据产生 redo(但依然有其他的redo)。 同理 logging + direct 下 undo 也是大大地减少, 减少的是 数据的undo ,这里强调的是 数据...
  • oracle启用nologging

    2010-04-26 01:25:02
    Oracle启用nologging 以下操作可以启用nologging1.创建索引或重建索引。 2.通过/*+APPEND*/提示,使用直接路径(Direct Path)批量INSERT操作或3.SQL*Loader 直...
  • Oracle Nologging And Append

    千次阅读 2013-03-07 09:30:01
    转载地址 ... 自己测试 如下 环境:10.2.0.4(单机,没开归档) SQL> alter table t_dz_test nologging; Table altered. SQL> set timing on SQL> insert /*+append*/ into t_dz_te
  • oracle nologging append 注意

    千次阅读 2012-05-17 14:36:15
    oracle nologging append 注意 1. append方式添加记录对insert into ... values语句不起作用。 2. 以append方式批量插入的记录,其存储位置在hwm 之上,即使hwm之下存在空闲块也不能使用
  • Know more about Oracle Nologging 2010/01/13 BY MACLEAN LIU 暂无评论
  • oracleNOLOGGING

    2013-08-22 16:46:20
    可以采用NOLOGGING模式执行以下操作: 1 索引的创建和ALTER(重建)。 2 表的批量INSERT(通过/*+APPEND */提示使用“直接路径插入“。或采用SQL*Loader直接路径加载)。表数据不生成redo,但是 所有索引修改会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,453
精华内容 3,781
关键字:

nologgingoracle