Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3693115
  • 博文数量: 715
  • 博客积分: 1860
  • 博客等级: 上尉
  • 技术积分: 7745
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-07 08:51
个人简介

偶尔有空上来看看

文章分类

全部博文(715)

文章存档

2023年(75)

2022年(134)

2021年(238)

2020年(115)

2019年(11)

2018年(9)

2017年(9)

2016年(17)

2015年(7)

2014年(4)

2013年(1)

2012年(11)

2011年(27)

2010年(35)

2009年(11)

2008年(11)

分类: Oracle

2021-11-13 17:57:45

脚本不足恐惧症

先说一下原理:

  1. Automatic Undo Management 中的 Undo Block 分配算法如下:
  2. 1. 如果当前范围有更多空闲块,则分配下一个空闲块。
  3. 2.否则,如果下一个extent过期,则在下一个extent中换行并返回第一个块。
  4. 3. 如果下一个extent没有过期,则从UNDO表空间中获取空间。如果空闲范围可用,则将其分配给撤消段并返回新范围中的第一个块。
  5. 4. 如果没有可用的空闲区,则从离线撤消段中窃取过期区。从离线 undo 段中取消分配过期的 extent 并将其添加到 undo 段。返回范围的第一个空闲块。
  6. 5.如果离线undo段中没有过期extent,则从在线undo段中窃取,并将新的extent添加到当前undo段中。返回范围的第一个空闲块。
  7. 6. 扩展UNDO 表空间中的文件。如果文件可以扩展,则向当前撤消段添加一个范围,然后返回该块。
  8. 7. 以 10% 的减量调整保留并窃取未过期但现在相对于较低保留值已过期的范围。
  9. 8. 从任何脱机撤消段中窃取未过期的范围。
  10. 9. 尝试重用自己的undo段中未过期的extents。如果所有范围当前都忙(它们包含未提交的信息),则转到步骤 10。否则,进入下一个范围。
  11. 10. 尝试从任何在线撤消段中窃取未过期的范围。
  12. 11. 如果以上都失败,则返回 ORA-30036 无法在 undo tablespace '%s' 中扩展段 %s
  13. 当使用 NO AUTOEXTEND 创建 UNDO 表空间时,遵循分配算法,以下是对这种正确行为的解释:
  14. 对于固定大小的 UNDO 表空间(NO AUTOEXTEND),从 10.2 开始,我们提供给定固定撤消空间的最大保留时间,该空间设置为基于 UNDO 表空间大小的值。
  15. 这意味着即使 undo_retention 设置为秒数(默认为 900),固定的 UNDO 表空间也支持更大的 undo_retention 时间间隔(例如:36 小时),基于表空间大小,这使得撤消范围是未过期。但这并不表示当事务将在数据库中运行时没有可用的撤消范围,因为 UNEXPIRED 撤消段将被重用。

  16. 参考:DOC ID 413732.1


  1. --检查 AUM 中活动撤消段的使用情况 DOC ID 1337335.1

  2.  select max(maxquerylen),max(tuned_undoretention) from v$undostat;

  3.  select max(maxquerylen),max(tuned_undoretention) from DBA_HIST_UNDOSTAT;

  4. select * from (select MAXQUERYSQLID, MAXQUERYLEN from DBA_HIST_UNDOSTAT order by MAXQUERYLEN desc)where rownum<31;

  5. select * from (select MAXQUERYID, MAXQUERYLEN from v$UNDOSTAT order by MAXQUERYLEN desc)where rownum<31;

  6. SELECT DISTINCT STATUS,TABLESPACE_NAME, SUM(BYTES/1024/1024)MB, COUNT(*) FROM DBA_UNDO_EXTENTS GROUP BY STATUS, TABLESPACE_NAME;

  7. alter session set nls_date_format='YYYY-mm-dd HH24:MI:SS';
  8. select * from (select BEGIN_TIME , UNDOBLKS from DBA_HIST_UNDOSTAT order by UNDOBLKS desc )where rownum<31;
  9. select * from (select BEGIN_TIME , UNDOBLKS from v$UNDOSTAT order by UNDOBLKS desc)where rownum<31;

  10. select avg(maxquerylen) from DBA_HIST_UNDOSTAT;
  11. select avg(maxquerylen) from v$UNDOSTAT;

  12. SELECT segment_name, bytes "Extent_Size", count(extent_id) "Extent_Count", round(bytes * count(extent_id)/1024/1024) "Extent_MBytes"
  13. FROM dba_undo_extents WHERE status = 'ACTIVE' group by segment_name, bytes order by 1, 3 desc;

  14. col USERNAME for a12
  15. col PROGRAM for a25
  16. col SEGMENT_NAME for a20
  17. SELECT s.sid, s.serial#, s.username, u.segment_name, count(u.extent_id) "Extent Count", t.used_ublk, t.used_urec, s.program
  18. FROM v$session s, v$transaction t , dba_undo_extents u
  19. WHERE s.taddr = t.addr and u.segment_name like '_SYSSMU'||t.xidusn||'_%$' and u.status = 'ACTIVE'
  20. GROUP BY s.sid, s.serial#, s.username, u.segment_name, t.used_ublk, t.used_urec, s.program
  21. ORDER BY t.used_ublk desc, t.used_urec desc, s.sid, s.serial#, s.username, s.program;

  22. select b.name "UNDO Segment Name", b.inst# "Instance ID", b.status$ STATUS,
  23.  a.ktuxesiz "UNDO Blocks", a.ktuxeusn, a.ktuxeslt xid_slot, a.ktuxesqn xid_seq
  24. from x$ktuxe a, undo$ b
  25. where a.ktuxesta = 'ACTIVE'
  26. --and a.ktuxecfl like '%DEAD%'
  27. and a.ktuxeusn = b.us#;


  28. --To find the max query length and the tuned_undo retention, run this SQL.

  29. set pagesize 25
  30. set linesize 150
  31. column UNXPSTEALCNT heading "# Unexpired|Stolen"
  32. column EXPSTEALCNT heading "# Expired|Reused"
  33. column SSOLDERRCNT heading "ORA-1555|Error"
  34. column NOSPACEERRCNT heading "Out-Of-space|Error"
  35. column MAXQUERYLEN heading "Max Query|Length"
  36. select inst_id, to_char(begin_time,'YYYY-mm-dd HH24:MI') begin_time,
  37. UNXPSTEALCNT, EXPSTEALCNT , SSOLDERRCNT, NOSPACEERRCNT, MAXQUERYLEN, TUNED_UNDORETENTION
  38. from gv$undostat
  39. order by inst_id, begin_time;

  40. /*
  41. Then look for the timestamp at which the ORA-1555 occurred.
  42. The max query length will be less than undo_retention, and less than tuned_undoretention.

  43. Note: When tuned_undoretention is used, the undo_retention becomes a minimum setting.
  44. */
  45. -- “_undo_autotune”=false

  46. --跟踪 undo 异常 761128.1
  47.         event = "10442 trace name context forever, level 10"
  48.         event = "1555 trace name errorstack level 3"
  49.         _smu_debug_mode = 2049
  50.         max_dump_file_size = unlimited
  51.     
  52.         select count(*) from wrh$_undostat;
  53.     
  54. alter session set nls_date_format = 'YYYY-mm-dd HH24:MI:SS';
  55. col status for 9999
  56. select begin_time, end_time, status, maxquerylen, tuned_undoretention from wrh$_undostat where status > 1;
  57.     
  58. select (sum(undoblks) * (select value from v$parameter where name='db_block_size')/(1024*1024*1024)) Undo_GB from wrh$_undostat
  59.  where begin_time > (to_date('', 'YYYY-MM-DD HH24:MI:SS') - 3/24) and
  60.   begin_time <= to_date('', 'YYYY-MM-DD HH24:MI:SS') and
  61.   instance_number = <Your Instance Number>;


  62. SET LINESIZE 150
  63. COLUMN username FORMAT A8
  64. col segment_name for a22
  65. col status for a8
  66. SELECT s.username,
  67.       s.sid,
  68.       s.serial#,
  69.       t.used_ublk,
  70.       t.used_urec,
  71.       rs.segment_name,
  72.       r.rssize/1024 size_KB,
  73.       r.status,
  74.       r.EXTENDS, --here is important
  75.       s.program
  76. FROM v$transaction t,
  77.       v$session s,
  78.       v$rollstat r,
  79.       dba_rollback_segs rs
  80. WHERE s.saddr = t.ses_addr
  81. AND t.xidusn = r.usn
  82. AND rs.segment_id = t.xidusn
  83. ORDER BY t.used_ublk DESC;

  84. /*alter system set "_smu_debug_mode" = 4;
  85. SQL> alter rollback segment "_SYSSMU4$" shrink; (based on the above example)
  86. alter system set "_smu_debug_mode" = 0;
  87. */

UNDO不足判断

  1. --是否有undo告警
  2. SELECT creation_time,metric_value,message_type,reason,
  3.      Suggested_action FROM dba_outstanding_alerts
  4.      WHERE object_name='';
  5.      
  6. SELECT creation_time,metric_value,message_type,reason,Suggested_action,resolution
  7.      FROM dba_alert_history
  8.      WHERE object_name='';
  9.      
  10. --表空间告警阈值
  11. SELECT object_type,object_name,warning_value,critical_value
  12. FROM dba_thresholds
  13. WHERE object_type='TABLESPACE';

  14. -- SELECT tablespace_name FROM dba_tablespaces where contents='UNDO';

  15. -- undo 表空间使用率
  16. SELECT
  17.          round(((SELECT (NVL(SUM(bytes),0))
  18.            FROM dba_undo_extents
  19.            WHERE tablespace_name='UNDOTBS1'
  20.            AND status IN ('ACTIVE','&UNDOTBS_NAME')) * 100)/
  21.          (SELECT SUM(bytes)
  22.           FROM dba_data_files
  23.           WHERE tablespace_name='&UNDOTBS_NAME'),1)
  24.          "PCT_INUSE"
  25.      FROM dual;

阅读(999) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~