2015-12-03 52 views
2

如果我没有在Oracle中的数据库对象中指定记录/记录,会发生什么?我的意思是说如何在数据库对象中记录日志/不记录/不记录数据库对象中的/ nologging?在Oracle中记录/记录选项的目的是什么

+0

感谢所有人,Jon Heller只是一个问题;你已经提到过,在图表下方“NOLOGGING选项只对重建期间的索引有帮助。”这是什么意思?我不明白,我真的很感谢你的支持 – Sohel

回答

1

如果您有带有nologging的表/索引,则当使用直接路径方法(如insert/* + append * /)将数据插入对象时,不会生成重做。

但是,如果数据库处于强制日志模式,那么nologging不会有任何影响。生成重做是否表/索引处于日志记录模式或记录模式。

0

如果设置了nologging选项,插入数据时不会生成重做日志。插入大量数据时,可以使用它来显着提高INSERT语句的性能。

在数据保护设置下,千万小心千万不要使用nologging选项。数据库复制依赖于redolog,所以它会创建一个很大的混乱,你当然想避免。

4

LOGGING/NOLOGGING帮助管理启用直接路径写入,以减少REDO和UNDO的产生。这是控制可恢复性和性能之间微妙平衡的几种方法之一。

Oracle体系结构的背景信息

REDO是甲骨文如何ACID提供了耐用性,在 “d”。当提交事务时,更改不一定存储在数据文件中。这可以让事情保持快速并让后台进程处理一些工作。重做是对变化的描述。它在多个磁盘上快速存储在“哑”日志中。更改速度很快,如果服务器在提交返回后一微秒失去电源,Oracle可以通过REDO日志来确保更改不会丢失。

UNDO帮助Oracle提供一致性,即A中的“C”。它存储了如何反转更改的说明。另一个正在读取表的进程需要该信息,并且需要知道使用的值是否处于较早的时间点。

直接路径写入跳过REDO,UNDO,缓存等一些功能,并直接修改数据文件。在许多环境中这是一个快速但潜在危险的选择,这就是为什么有太多令人困惑的选项来控制它。直接路径写入仅适用于INSERTS,并且仅适用于下面描述的情况。

如果您什么都不做,默认选项是最安全的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语句(如NOLOGGING索引中的CREATE INDEX ... NOLOGGINGALTER INDEX ... REBUILD)不会生成REDO。

为什么有这么多的方式?由于可恢复性非常重要,不同的角色可能会对此问题有不同的看法。有时候有些人的决定需要压倒他人。

开发人员决定在语句级别“插入模式”。许多奇怪的事情可能会在/*+ APPEND */暗示中发生,开发人员需要仔细选择何时使用它。

建筑师决定在对象层面,“表模式”。不管开发人员想要插入多少表格,都必须始终可恢复。

数据库管理员决定在数据库或表空间模式,“归档日志”和FORCE LOGGING。也许组织不关心恢复特定数据库,因此将其设置为NOARCHIVELOG模式。或者,也许组织有一条严格的规则,即一切都必须可恢复,因此将表空间设置为FORCE LOGGING。