暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Undo 管理的 10 大惊人真相与救赎之路,掌握这套脚本全解决

点击上方蓝字,关注我们


想学会更多实用技巧,欢迎加入青学会MOP技术社区(实名社区)。

加入方法:公众号后台回复关键字“加入”获取小助手微信,添加后登记入会。

同时欢迎大家在评论区留言互动交流!社区会不定期举行相关的抽奖、公开分享活动。

如果你有想了解的知识点希望我们发文可以后台私信。

最近联合几个 Oracle ACE技术专家 开通了一个付费微信群,都是具有10多年金融、医疗、制造业10年以上的一线专家,坑位费399/人,无限期,目前群内近135。加群后会有一些福利(分享各类技术文档,干货资源,问题解答等等),更有特邀嘉宾会定期在群内直播,解读AWR,快问快答等!有问题我们尽量都解答,毕竟399不能都解决所有问题。有兴趣联系微:ywu0613

内部知识库正在筹建中,不止有oracle!


正文开始

在 Oracle 数据库的运维工作中,Undo 管理是一个至关重要的环节。Undo 数据不仅关系到数据库的事务回滚能力,还直接影响到数据一致性和性能表现。本文将带你深入了解 Undo 管理的关键知识点,包括如何检查和调整 Undo 表空间的自动扩展、属性设置、大小优化,以及如何监控 Undo 的使用情况。通过实际案例和 SQL 示例,帮助你更好地掌握 Undo 管理技巧,提升数据库运维效率。


检查 Undo 表空间是否自动扩展

查询 Undo 表空间文件属性

要确保数据库的 Undo 表空间能够根据需要自动扩展,首先需要检查其文件属性。通过以下 SQL 查询,可以查看 Undo 表空间的数据文件是否启用了自动扩展功能,以及当前的使用情况和最大容量。

SET linesize 1000 pagesize 1000
COL FILE_NAME FOR A50
COL TABLESPACE_NAME FOR A50
COL AUTOEXTENSIBLE FOR A15
COL STATUS FOR A10
COL MAXBYTES FOR A15

SELECT FILE_NAME, TABLESPACE_NAME, AUTOEXTENSIBLE, STATUS
       MAXBYTES  1024 / 1024 / 1024 MAX_GB, 
       USER_BYTES  1024 / 1024 / 1024 USER_GB 
FROM   DBA_DATA_FILES 
WHERE  TABLESPACE_NAME LIKE '%UNDO%';

复制

查询结果解读

  • FILE_NAME:Undo 表空间的数据文件路径。
  • TABLESPACE_NAME:表空间名称,通常以 UNDOTBS
     开头。
  • AUTOEXTENSIBLE:是否启用自动扩展,YES
     表示启用,NO
     表示未启用。
  • STATUS:文件状态,通常为 ONLINE
  • MAX_GB:文件的最大容量(以 GB 为单位)。
  • USER_GB:当前已使用的容量(以 GB 为单位)。

实际案例

假设查询结果显示 AUTOEXTENSIBLE
 为 NO
,且 USER_GB
 接近 MAX_GB
,这表明 Undo 表空间可能无法满足未来的扩展需求。此时,建议启用自动扩展功能或增加表空间的最大容量。


查看 Undo 表空间属性

查询 Undo 表空间属性

通过以下 SQL 查询,可以查看 Undo 表空间的属性,包括自动扩展设置和数据保留时间(Retention)。

SELECT B.TABLESPACE_NAME, AUTOEXTENSIBLE, RETENTION 
FROM   DBA_TABLESPACES A, DBA_DATA_FILES B  
WHERE  A.TABLESPACE_NAME = B.TABLESPACE_NAME 
       AND B.TABLESPACE_NAME LIKE 'UNDOTBS%';

复制

查询结果解读

  • TABLESPACE_NAME:表空间名称。
  • AUTOEXTENSIBLE:是否启用自动扩展。
  • RETENTION:数据保留时间(以秒为单位)。

实际案例

如果查询结果显示 RETENTION
 时间较短(如 3600 秒,即 1 小时),可能需要根据业务需求调整保留时间,以确保足够的 Undo 数据保留。


调整 Undo 时长或大小

查询 Undo 大小和保留时间

