如果我没有在Oracle中的数据库对象中指定日志记录/ nologging会发生什么?我的意思是说如何在数据库对象中记录/ nologging并且在数据库对象中没有记录/ nologging?
LOGGING/NOLOGGING有助于管理启用直接路径写入,以减少REDO和UNDO的生成.它是控制可恢复性和性能之间微妙平衡的几种方法之一.
Oracle架构背景信息
REDO是Oracle提供耐久性的方式,即ACID中的"D".提交事务时,更改不一定整齐地存储在数据文件中.这使事情变得更快,并让后台进程处理一些工作.REDO是对变化的描述.它可以快速存储在多个磁盘上的"哑"日志中.更改很快,如果服务器在提交返回后的1微秒内断电,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
FORCE LOGGING可以覆盖所有这些设置.可能还有其他一些我不知道的开关.当然还有许多限制可以阻止直接路径 - 触发器,外键,集群,索引组织表等.
规则对索引的限制更多.索引将始终在DML语句期间生成REDO.只有DDL语句,像CREATE INDEX ... NOLOGGING
或ALTER INDEX ... REBUILD
在NOLOGGING指数不会产生REDO.
为什么有这么多方法?因为可恢复性非常重要,不同的角色可能对此事有不同的看法.有时一些人的决定需要超越其他人.
开发人员在声明级别决定"插入模式".一些/*+ APPEND */
提示可能会发生许多奇怪的事情,开发人员需要谨慎选择何时使用它.
建筑师在对象层面决定"表格模式".无论开发人员想要插入其中的速度如何,有些表必须始终可以恢复.
数据库管理员决定数据库或表空间模式,"归档日志"和FORCE LOGGING.也许组织不关心恢复特定数据库,因此将其设置为NOARCHIVELOG模式.或者组织可能有一个严格的规则,一切都必须是可恢复的,因此将表空间设置为FORCE LOGGING.