oracle - Oracle 中的 logging/nologging 选项的目的是什么

标签 oracle oracle11g

如果我不在 Oracle 的数据库对象中指定 logging/nologging 会发生什么?我的意思是说,在数据库对象中使用日志记录/无日志记录以及在数据库对象中没有日志记录/无日志记录会如何表现?

最佳答案

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

FORCE LOGGING 可以覆盖所有这些设置。可能还有一些我不知道的其他开关。当然,还有许多限制阻止直接路径 - 触发器、外键、集群、索引组织表等。

这些规则对索引的限制更大。在 DML 语句期间,索引将始终生成 REDO。只有 DDL 语句,如 CREATE INDEX ... NOLOGGINGALTER INDEX ... REBUILD在 NOLOGGING 索引上不会生成 REDO。

为什么有这么多方法?因为可恢复性非常重要,不同的角色可能对此事有不同的看法。有时有些人的决定需要凌驾于其他人之上。

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

建筑师在对象级别决定“表格模式”。某些表,无论开发人员想多快插入其中,都必须始终是可恢复的。

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

关于oracle - Oracle 中的 logging/nologging 选项的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34073532/

相关文章:

java - 在 preparedStatement 中使用 oracle 的 to_date

sql - Oracle中修改ROUND UP函数

database - Oracle SID 和服务名称;连接问题

oracle - Oracle 包中的最大行数

json - 如何清除APEX_JSON写入的json对象

sql - 比较 2 个表以检查差异

sql - 根据列数据生成序列号

javascript - 在 Oracle APEX v4.2.2 中通过 Ajax 调用 Oracle 函数以进行现场验证

oracle - 清除 Oracle session 状态

sql - Oracle 11g复合触发器的应用