近期,在客户的某套库中,发现undo表空间使用率过高,释放的空间少。其中原因可能是由于Oracle 10g的新特性undo_retention自动化调整造成。具体内容如下:
Oracle 10g中引入了一个新的自动调整undo_retention的特性,其目的是为了减少ORA-01555错误出现的概率,Oracle会忽略UNDO_RETENTION参数设置的阀值,而是根据UNDO表空间的大小和使用率来自动调整UNDO信息的保留时间。会造成的影响是UNDO表空间的区(extent)中大部分都是未过期状态(unexpired),这就会导致数据库在给事务分配UNDO块时,会优先使用UNDO表空间的的空闲空间分配,而不是覆盖已经分配的空间,这使得UNDO表空间的使用率保持在一个较高的水平。
Oracle数据库在为事务进行分配UNDO块时,会按照这样的算法和流程:
1. 如果当前区(extent)中还有空闲块,在需要空间时会继续使用本区(extent)中的空闲块。
2. 在当前区(extent)使用完后,如果下一个区(extent)是过期状态(expired),那么就跳转到下一个区(extent)的第一个数据块。
3. 如果下一个区(extent)不是过期状态(expired),就从UNDO表空间申请空间,如果UNDO表空间中存在空闲的空间,就分配新的区(extent)加入到undo segment,然后跳转到新区(extent)的第一个数据块。
4. 如果没有剩余空闲的区(extent),则会从OFFLINE状态的回滚段中窃取(STEAL)过期的区,加入当前的回滚段,并使用第一个数据块。
5. 如果OFFLINE状态的回滚段中没有过期的区,那么会从ONLINE状态的回滚段窃取(STEAL)过期的区加入当前的回滚段,并使用第一个数据块。
6. 如果UNDO表空间能够自动扩展,则会扩展UNDO表空间,并将新区加入到当前回滚段中。
7. 如果undo表空间数据文件不能扩展,调低10%的retention值,然后窃取(STEAL)在短保留时间的过期区,如果还未找到过期区,则继续以10%的速度减少回滚的保留时间。
8. 随机从其他OFFLINE状态的回滚段中窃取(STEAL)未过期的(unexpired)的区。
如果以上的尝试都失败,那么久会报ORA-30036错误。
从上面的步骤可以看出,事务会优先使用UNDO空闲空间、过期状态(expired)的UNDO区,然后会尝试扩展表空间的数据文件,只有在以上步骤都得不到获得UNDO表空间后,才会去使用未过期(unexpired)的UNDO区。
而Oracle数据库回收UNDO extent使其成为UNDO表空间的空闲空间,其方式有以下几种:
1. SMON进程周期性地回收过期状态的undo extent,对于OFFLINE的UNDO 段,会回收所有的过期的undo extent,而对于ONLINE的UNDO段,回收时会根据 undo_retention时间和undo块的使用率来确定回收的数量,undo_retention越大,能回收的undo空间就越少。
2. 进程在给事务分配undo块时,会回收多余的过期状态的undo extent。
因此,如果系统中未过期状态的undo exten 越多,那这些undo块就不会返回给undo表空间而成为空闲空间。造成的结果就是UNDO表空间的已分配空间一直很多,但是使用率却很高。
解决方案:
针对此问题,解决方案是关闭undo retention的自动优化特性,即将数据库参数_undo_autotune设置为FALSE,具体为:
Alter system set “_undo_autotune”=false;
该参数可以在线调整,不需要重启数据库,也不会影响系统额正常运行。
也可以设置隐藏参数_sum_debug_mode,具体为:
Alter system set “ _sum_debug_mode”=33554432;
如果undo_retention参数目前值在10800以下,建议设置为:10800
Alter system set undo_retention=10800;
分析过程:
1. 查看undo相关的信息
1) UNDOTBS2 表空间active、expired、unexpired状态比例
STATUS SUM(BYTES)/1024/1024 COUNT(*)
------------------------------------ -------------------- ----------
EXPIRED 103599.188 19580
ACTIVE 192 3
UNEXPIRED 4 4
可以看出在UNDOTBS2表空间的空间分配中,大部分属于过期(expired)状态
2) 表空间使用率状况
Tablespace Size (MB) Free (MB) % Free % Used
----------------------- ------------ ------------- ----------- --------------
UNDOTBS1 64190 62798 98 2
UNDOTBS3 128000 85717.5 67 33
UNDOTBS2 104000 74 0 100
UNDO表空间的使用率不均匀,UNDOTBS2的表空间使用率达到100%,而其他表空间为未40%。
3)_undo_autotune的设置情况
NAME VALUE
----------------------------- -----------------------------
_undo_autotune TRUE
3) undo_retention自动调整情况:
BEGIN_TIME ACTIVEBLKS UNEXPIREDBLKS EXPIREDBLKS TUNED_UNDORETENTION
------------------------------ ---------- ------------- ----------- -------------------
08/12/2015 22:22:46 3568 13300520 2176 5485009
08/12/2015 22:12:46 11760 13284008 2176 5469730
08/12/2015 22:02:46 11760 13284008 2176 5498797
08/12/2015 21:52:46 3568 13292072 2176 5493784
08/12/2015 21:42:46 3568 13292072 2176 5499555
08/12/2015 21:32:46 3568 13292072 2176 5497755
08/12/2015 21:22:46 3568 13292072 2176 5496681
08/12/2015 21:12:46 3568 13292072 2176 5488032
08/12/2015 21:02:46 3568 13292072 2176 5481300
08/12/2015 20:52:46 11760 13283880 2176 5472885
08/12/2015 20:42:46 3568 13291688 2304 5480721
BEGIN_TIME ACTIVEBLKS UNEXPIREDBLKS EXPIREDBLKS TUNED_UNDORETENTION
------------------------------ ---------- ------------- ----------- -------------------
08/12/2015 20:32:46 3568 13291688 2304 5480861
08/12/2015 20:22:46 3568 13291688 2304 5485670
08/12/2015 20:12:46 3568 13291688 2304 5483425
08/12/2015 20:02:46 8688 13286568 2304 5481056
08/12/2015 19:52:46 3568 13291688 2304 5479901
08/12/2015 19:42:46 3568 13275304 10496 5477658
08/12/2015 19:32:46 3568 13275304 10496 5477398
08/12/2015 19:22:46 3568 13274280 10496 5475244
08/12/2015 19:12:46 3568 13274280 10496 5469633
08/12/2015 19:02:46 3568 13274280 10496 5471628
08/12/2015 18:52:46 3568 13274280 10496 5463911
BEGIN_TIME ACTIVEBLKS UNEXPIREDBLKS EXPIREDBLKS TUNED_UNDORETENTION
------------------------------ ---------- ------------- ----------- -------------------
08/12/2015 18:42:46 3568 13273256 10496 5483522
08/12/2015 18:32:46 3568 13273256 10496 5492989
08/12/2015 18:22:46 3568 13265064 10496 5489900
08/12/2015 18:12:46 3568 13297832 10496 5488577
08/12/2015 18:02:46 3568 13297832 10496 5487795
08/12/2015 17:52:46 3568 13297832 10496 5481165
08/12/2015 17:42:46 3568 13297832 10496 5477806
08/12/2015 17:32:46 3568 13297832 10496 5466334
08/12/2015 17:22:46 3568 13297832 10496 5458939
08/12/2015 17:12:46 3568 13297832 10496 5454334
08/12/2015 17:02:46 16880 13291688 2304 5452345
BEGIN_TIME ACTIVEBLKS UNEXPIREDBLKS EXPIREDBLKS TUNED_UNDORETENTION
------------------------------ ---------- ------------- ----------- -------------------
08/12/2015 16:52:46 3568 13291816 10496 5381496
08/12/2015 16:42:46 19952 13278888 10496 5436678
08/12/2015 16:32:46 3568 13295272 10496 5617889
08/12/2015 16:22:46 3568 13295144 10496 5612595
08/12/2015 16:12:46 11760 13286696 10624 5642189
08/12/2015 16:02:46 28144 13278504 2304 5657143
08/12/2015 15:52:46 24688 13281832 2304 5669423
08/12/2015 15:42:46 11760 13286440 10496 5679942
08/12/2015 15:32:46 19952 13286440 2304 5703464
08/12/2015 15:22:46 19952 13286440 2304 5701016
08/12/2015 15:12:46 19952 13273512 10496 5716642
BEGIN_TIME ACTIVEBLKS UNEXPIREDBLKS EXPIREDBLKS TUNED_UNDORETENTION
------------------------------ ---------- ------------- ----------- -------------------
08/12/2015 15:02:46 3568 13288744 11392 5709225
08/12/2015 14:52:46 11760 13280296 10368 5717024
08/12/2015 14:42:46 11760 13280168 10496 5736215
08/12/2015 14:32:46 28144 13271848 2176 5648964
08/12/2015 14:22:46 19952 13263656 2176 5819434
08/12/2015 14:12:46 11760 13271592 2176 5866860
08/12/2015 14:02:46 11760 13271592 2176 5873904
08/12/2015 13:52:46 28144 13254056 2176 5886917
08/12/2015 13:42:46 11760 13270184 2176 5905094
08/12/2015 13:32:46 20976 13260840 2176 5909713
08/12/2015 13:22:46 11760 13270056 2176 5917541
BEGIN_TIME ACTIVEBLKS UNEXPIREDBLKS EXPIREDBLKS TUNED_UNDORETENTION
------------------------------ ---------- ------------- ----------- -------------------
08/12/2015 13:12:46 11760 13269928 2176 5909180
08/12/2015 13:02:46 11760 13269928 2176 5910021
08/12/2015 12:52:46 11760 13261608 2176 5910784
08/12/2015 12:42:46 12784 13252392 2176 5911076
08/12/2015 12:32:46 12656 13251240 2304 5896012
08/12/2015 12:22:46 3568 13252136 10368 5927543
08/12/2015 12:12:46 11760 13243944 10368 5942166
08/12/2015 12:02:46 11760 13243944 10368 5932299
08/12/2015 11:52:46 11760 13243944 10368 5932288
08/12/2015 11:42:46 19952 13243944 2176 5932406
08/12/2015 11:32:46 19952 13235624 2176 5928678
BEGIN_TIME ACTIVEBLKS UNEXPIREDBLKS EXPIREDBLKS TUNED_UNDORETENTION
------------------------------ ---------- ------------- ----------- -------------------
08/12/2015 11:22:46 11760 13243816 2176 5930833
08/12/2015 11:12:46 11760 13243688 2176 5921460
08/12/2015 11:02:46 11760 13243432 2176 5944782
08/12/2015 10:52:46 3568 13251624 2176 5953871
08/12/2015 10:42:46 3568 13251624 2176 5978579
08/12/2015 10:32:46 3568 13251624 2176 5978140
08/12/2015 10:22:46 3568 13242280 2176 5921444
08/12/2015 10:12:46 4592 13241256 2176 6034858
08/12/2015 10:02:46 4592 13241256 2176 6047408
08/12/2015 09:52:46 4592 13240232 2176 6049517
08/12/2015 09:42:46 4592 13240104 2176 6040410
BEGIN_TIME ACTIVEBLKS UNEXPIREDBLKS EXPIREDBLKS TUNED_UNDORETENTION
------------------------------ ---------- ------------- ----------- -------------------
08/12/2015 09:32:46 12784 13231912 2176 6054216
08/12/2015 09:22:46 20976 13223720 2176 6050894
08/12/2015 09:12:46 4592 13231912 2176 6072825
08/12/2015 09:02:46 4592 13231528 2304 6089504
08/12/2015 08:52:46 20976 13215016 2304 6108557
08/12/2015 08:42:46 5232 13230760 2304 6126483
08/12/2015 08:32:46 4592 13231400 2304 6133989
08/12/2015 08:22:46 4592 13231400 2304 6135342
08/12/2015 08:12:46 4592 13231400 2304 6126924
08/12/2015 08:02:46 4592 13231400 2304 6113724
08/12/2015 07:52:46 4592 13215016 10496 6025237
BEGIN_TIME ACTIVEBLKS UNEXPIREDBLKS EXPIREDBLKS TUNED_UNDORETENTION
------------------------------ ---------- ------------- ----------- -------------------
08/12/2015 07:42:46 4592 13215016 10496 6079561
08/12/2015 07:32:46 4592 13215016 10496 6067825
08/12/2015 07:22:46 4592 13296808 10496 6052985
08/12/2015 07:12:46 4592 13296808 10496 6033145
08/12/2015 07:02:46 4592 13296808 10496 6019906
08/12/2015 06:52:46 4592 13296808 10496 6017717
08/12/2015 06:42:46 4592 13295656 10496 6005087
08/12/2015 06:32:46 4592 13295656 10496 6010367
08/12/2015 06:22:46 4592 13295656 10496 6001669
08/12/2015 06:12:46 4592 13295656 10496 5980524
08/12/2015 06:02:46 4592 13295656 10496 5979327
BEGIN_TIME ACTIVEBLKS UNEXPIREDBLKS EXPIREDBLKS TUNED_UNDORETENTION
------------------------------ ---------- ------------- ----------- -------------------
08/12/2015 05:52:46 4592 13295656 10496 5948603
08/12/2015 05:42:46 4592 13295656 10496 5936140
08/12/2015 05:32:46 4592 13295656 10496 5916546
08/12/2015 05:22:46 4592 13295656 10496 5904206
08/12/2015 05:12:46 4592 13295656 10496 5888506
08/12/2015 05:02:46 4592 13295656 10496 5879717
08/12/2015 04:52:46 4592 13295656 10496 5874371
08/12/2015 04:42:46 4592 13295656 10496 5863919
08/12/2015 04:32:46 4592 13295656 10496 5854172
08/12/2015 04:22:46 4592 13295656 10496 5841001
08/12/2015 04:12:46 4592 13295656 10496 5829960
查看v$undostat.tunrd_undoretention发现,TUNED_UNDORETENTION该值被自动调整到平均97000分钟,也就是说undo表空间中的数据要保留60多天才会过期,正是因为这么长的数据未过期时间,且表空间充足,导致了undo表空间的空间释放程度。
按照Oracle文档介绍,可按以下几种方法解决。
解决方法1:设置_undo_autotune=FALSE,将会关闭自动调整undo_retention功能,那么undo的retention时间完全依赖初始化参数undo_retention的值,默认值为900s。
解决方法2:可设置_sum_debug_mode=33554432隐藏参数。设置后,Oracle的undo_retention自动调整功能依然被打开,但是计算tuned_undoretention是根据MAXQUENRYLEN secs +300来计算,而不是根据undo表空间大小的百分比来计算,可避免TUNED_UNDORETENTION值变很大。
总结:
Oracle 10g中引入了一个新的自动调整undo_retention的特性,在Oracle Database 10g中当自动undo管理被启用,总是存在一个当前的undo retention,Oracle Database尝试至少保留旧的undo信息到该时间。
数据库收集使用情况统计信息,基于这些统计信息和UNDO表空间大小来调整undo retention的时间。目前统计undo表空间使用率的时候,是把expired和unexpired还有active三种状态的extent的总和,
作为undo表空间正在使用的大小,这种会导致undo表空间使用率虚高的情况。而实际上expired和unexpired状态的extent并不能作为当前undo表空间正在使用的部分,因为这部分extent是可以回收重用的。
从Oracle 10g开始,为减少出现ORA-01555错误出现的概率,Oracle会忽略undo_retention参数设置的阀值,而是根据undo表空间的大小和使用率来自动调整undo信息的保留时间。
这就可能会造成undo表空间可能会由于回滚段保留时间自动调整而导致大量的undo extent处于非过期状态,
这会使得undo表空间的使用率处于100%状态。