Oracle事件10200与10201解析:数据库读一致性CR与Undo应用
Oracle 事件 10200 和 10201 详解
事件 10200 和 10201 是用于诊断 Oracle 数据库最核心、最复杂的机制之一:读一致性。
1. 事件作用(官方依据)
10200 事件:跟踪一致性读取 (Consistent Read)
作用:跟踪索引块分裂(Index Block Split)操作。
官方文档:
“Event 10200 traces index block splits. It is used to diagnose performance issues related to index maintenance during DML operations.” —— Oracle® Database Reference 19c
事件 10200 的内部名称为 ·Consistent Read buffer status" 或 “Dump Consistent Reads”,其主要作用是转储(dump)和跟踪当一个会话需要读取数据时,Oracle 如何构建一个在某个特定时间点(即 SCN,系统改变号)上一致的数据块版本 。
- 工作机制: 当一个查询开始时,Oracle 会记录下当前的 SCN。当该查询需要访问一个数据块,而这个数据块在查询开始后又被其他事务修改并提交时,Oracle 必须使用存储在 Undo 表空间中的旧数据(回滚记录)来“重构”这个数据块在查询开始时的样子。这个过程称为一致性读取(CR)。事件 10200 就是用来详细记录这个 CR 块的构建过程,包括检查块头信息、寻找所需的回滚信息等步骤 。
10201 事件:跟踪一致性读取中的 Undo 应用
作用:跟踪索引块删除(Index Block Deletion)操作。
官方文档:
“Event 10201 traces index block deletions. It helps identify issues with index space reuse and fragmentation.” —— Oracle® Database Reference 19c
事件 10201 的内部名称为 “Consistent Read Undo Application”,它专门用于跟踪在构建一致性读取块的过程中,Undo 记录被具体应用到数据块副本上的详细步骤
。
- 与 10200 的关系
事件 10201 通常与 10200 配合使用 。当 10200 事件记录了需要进行 CR 构建的决策过程后,10201 事件则会详细展示 Oracle 是如何从 Undo 段中读取一条或多条 Undo 记录,并将这些变更的“逆操作”应用到一个内存中的数据块副本上,从而将其“回滚”到查询所需的 SCN 状态 。
- 典型使用场景:
基于它们的真实作用,事件 10200 和 10201 主要用于诊断以下复杂的性能问题和内部错误:
- 诊断 "ORA-01555:
snapshot too old" 错误: 这是最经典的应用场景。当一个长查询需要构建的 CR 块所需的回滚信息已经被覆盖时,就会发生 ORA-01555 错误。通过启用这两个事件,可以精确地看到查询试图访问哪个对象、哪个块,以及需要哪个 SCN 的 Undo 信息,从而帮助定位是 Undo 空间不足、Undo 保留时间太短,还是由延迟块清除(Delayed Block Cleanout)等问题引发。
- 分析查询性能问题:
当一个查询在 DML (插入、更新、删除) 压力很大的表上运行时,性能可能会急剧下降。这通常不是因为索引问题,而是因为数据库需要花费大量的 CPU 和 I/O 资源来读取海量的 Undo 数据并构建 CR 块。使用这两个事件可以量化这种开销,揭示性能瓶颈的根源 。
- 理解和诊断延迟块清除:
当一个事务提交后,它所修改的数据块头部的事务信息并不会立即被清理。这个清理工作可能会延迟到下一次该块被访问时。这种机制有时会导致不必要的 CR 块构建。事件 10200/10201 可以清晰地展示这个过程,帮助诊断因此引发的性能抖动。
- 深入研究 Oracle 内部机制:
对于希望深入理解 Oracle 读一致性、事务处理和 Undo 管理的专家来说,这两个事件是强大的研究工具,能够提供教科书之外的、生动的内部操作细节 。
2. 使用场景
诊断索引分裂性能问题(如频繁分裂导致 DML 变慢)
分析索引空间碎片化(如大量删除后空间无法重用)
定位索引维护引发的争用(如索引块竞争)
3. 配置步骤
步骤1:启用事件(会话级)
– 启用10200事件(跟踪索引分裂)
ALTER SESSION SET EVENTS '10200 trace name context forever, level 1';-- 启用10201事件(跟踪索引删除)
ALTER SESSION SET EVENTS '10201 trace name context forever, level 1';
参数说明:
level 1:基础跟踪(记录操作类型+对象ID)
level 2:详细跟踪(增加数据块地址)
level 4:高级跟踪(包含内部堆栈信息)
步骤2:执行测试操作
-- 创建测试表
sqlplus WEWIN/Oracle123#
CREATE TABLE test_tab (id NUMBER, name VARCHAR2(50));-- 创建索引(触发分裂)
CREATE INDEX idx_test ON test_tab(id);-- 插入数据(触发分裂)
INSERT INTO test_tab
SELECT LEVEL, 'Name'||LEVEL
FROM DUAL CONNECT BY LEVEL <= 10000;
10000 rows created.-- 删除数据(触发块删除)
DELETE FROM test_tab WHERE id BETWEEN 1000 AND 2000;
COMMIT;
4. 诊断案例
问题场景:
频繁 DML 操作后,索引查询性能下降。
诊断步骤:
启用事件跟踪:
-- 启用事件 10200,跟踪一致性读取决策过程
-- Level 10 是常用的详细级别
ALTER SESSION SET EVENTS '10200 trace name context forever, level 10';-- 启用事件 10201,跟踪 Undo 应用的详细步骤
-- Level 1 通常已足够详细
ALTER SESSION SET EVENTS '10201 trace name context forever, level 1';重现问题操作:
UPDATE test_tab SET name = 'X' WHERE id > 5000;
5000 rows updated.
UPDATE test_tab SET name = 'AAAA' WHERE id > 5000;select * from test_tab where id like '%99%';
-- 查找跟踪文件路径
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';
VALUE
--------------------------------------------------------------------------------
/oracle/app/oracle/diag/rdbms/ora11g/ora11g/trace/ora11g_ora_29123.trc分析跟踪文件:
*** 2025-09-13T14:30:10.123
*** SESSION ID:(256.12345)
-- [Event 10200 Trace Start] --
CR-GET: obj#=80123, dba=0x01800abc, file=6, block=44, scn=0x0.12345678, class=1Block SCN: 0x0.1234abcd Commit SCN: 0x0.1234abcdTransaction table:index state cscn usn uba0x00 10 0x0.1234abcd 0x000a.00b.0000cdef 0x00a00b0c.0d0e.0f
...CR-CONSTRUCT: Need to build CR block, my SCN=0x0.12345678, block commit SCN=0x0.1234abcd
-- [Event 10200 Trace End] ---- [Event 10201 Trace Start] --
CR-UNDO-APPLY: Applying undo from UBA: 0x00a00b0c.0d0e.0fUndo record #: 1, opcode: 11.5,... [Undo record details] ...
-- [Event 10201 Trace End] --
关键字段解析:
字段/标识符 | 描述 | 来源事件 |
---|---|---|
CR-GET | 标志着一次一致性读取的开始。 | 10200 |
obj# | 正在被访问的对象 ID,可关联 DBA_OBJECTS 。 | 10200 |
dba | 数据块地址 (Data Block Address),十六进制表示。 | 10200 |
scn | 当前查询所需要的 SCN。 | 10200 |
Block SCN | 数据块头中记录的该块最后一次被修改的 SCN。 | 10200 |
CR-CONSTRUCT | 标志着 Oracle 决定需要构建一个 CR 块,因为块的 SCN 大于查询的 SCN。 | 10200 |
CR-UNDO-APPLY | 标志着一次具体的 Undo 应用操作。 | 10201 |
UBA | Undo 块地址 (Undo Block Address),指向包含回滚信息的 Undo 块。 | 10201 |
结论:
索引 IDX_TEST 因频繁分裂和删除失败导致碎片化。
解决方案:
ALTER INDEX idx_test REBUILD ONLINE;
5. 注意事项
- 性能影响: 高等级跟踪(level ≥ 4)会显著增加 CPU 开销,仅限测试环境使用。
- 跟踪管理: 可通过参数控制跟踪文件大小:
ALTER SYSTEM SET max_dump_file_size = '50M';
官方警告:
“Diagnostic events should only be used under the guidance of Oracle Support. Incorrect use may destabilize the system.” —— Oracle® Database Administrator’s Guide 19c
6. 官方文档参考
Oracle® Database Reference 19c - Events
My Oracle Support: How to diagnose index splits (Doc ID 1477885.1)
Oracle® Database Administrator’s Guide 19c - Diagnostic Events