如果我没有在Oracle中的数据库对象中指定日志记录/ nologging会发生什么?我的意思是说如何在数据库对象中使用日志/ nologging并且不在数据库对象中记录/ nologging?
答案 0 :(得分:12)
LOGGING / NOLOGGING有助于管理启用直接路径写入,以减少REDO和UNDO的生成。它是控制可恢复性和性能之间微妙平衡的几种方法之一。
Oracle架构背景信息
REDO 是Oracle提供耐用性的方式," D"在ACID。提交事务时,更改不一定整齐地存储在数据文件中。这使事情变得更快,并让后台进程处理一些工作。 REDO是对变化的描述。它可以快速存储在多个磁盘上,也可以存储在一个非常简单的存储器中。登录。更改很快,如果服务器在提交返回后1微秒失去电源,Oracle可以通过REDO日志确保更改不会丢失。
UNDO 帮助Oracle提供一致性," C"在ACID。它存储了如何撤消更改的说明。读取表格的另一个流程可能需要此信息,并且需要知道使用的值在较旧的时间点。
直接路径写入跳过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
FORCE LOGGING可以覆盖所有这些设置。可能还有其他一些我不知道的开关。当然还有许多限制可以阻止直接路径 - 触发器,外键,集群,索引组织表等。
规则对索引的限制更多。在DML语句期间,索引始终生成REDO。只有NOLOGGING索引上的CREATE INDEX ... NOLOGGING
或ALTER INDEX ... REBUILD
等DDL语句才会生成REDO。
为什么有这么多方法?因为可恢复性非常重要,不同的角色可能对此事有不同的看法。有时一些人的决定需要超越其他人。
开发人员在声明级别决定"插入模式"。 /*+ APPEND */
提示可能会发生许多奇怪的事情,开发人员需要谨慎选择何时使用它。
建筑师决定对象级别,"表格模式"。无论开发人员想要插入其中的速度如何,有些表必须始终可以恢复。
数据库管理员决定数据库或表空间模式,"归档日志"和FORCE LOGGING。也许组织并不关心恢复特定数据库,因此将其设置为NOARCHIVELOG模式。或者组织有一个严格的规则,一切都必须是可恢复的,所以将表空间设置为FORCE LOGGING。
答案 1 :(得分:1)
如果你有带有nologging的表/索引,那么当使用直接路径方法(如insert / * + append * /)将数据插入对象时,将不会生成重做。
但是,如果数据库处于强制记录模式,那么nologging将不会产生任何影响。无论表/索引处于记录还是记录模式,都会生成重做。
答案 2 :(得分:1)
如果设置了nologging
选项,则在插入数据时不会生成重做日志。在插入大量数据时,可以使用它来显着提高INSERT语句的性能。
小心不要在数据保护设置下使用nologging
选项。数据库复制依赖于重做日志,因此它会造成你当然想要避免的相当大的混乱。