天天看点

Oracle抑制日志(NOLOGGING)

重新学习数据库,何必到时候让DBA擦屁股。

先从Oracle开始了,今天看到了日志文件的这块。参考了众多的书记和网上资料。从Oracle 7开始,支持对某些操作抑制其日志的生成。用于抑制日志的关键字尾UNRECOVERABLE,日志生成的默认关键字为RECOVERABLE。Oracle 8及以后的版本使用关键字LOGGING和NOLOGGING。高版本为了与以前的语法相兼容,保留了关键字UNRECOVERABLE与RECOVERABLE。

默认的情况下,Oracle会记录数据库的所有改变。毫无疑问,生成日志必然会增加一定的开销。我们可以抑制不重要的日志文件的生成以加速某些操作,但是这样做就意味着某些操作没有记录到日志文件里面,当故障发生时,我们也无法恢复刚才的操作。抑制日志的操作可以通过SQL语句来实现,SQL语句中需要包含关键字UNRECOVERABLE(Oracle 7)或者NOLOGGING(Oracle8+)。

我们可以利用此特性来加速大规模操作,而不用反复记录log,进行不必要的I/O操作。如果系统发生故障或者宕机,只需要重复刚才进行的操作。举个例子,在创建表的索引时,没有生成日志的信息,突然发生故障后恢复数据库,因为索引没有被记录在日志文件中,它不会重新被创建,你只能在第一次的位置重新执行创建索引的操作来完成索引的创建。我没有量化测试抑制日志生成到底可以减少消耗多少系统的性能,不过这样在失败时虽然会付出一定的代价,但带来了更好的用户体验。

为了简化故障发生后的操作,一些商家实行了一个标准化过程,既一但那些未记入日志的操作发生后,这尽可能快的备份由这些操作影响而发生变化的数据库部分。这个过程还可以避免由于操作人员忘记重复该操作而产生的问题。如果你无法应付丢失该操作创建的对象的情况,或者因为某些原因不能重复该操作时,那么就必须在一个未记入日志的操作完成之后随时建立备份。

当然,重要过程最好不要抑制,毕竟抑制后的操作存在风险,备份也需要消耗性能,最重要的是别让这个抑制过程本身给你带来问题。

这个只是我自己的见解,如果是一个大型的项目,应该会有自己的nologging规则,必要也许会聘请Oracle的顾问吧

Oracle抑制日志(NOLOGGING)