Oracle 无日志记录对 REDO 生成的影响

Sur*_*tam 1 performance oracle

Oracle 数据库处于开启noarchivelog模式,并tablespace配置了nologging选项,保持不会出现恢复任何数据的情况。

ETL过程中发生了以下场景:

  1. 第一小时的 AWR 在负载配置文件中显示每秒 15GB,每笔事务 131K。
  2. 第一小时 AWR 显示“实例活动统计信息”中记录了 54TB 重做生成

我想知道为什么在这种情况下会生成如此大量的重做。

考虑以下过度重做的上下文:

  1. 众所周知,字典特定的表空间被强制进行日志记录。
  2. 考虑到这NOLOGGING无论如何不适用于由MERGE语句产生的任何 UPDATE 操作。
  3. NOLOGGING 是通过 CTAS 和 DML(如插入)显式指定的,并使用 /*+ APPEND */插入语句的提示来绕过日志记录,即使 nologging 选项在表/表空间级别处于活动状态也是如此。

问题:

  1. 1, 2 and 3除了生成如此大容量的 REDO之外,任何人都可以看到任何其他考虑因素吗?
  2. 在 #2 的情况下,54TB(似乎简单地通过每秒 15G X 60 分钟 X 60 小时计算)重做生成在一小时窗口内是不可能的。怀疑 Oracle AWR 报告存在一些错误,它应该是自 Oracle 启动以来生成的全部重做。
  3. 怀疑每秒生成的重做值存在错误。

非常感谢对上述问题和考虑的任何建设性答案,以便如果我错了,我可以纠正自己。

Jon*_*ler 5

为了深入了解这个问题,您可能需要识别生成 REDO 的 SQL 语句。不幸的是,我认为没有任何简单、完全自动化的方法来检测每个 SQL 的 REDO。

但追踪最糟糕的 SQL 语句通常并不困难。由于您已经有了 AWR,请查看 SQL 统计信息部分,按已用时间排序。如果有很多 REDO,那么其中一个语句可能会突出。例如,如果顶部语句是UPDATEDELETEMERGE (UPDATE)或 ,INSERT不带提示(或带错误提示)。

可能最上面的语句都是 CTAS 或INSERT /*+ APPEND */. 在这种情况下,请查看每个顶级语句的解释计划,例如使用“select * from table(dbms_xplan.display_awr(sql_id => 'sql_id from AWR')); 如果执行计划表示LOAD AS SELECT那么它正在使用直接路径插入并且可以”。如果它说LOAD TABLE CONVENTIONAL,那就是问题陈述。

可能它们都没有问题,但是 REDO 是由索引生成的。索引不会生成 REDO 的唯一方法是索引设置为NOLOGGING并且索引是在INSERT. 索引NOLOGGING仅适用于索引DDL。您可能需要删除/禁用并重新创建/重建索引以减少 REDO。

INSERT根据我的经验,语句未在直接路径写入中运行的最可能原因是:

  1. 目标表上启用外键索引,使用引用分区时除外
  2. 错误的提示语法。例如,如果加号前面有一个空格,如下所示:/* +。或者如果提示放置在稍微错误的位置,就像这样 INSERT INTO /*+ append */ ...
  3. 不支持的奇怪数据类型。我记不太清了,但我认为 LOB 有一些额外的限制,比如您可能需要分区。
  4. 目标表上的触发器。
  5. 可能还有其他一些我忘记的原因。

把完整的SQL语句和执行计划贴出来,我们或许可以帮助调查。

如果这些都没有帮助,那么可能是 AWR 错误。每秒 15GB 非常高,但并非不可能。如果 Exadata 系统能够实现这一点,我不会感到太惊讶。