Oracle数据库Undo大小在dml操作后未清除

问题描述 投票:0回答:1

尝试了解撤消大小行为。我最初运行下面的查询并记下这些值。实际撤消次数为 2500,撤消保留次数为 900,所需撤消大小为 430。然后我通过执行 ' insert into t1 select * from t1' 对系统(db)进行压力测试。分 3 个会话并行运行此插入,每次插入需要 16 分钟才能完成。

在插入运行时,我刷新了撤消查询并观察到所需的撤消大小从 430 增长到 899。

但是在 dml 完成之后。需要撤消仍然是 899 。我有点期望它在操作后被清除并返回到原始值,即 430 。请帮助我理解这种行为以及如何将撤消恢复到其初始值

SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
(TO_NUMBER(e.value) * TO_NUMBER(f.value) *
g.undo_block_per_sec) / (1024*1024)
"NEEDED UNDO SIZE [MByte]"
FROM (
SELECT SUM(a.bytes) undo_size
FROM v$datafile a,
v$tablespace b,
dba_tablespaces c
WHERE c.contents = 'UNDO'
AND c.status = 'ONLINE'
AND b.name = c.tablespace_name
AND a.ts# = b.ts#
) d,
v$parameter e,
v$parameter f,
(
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
undo_block_per_sec
FROM v$undostat
) g
WHERE e.name = 'undo_retention'
AND f.name = 'db_block_size'
/
database oracle undo undo-redo
1个回答
0
投票

你不能像那样监控UNDO tbs。 UNDO tbs 服务器 Oracle 的 MVCC。 每个 SQL 看到的数据都是 SQL 执行时的数据。 如果在 SQL 运行时修改记录,则从 UNDO 读取上一条记录。

没有清理UNDO的过程,不需要清理。当其他会话需要存储其他UNDO时,它会覆盖UNDO。

唯一的问题是当一个会话覆盖 UNDO 时可能会被其他会话使用。这被称为“偷窃”,

v$undostat
中有一个专栏就是用于此目的的。当发生这种情况时,其他 SQL 可能会失败并显示“ORA-01555:快照太旧” - 这意味着在 UNDO 中找不到旧版本的数据。

PS:undo_retention参数仅用于可自动扩展的UNDO tbs。它驱动 UNDO tbs 数据文件的扩展。当您有固定大小的UNDO(并且您应该有)时,此参数将被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.