ORACLE临时表空间的清理
查看使用率
column TablespaceName format a heading Tablespace Name
column TotalUsedBytes format heading File Sizes|(K)
column TotalFreeBytes format heading Free Bytes|(K)
column FreeRatio format heading Free|(%)
column TotalExtensibleBytes format heading Extensible|Sizes (K)
column TotalExtends format heading Ext
compute sum label Total: of TotalFreeBytes TotalUsedBytes TotalExtensibleBytes on report
break on report
select bTablespaceName
round(sum(bUsedByte) / ) TotalUsedBytes
round(sum(aFreeByte) / ) TotalFreeBytes
round(sum(bExtensibleByte) / ) TotalExtensibleBytes
round(sum(aFreeByte + bExtensibleByte) * / sum(bUsedByte + bExtensibleByte) ) FreeRatio
sum(aExtend) TotalExtends
from (select sum(bytes) FreeByte
count(*) Extend
file_id FileID
tablespace_name TablespaceName
from dba_free_space
group by file_id
tablespace_name
union all
select sum(bytes_free) FreeByte
count(*) Extend
file_id FileID
tablespace_name TablespaceName
from v$temp_space_header
group by file_id
tablespace_name) a
(select decode(autoextensible YES decode(sign(maxbytes bytes) maxbytes bytes ) ) ExtensibleByte
bytes UsedByte
file_id FileID
tablespace_name TablespaceName
from dba_data_files
union all
select decode(autoextensible YES decode(sign(maxbytes bytes) maxbytes bytes ) ) ExtensibleByte
bytes UsedByte
file_id FileID
tablespace_name TablespaceName
from dba_temp_files) b
where bFileID = aFileID(+) and
bTablespaceName= aTablespaceName(+)
group by bTablespaceName;
正常来说在完成Select语句create index等一些使用TEMP表空间的排序操作后Oracle是会自动释放掉临时段a的但有些有侯我们则会遇到临时段没有被释放TEMP表空间几乎满的状况甚至是我们重启了数据库仍没有解决问题这个问题在论坛中也常被网友问到下面总结一下给出几种处理方法
法一重启库
库重启时Smon进程会完成临时段释放TEMP表空间的清理操作不过很多的时侯我们的库是不允许down的所以这种方法缺少了一点的应用机会不过这种方法还是很好用的
法二Metalink给出的一个方法
修改一下TEMP表空间的storage参数让Smon进程观注一下临时段从而达到清理和TEMP表空间的目的
SQL>alter tablespace temp increase ;
SQL>alter tablespace temp increase ;
法三我常用的一个方法具体内容如下
使用如下语句a查看一下认谁在用临时段
SELECT username
sid
serial#
sql_address
machine
program
tablespace
segtype
contents
FROM v$session se
v$sort_usage su
WHERE sesaddr=susession_addr
那些正在使用临时段的进程
SQL>Alter system kill session sidserial#;
把TEMP表空间回缩一下
SQL>Alter tablespace TEMP coalesce;
法四使用诊断事件的一种方法也是被我认为是杀手锏的一种方法
确定TEMP表空间的ts#
SQL>select ts# name from systs$ ;
TS# NAME
SYSYEM
RBS
USERS
* TEMP
TOOLS
INDX
DRSYS
执行清理操作
SQL>alter session set events immediate trace name DROP_SEGMENTS level ;
说明
temp表空间的TS# 为 * So TS#+ =
其它
出现如上问题的原因我认为可能是由于大的排序超出了TEMP表空间的空间允许范围引起的也可能包含着其它的异常的因素
观注TEMP等这些空间的状态是Dba日常职责之一我们可以通过ToadObject Browser等这些工具办到也可以用如下的语句
SELECT UPPER(FTABLESPACE_NAME) 表空间名
DTOT_GROOTTE_MB 表空间大小(M)
DTOT_GROOTTE_MB FTOTAL_BYTES 已使用空间(M)
TO_CHAR(ROUND((DTOT_GROOTTE_MB FTOTAL_BYTES) / DTOT_GROOTTE_MB *
)
) 使用比
FTOTAL_BYTES 空闲空间(M)
FMAX_BYTES 最大块(M)
FROM (SELECT TABLESPACE_NAME
ROUND(SUM(BYTES) / ( * ) ) TOTAL_BYTES
ROUND(MAX(BYTES) / ( * ) ) MAX_BYTES
FROM SYSDBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
(SELECT DDTABLESPACE_NAME
ROUND(SUM(DDBYTES) / ( * ) ) TOT_GROOTTE_MB
FROM SYSDBA_DATA_FILES DD
GROUP BY DDTABLESPACE_NAME) D
WHERE DTABLESPACE_NAME = FTABLESPACE_NAME
ORDER BY DESC