【发布时间】:2015-12-05 09:47:52
【问题描述】:
如果我没有在 Oracle 中的数据库对象中指定日志记录/不记录,会发生什么情况?我的意思是说在数据库对象中记录/不记录以及在数据库对象中不记录/不记录将如何表现?
【问题讨论】:
-
感谢大家,向 Jon Heller 提出一个问题;您已经提到,在图表下方“NOLOGGING 选项仅有助于重建期间的索引。”那是什么意思?我不明白,我非常感谢您的支持
如果我没有在 Oracle 中的数据库对象中指定日志记录/不记录,会发生什么情况?我的意思是说在数据库对象中记录/不记录以及在数据库对象中不记录/不记录将如何表现?
【问题讨论】:
LOGGING/NOLOGGING 有助于管理启用直接路径写入,以减少 REDO 和 UNDO 的生成。这是控制可恢复性和性能之间微妙平衡的几种方法之一。
Oracle 架构背景信息
REDO 是 Oracle 提供持久性的方式,即 ACID 中的“D”。提交事务时,更改不一定整齐地存储在数据文件中。这样可以保持速度并让后台进程处理一些工作。 REDO 是对更改的描述。它被快速存储在多个磁盘上的“哑”日志中。更改很快,如果服务器在提交返回后一微秒断电,Oracle 可以检查 REDO 日志以确保更改不会丢失。
UNDO 帮助 Oracle 提供一致性,即 ACID 中的“C”。它存储有关如何撤消更改的描述。另一个正在读取该表的进程可能需要此信息,并且需要知道在较早的时间点使用的值是什么。
直接路径写入跳过REDO、UNDO、缓存等一些特性,直接修改数据文件。在许多环境中,这是一个快速但有潜在危险的选项,这就是为什么有这么多令人困惑的选项来控制它。直接路径写入仅适用于 INSERTS,并且仅适用于以下描述的场景。
如果你什么都不做,默认选项是最安全的,LOGGING。
控制直接路径写入的多种方法
LOGGING/NOLOGGING 是控制直接路径写入的几个选项之一。查看来自AskTom 的表格,了解不同选项如何协同工作:
Table Mode Insert Mode ArchiveLog mode result
----------- ------------- ----------------- ----------
LOGGING APPEND ARCHIVE LOG redo generated
NOLOGGING APPEND ARCHIVE LOG no redo
LOGGING no append ARCHIVE LOG redo generated
NOLOGGING no append ARCHIVE LOG redo generated
LOGGING APPEND noarchive log mode no redo
NOLOGGING APPEND noarchive log mode no redo
LOGGING no append noarchive log mode redo generated
NOLOGGING no append noarchive log mode redo generated
强制记录可以覆盖所有这些设置。可能还有其他一些我不知道的开关。当然还有许多限制阻止直接路径 - 触发器、外键、集群、索引组织表等。
这些规则对索引的限制更加严格。在 DML 语句期间,索引将始终生成 REDO。只有 DDL 语句,如 NOLOGGING 索引上的 CREATE INDEX ... NOLOGGING 或 ALTER INDEX ... REBUILD 不会生成 REDO。
为什么有这么多方法?因为可恢复性非常重要,不同的角色可能对此事有不同的看法。有时有些人的决定需要凌驾于其他人之上。
开发人员在语句级别决定“插入模式”。 /*+ APPEND */ 提示可能会发生许多奇怪的事情,开发人员需要谨慎选择何时使用它。
架构师在对象级别决定“表格模式”。有些表,无论开发人员希望以多快的速度插入其中,都必须始终是可恢复的。
数据库管理员决定数据库或表空间模式、“归档日志”和强制记录。也许组织只是不关心恢复特定数据库,因此将其设置为 NOARCHIVELOG 模式。或者,也许组织有一个严格的规则,即一切都必须是可恢复的,所以将表空间设置为 FORCE LOGGING。
【讨论】:
如果你有没有记录的表/索引,那么当使用诸如插入/*+附加*/等直接路径方法将数据插入对象时不会生成重做。
但是,如果数据库处于强制记录模式,则 nologging 不会有任何影响。无论表/索引处于日志记录模式还是无日志记录模式,都会生成重做。
【讨论】:
如果设置了nologging 选项,则插入数据时不会生成重做日志。在插入大量数据时,您可以使用它来显着提高例如 INSERT 语句的性能。
小心不要在数据保护设置下使用nologging 选项。数据库复制依赖于重做日志,所以它会造成你当然想避免的相当大的混乱。
【讨论】: