ORACLE 10G下LOB_DATA欄位型別佔滿臨時表空間問題

531968912發表於2016-07-04
有一套10.2.0.4兩節點RAC資料庫,大概每隔一星期左右,後臺alert就會報臨時表空間不足的錯誤,透過查詢發現佔用監時表空間的sql是在執行一個包體,該包體已被加密,並且之前該庫的臨時表空間已經擴充套件過2次,每次30G,基本上可以說,既使再擴充套件的話還是有可能造成臨時表空間不足的情況,帶著這個問題,我們發現佔用大量監時表空間的資料型別為LOB_DATA和LOB_INDEX,每個會話佔用的臨時段大小不一,最大的可能佔用到幾十G以上,並且還會持續增長,這說明會話佔用的臨時段一直不釋放,積累造成臨時表空間滿。透過網上搜尋及查詢MOS文件,覺得可能是ORCLE的bug(Bug 5723140 – Temp LOB space not released after commit [ID 5723140.8]),
從10.2.0.4開始雖然已經修復了該bug,但是預設情況下:為了更加高效的利用temp,在session未斷開前,不自動釋放temp 空間,可以透過設定event 60025來強制會話在commit之後就立即釋放臨時段。

解決方案我想有以下幾種:
1.目前的方式是軟體開發商每隔幾天透過SQL語句查詢下使用臨時段最高的幾個會話並kill掉它。這可以採用指令碼的方式來代替人工操作。
[oracle@eXXXX2p1 ~]$ cat kill_temp_pid.sh
#!/bin/ksh
export ORACLE_BASE=$ORACLE_BASE
export ORACLE_HOME=$ORACLE_HOME
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
export ORACLE_SID=$ORACLE_SID
export AIXTHREAD_SCOPE=S
export LD_LIBRARY_PATH=$ORACLE_HOME/lib32:$ORACLE_HOME/lib:$ORA_CRS_HOME/lib32:$ORA_CRS_HOME/lib:/usr/lib
export LIBPATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32:$ORACLE_HOME/ctx/lib:$ORA_CRS_HOME/lib32:$ORA_CRS_HOME/lib

AWK=/bin/awk
DATE=/bin/date
file_name=/home/oracle/`/bin/date '+%Y-%m-%d-%H-%M'`

$ORACLE_HOME/bin/sqlplus -S "/as sysdba"  2>/dev/null 1>> $file_name <<sql_script
set feedback off
set heading off
select 'kill -9 '||spid from
(select pr.spid,te.username,se.sid,blocks UsedBLKS from v\$tempseg_usage te,v\$session se,v\$process pr where te.session_addr=se.saddr and se.paddr=pr.addr and se.username='HR' order by UsedBLKS) where rownum<3;
sql_script

chmod +x $file_name
/bin/sh $file_name
rm $file_name


2.開發人員修改軟體程式碼,使會話執行完包體之後立刻斷開連線。這樣就可以及時的釋放臨時段了。
alter session set events '60025 trace name context forever';

3.透過logon觸發器,在指定使用者登入後,對會話設定event 60025事件來達到不斷開會話的情況下及時釋放臨時段。
create or replace trigger login_db after logon on schema
begin
execute immediate 'alter session set events ''60025 trace name context forever''';
end;
/

--如果要在全庫級別設定,就按如下方法
create or replace trigger sys.login_db after logon on database
begin
if(sys_context('USERENV','SESSION_USER')='HR') then
execute immediate 'alter session set events ''60025 trace name context forever''';
end if;
end;
/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2121464/,如需轉載,請註明出處,否則將追究法律責任。

相關文章