Oracle nologging日志模式

2023年 12月 23日 73.7k 0

一、Oracle日志模式分类

    Oracle日志模式有logging、force logging、nologging三种,默认情况是logging,对数据库所做的修改会记录到redo日志中,force logging是强制数据库在任何状态下必须记录日志(但不会比一般logging记录的日志多),nologging是尽量减少日志。

    force logging可以在数据库级别、表空间级别设置,而logging与nologging可以在表级别设置,如果数据库级别设置了force logging,所有的nologging选项都会失效。

    logging,force logging和nologging是只记录到redo日志中,归档不归档是另外的设置,但如果用了nologging,记录的日志少了,就算归档的话,归档也随之而少了,因此可能不能用于介质恢复,例如DATAGUARD。

 

二、使用情况

    1.logging模式

    这是日志记录的缺省模式,临时表空间不会记录日志到联机重做日志文件,TEMP表空间默认也是NOLOGGING。

 

    2.nologing模式

    nologging是最小化日志产生的数量,不是不记录日志,通常会和append联合使用。

    (1)append 属于direct insert,归档模式下append+table nologging会大量减少日志,非归档模式下只要使用append就会大量减少日志。

    使用append,可以减少redolog的产生,同时可以减少对空间的搜索,在使用了append选项后insert操作会直接加到表的最后面,而不会搜索表的空闲块来插入,也就是说使用append的话会在表的高水位上分配空间,不再循环使用空闲空间,所以append方式会快很多,一般用于大数据量的处理。建议不要经常使用append,这样表空间会一直在高水位上。

    查询当前redo大小语句:

    select name,value,class from v$sysstat where name='redo size';

    (2)NOLOGGING与表模式,插入模式,数据库运行模式(archivelog/noarchivelog)的关系:

    下面仅说明使用append方式插入数据时日志产生的情况,如使用下面的方式进行插入:

    insert /*+append+*/ into test1 select ……;

    注意:insert语句后面必须是select语句,否则无效!!

本次测试中的2个表test1和test2,test1是默认的logging模式,test2设置成nologging模式。

情况1:在非归档模式下,使用append就会大量减少redo的生产

 

情况2:在非归档模式下,不使用append的话都会记录日志,而且logging和nologging模式下记录的日志大小差不多。

 

情况3:在归档模式下,不使用append的话logging和nologging都会产生redo,而且大小差不多。

情况4:在归档模式下,使用append的话nologging不会生成redo,而且比logging节省时间。

 

三、总结

非归档模式下:

(1)单独使用nologging,对redo的产生没有什么影响。

(2)使用append,redo的减少就会很显著。

归档模式下:

(1)单独使用nologging,对redo的产生没有什么影响。

(2)单独使用append,对redo的产生没有什么影响。

(3)nologging + append,redo的减少很显著。

 

1. 不管哪种模式下append要与nologging方式联用才能达到很好的效果。

2. 非归档与归档方式,只用nologging是不起效果的。

3. 非归档下append已达到不错的效果,但与nologging联用效果更好。

4. 归档模式下单独使用append起不到效果。

5. 如果数据库处于FORCELOGGING模式下,无论怎样nologging都是无效的。

6. 使用append可以实现直接路径加载,速度比常规加载方式快很多,但需要注意的是使用了append之后会在表上加“6”类型的Exclusive锁,即排它锁,为表级锁,会阻塞表上的所有DML语句,如果这个表有业务运行的情况下需要慎用。

    从上面可以看到sid为1的会话使用了append向test2的表插入1行后没commit或者rollback,然后我在sid为66的会话想再插入一行,发现一直堵塞无法完成,查锁发现TEST2这表加上了”6”类型的锁。如果没用使用append则其它会话可以正常insert,就不做测试了。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论