项目报错:nested exception is java.sql.SQLException: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP
原因是临时表空间满了,临时表空间一直增长,未释放导致临时表空间使用率100%。
查询临时表空间使用率
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
解决办法一:
1 2 3 |
|
解决办法二:
查询临时表空间位置,创建新的临时表空间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
切换临时表空间为新的临时表空间,切换后删除原来的临时表空间。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
解决办法三:
前两种方案,需要每隔一段时间就要去手动操作一次。
哪些情况会占用临时表空间?
1、当数据库执行如CREATE INDEX、ORDER BY、GROUP BY等操作时,如果内存中的排序区域大小不足,就会将数据放入临时表空间中进行排序。
2、操作CLOB或BLOB字段时,如果内存中的空间不足以容纳这些数据,Oracle会将这些数据放入临时表空间。
查询临时表空间占用sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
表空间的释放通常依赖于事务提交或会话的断开。
事务的提交释放了事务占用的资源,包括临时表空间中的空间。
会话的断开也会释放该会话使用的表空间。
因此,如果临时表空间没有被释放,并不是由于自动扩展设置的原因。
在查找表空间未释放的原因时,您应该关注未提交的事务或仍然处于活动状态的会话。
对于临时表空间的释放问题,您可以继续检查未提交的事务或会话,并确保它们被正确提交或断开连接。
我的Oracle数据库版本是11gR2(11.2.0.4)
我这里是由于clob或者blob字段造成的。
具体原因是clob或者blob字段使用后会占用临时表空间,如果连接不断开就不会释放,只要想办法让连接使用后断开就行。
我使用了druid连接池,由于我的业务一天24小时都会使用,所以连接池中的连接一直处于活跃状态,没有到达配置的空闲5分钟删除掉连接,
当然也可以从空闲时间参数入手让空闲时间短点就删除掉连接,一句话就是想办法让连接断开,但是频繁的创建连接也不好那连接池也没有意义了。
解决思路,不要使用clob或者blob字段,想办法使用其它方案替代,我这里必须要用到clob,又没有找到替代方案。
我后面解决思路是,写了一个定时器,10分钟检测一次连接池,连接存活时间超过1天,就删除该连接,且一次最多删除一个连接防止把连接池清空了。该方案自行评估有无风险!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
|
以上就是oracle临时表空间无法释放的解决办法的详细内容