在调整 Undo 表空间的大小或保留时间之前,需要了解当前的 Undo 使用情况和建议的优化值。以下 SQL 查询可以帮助你获取这些信息。

查询实际 Undo 大小和建议的保留时间

SET LINE 1000 PAGESIZE 1000
COL UNDO_RETENTION[Sec] FOR A30

SELECT D.UNDO_SIZE (1024 * 1024 * 1024"ACTUAL_UNDO_SIZE[GB]",
       SUBSTR(E.VALUE, 125"UNDO_RETENTION[Sec]",
       ROUND((D.UNDO_SIZE (TO_NUMBER(F.VALUE) * G.UNDO_BLOCK_PER_SEC))) "OPTIMAL_UNDO_RETENTION[Sec]"
FROM (
SELECTSUM(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,
(
SELECTMAX(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';

复制
  • **ACTUAL_UNDO_SIZE[GB]**:当前 Undo 表空间的实际大小(以 GB 为单位)。
  • **UNDO_RETENTION[Sec]**:当前的 Undo 保留时间(以秒为单位)。
  • **OPTIMAL_UNDO_RETENTION[Sec]**:建议的 Undo 保留时间(以秒为单位)。

调整 Undo 保留时间

如果磁盘空间紧张,可以通过调整 UNDO_RETENTION
 参数来减少 Undo 数据的保留时间。以下示例将保留时间设置为 3 小时(10800 秒)。

ALTER SYSTEM SET UNDO_RETENTION = 10800 SCOPE = BOTH;

复制

调整 Undo 表空间大小

如果磁盘空间充足,可以增加 Undo 表空间的大小,以确保足够的 Undo 数据存储。通过以下 SQL 查询,可以计算所需的 Undo 表空间大小。

查询所需 Undo 表空间大小

SET LINE 1000 PAGESIZE 1000
COL UNDO_RETENTION FOR A50
COL DB_BLOCK_SIZE FOR A50

SELECT UR UNDO_RETENTION,
       DBS DB_BLOCK_SIZE,
       ((UR * (UPS * DBS)) + (DBS * 24))  1024 / 1024AS"USED(MB)"
FROM (
SELECTVALUEAS UR
FROM   V$PARAMETER
WHERENAME = 'UNDO_RETENTION'
),
(
SELECT (SUM(UNDOBLKS)  SUM((END_TIME - BEGIN_TIME) * 86400)) UPS
FROM   V$UNDOSTAT
),
(
SELECTVALUEAS DBS
FROM   V$PARAMETER
WHERENAME = 'DB_BLOCK_SIZE'
);

复制

查询结果解读

  • UNDO_RETENTION:Undo 保留时间(以秒为单位)。
  • DB_BLOCK_SIZE:数据库块大小(以字节为单位)。
  • **USED(MB)**:所需的 Undo 表空间大小(以 MB 为单位)。

实际案例

假设查询结果显示 USED(MB)
 为 1024 MB(即 1 GB),而当前 Undo 表空间大小为 512 MB,建议增加 Undo 表空间的大小,以满足业务需求。


查看 Undo 中 SQL 语句的占用情况

查询 Undo 使用情况

通过以下 SQL 查询,可以查看 Undo 中 SQL 语句的占用情况,了解哪些查询消耗了最多的 Undo 空间。

SELECT *
FROM (
SELECT MAXQUERYID,
         ROUND(SUM(UNDOBLKS) * 8 / 1024) CONSUMED_SIZE_MB
FROM   V$UNDOSTAT
GROUPBY MAXQUERYID
ORDERBY CONSUMED_SIZE_MB DESC
)
WHEREROWNUM < 50;

复制

查询结果解读

  • MAXQUERYID:SQL 语句的唯一标识符。
  • CONSUMED_SIZE_MB:该 SQL 语句占用的 Undo 空间(以 MB 为单位)。

实际案例

如果发现某个 SQL 语句占用了大量的 Undo 空间,可以考虑优化该 SQL 语句,减少其对 Undo 的消耗。


查看当前会话/用户使用 Undo 的情况

查询当前会话的 Undo 使用情况

通过以下 SQL 查询,可以查看当前哪些会话正在使用 Undo,以及它们的使用情况。

sql复制

SELECT A.SID, A.SERIAL#, A.USERNAME, B.USED_UREC, B.USED_UBLK
FROM   V$SESSION A, V$TRANSACTION B
WHERE  A.SADDR = B.SES_ADDR;

复制

查询结果解读

  • SID:会话 ID。
  • **SERIAL#**:会话序列号。
  • USERNAME:用户名称。
  • USED_UREC:使用的 Undo 记录数。
  • USED_UBLK:使用的 Undo 块数。

实际案例

如果发现某个会话的 Undo 使用量异常高,可以进一步调查该会话的活动,必要时终止会话以释放资源。


每秒生成的 Undo 量

查询每秒生成的 Undo 量

通过以下 SQL 查询,可以计算每秒生成的 Undo 块数,了解 Undo 数据的生成速率。

SELECT (SUM(UNDOBLKS)) / SUM((END_TIME - BEGIN_TIME) * 86400)
FROM   V$UNDOSTAT;

复制

查询结果解读

  • 每秒生成的 Undo 块数:该值反映了 Undo 数据的生成速率,可用于评估 Undo 表空间的需求。

实际案例

如果每秒生成的 Undo 块数较高,可能需要增加 Undo 表空间的大小或调整 UNDO_RETENTION
 参数。


当前 Undo 表空间具体使用情况

查询 Undo 表空间使用情况

通过以下 SQL 查询,可以查看 Undo 表空间的使用情况,包括已使用、空闲和保留的空间。

sql复制

SELECT DISTINCT STATUSSUM(BYTES), COUNT(*)
FROM   DBA_UNDO_EXTENTS
GROUP BY STATUS;

复制

查询结果解读

  • STATUS:Undo 空间的状态,包括 ACTIVE
    (已使用)、UNUSED
    (空闲)和 EXPIRED
    (已过期)。
  • **SUM(BYTES)**:状态对应的字节数。
  • **COUNT(*)**:状态对应的段数。

实际案例

如果发现 ACTIVE
 状态的 Undo 空间接近最大容量,可能需要调整 Undo 表空间的大小或优化 Undo 数据的使用。


计算过去 7*24 小时中 Undo 表空间的平均使用量

查询过去 7*24 小时的 Undo 使用量

通过以下 SQL 查询,可以计算过去 7 天 24 小时中 Undo 表空间的平均使用量,评估 Undo 表空间的需求。

SET LINESIZE 1000 PAGESIZE 1000
COL UNDO_RETENTION FOR A50
COL DB_BLOCK_SIZE FOR A50

SELECT UR UNDO_RETENTION,
       DBS DB_BLOCK_SIZE,
       ((UR * (UPS * DBS)) + (DBS * 24)) / 1024 / 1024AS"USED(MB)"
FROM (
SELECTVALUEAS UR
FROM   V$PARAMETER
WHERENAME = 'UNDO_RETENTION'
),
(
SELECT (SUM(UNDOBLKS) / SUM((END_TIME - BEGIN_TIME) * 86400)) UPS
FROM   V$UNDOSTAT
),
(
SELECTVALUEAS DBS
FROM   V$PARAMETER
WHERENAME = 'DB_BLOCK_SIZE'
);

复制

查询结果解读

  • UNDO_RETENTION:Undo 保留时间(以秒为单位)。
  • DB_BLOCK_SIZE:数据库块大小(以字节为单位)。
  • **USED(MB)**:过去 7 天 24 小时中 Undo 表空间的平均使用量(以 MB 为单位)。

实际案例

如果查询结果显示平均使用量较高,建议增加 Undo 表空间的大小,以满足长期运行的需求。


按峰值情况计算 Undo 表空间容量

查询峰值情况下的 Undo 使用量

通过以下 SQL 查询,可以计算在业务峰值情况下 Undo 表空间的需求容量,确保在高负载时 Undo 表空间不会耗尽。

sql复制

SELECT UR UNDO_RETENTION,
       DBS DB_BLOCK_SIZE,
       ((UR * (UPS * DBS)) + (DBS * 24)) / 1024 / 1024AS"M_BYTES"
FROM (
SELECTVALUEAS UR
FROM   V$PARAMETER
WHERENAME = 'UNDO_RETENTION'
),
(
SELECT (UNDOBLKS / ((END_TIME - BEGIN_TIME) * 86400)) UPS
FROM   V$UNDOSTAT
WHERE  UNDOBLKS IN (SELECTMAX(UNDOBLKS) FROM V$UNDOSTAT)
),
(
SELECTVALUEAS DBS
FROM   V$PARAMETER
WHERENAME = 'DB_BLOCK_SIZE'
);

复制

查询结果解读

  • UNDO_RETENTION:Undo 保留时间(以秒为单位)。
  • DB_BLOCK_SIZE:数据库块大小(以字节为单位)。
  • M_BYTES:峰值情况下 Undo 表空间的需求容量(以 MB 为单位)。

实际案例

如果查询结果显示峰值需求容量较高,建议在业务高峰期前调整 Undo 表空间的大小,以避免性能问题。


计算 Undo 表空间合理容量

计算业务高峰期每秒产生 Undo 数据块的个数

通过以下 SQL 查询,可以计算业务高峰期每秒产生的 Undo 数据块数,用于评估 Undo 表空间的需求。

SELECT MAX(UNDOBLKS / ((END_TIME - BEGIN_TIME) * 24 * 3600))
FROM   V$UNDOSTAT;

复制

查询 Undo 保留时间和数据块大小

通过以下命令,可以查看当前的 Undo 保留时间和数据块大小。

sql复制

SHOW PARAMETER UNDO_RETENTION;
SHOW PARAMETER DB_BLOCK_SIZE;

复制

计算 Undo 表空间合理容量

通过以下 SQL 查询,可以计算 Undo 表空间的合理容量,确保在业务高峰期和长期运行中都能满足需求。

SELECT (UNDOBLKS * UNDO_RETENTION * DB_BLOCK_SIZE) / 1024 / 1024 / 1024 UNDOTABLESPACE_GB
FROM   DUAL;

复制

查询结果解读

  • UNDOTABLESPACE_GB:Undo 表空间的合理容量(以 GB 为单位)。

实际案例

如果计算结果显示 Undo 表空间的合理容量为 5 GB,而当前容量仅为 2 GB,建议增加 Undo 表空间的大小,以满足业务需求。


Undo 管理是 Oracle 数据库运维中的一个重要环节。通过合理配置 Undo 表空间的自动扩展、调整 Undo 保留时间和大小,以及监控 Undo 的使用情况,可以有效提升数据库的性能和稳定性。在实际工作中,建议根据业务需求和数据库的运行情况,定期检查和优化 Undo 表空间,确保数据库的高效运行。

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏和分享。如果你有任何关于 Undo 管理或其他数据库相关的问题,欢迎在评论区留言讨论。





END

往期文章回顾

MOP社区新闻

  青学会MOP技术社区成立了!

  青学会专家顾问团成员介绍

金仓专栏

  告别繁琐!KingbaseES v9数据库一键安装-青学会&金仓专栏(1)

  KingbaseES v9数据库Docker安装-青学会&金仓专栏(2)

  KingbaseES数据脱敏-青学会&金仓专栏(3)

  KingbaseES后台服务管理-青学会&金仓专栏(4)

  电科金仓KES日常运维命令集锦-青学会&金仓专栏(5)

DBA实战小技巧

  推荐一款超实用的openGauss数据库安装工具!

  实战:记一次RAC故障排查
  DBA实战运维小技巧安装篇(一)Oracle 主流版本不同架构下的静默安装指南
  DBA实战运维小技巧存储篇(一)根目录满了如何处理
  DBA实战运维小技巧存储篇(二)打包迁移单机数据库至新存储

MOP社区投稿-内核开发

  浅谈 PostgreSQL GUC 模块原理

  简单解析 IvorySQL 增强 Oracle xml 兼容能力的原理

  简单讨论 PostgreSQL C语言拓展函数返回数据表的方式

  简单分析 pg_config 程序的作用与原理
  Redis 日志机制简介(一):SlowLog
  Redis 日志机制简介(二):AOF 日志
  Redis 日志机制简介(三):RDB 日志
  pg_cron插件使用介绍
  Redis 的指令表实现机制简介
  pg几款源码工具介绍
  Redis 事务功能简介

MOP顾问说

   MOP顾问说:MOP 三种主流数据库常用 SQL(一)

  MOP顾问说: 服务器内存

  MOP 顾问说:Linux Nice 值与 CPU 优先级揭秘


文章转载自青年数据库学习互助会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论