目錄
7、對臨時表空間進行shrink(11g新增的功能)... 3
關於oracle臨時表空間
一、臨時表空間作用
臨時表空間主要用途是在數據庫進行排序運算、管理索引、訪問視圖等操作時提供臨時的運算空間,當運算完成之後系統會自動清理。當oracle裏需要用到sort的時候,PGA中sort_area_size大小不夠時,將會把數據放入臨時表空間裏進行排序,同時如果有異常情況的話,也會被放入臨時表空間,正常來說,在完成Select語句、create index等一些使用TEMP表空間的排序操作後,Oracle是會自動釋放掉臨時段的。注意這裏的釋放,僅僅是將這些空間標記爲空閒,並可重用,真正佔用的磁盤空間並沒有釋放。所以Temp表空間可能會越來越大。
重啓數據庫可以釋放臨時表空間,如果不能重啓實例,而一直保持問題sql語句的執行,temp表空間會一直增長。直到耗盡硬盤空間。 在磁盤空間的分配上,oracle使用的是貪心算法,如果上次磁盤空間消耗達到1GB,那麼臨時表空間就是1GB。也就是說當前臨時表空間文件的大小是歷史上使用臨時表空間最大的大小。臨時表空間的主要作用:
(1)索引create或rebuild
(2)Order by 或 group by
(3)Distinct 操作
(4)Union 或 intersect 或 minus
(5)Sort-merge joins
(6)analyze
排序是很耗資源的,Temp表空間滿了,關鍵是優化你的語句,儘量使排序減少纔是上策.
二、臨時表空間釋放
法一、重啓庫
庫重啓時,Smon進程會完成臨時段釋放,TEMP表空間的清理操作,不過很多的時侯我們的庫是不允許down的,所以這種方法缺少了一點的應用機會,不過這種方法還是很好用的。
法二、Metalink給出的一個方法
修改一下TEMP表空間的storage參數,讓Smon進程觀注一下臨時段,從而達到清理和TEMP表空間的目的。
SQL>alter tablespace temp increase 1;
SQL>alter tablespace temp increase 0;
法三、我常用的一個方法
1、使用如下語句查看一下認誰在用臨時段
SELECT username,
sid,
serial#,
sql_address,
machine,
program,
tablespace,
segtype,
contents
FROM v$session se,
v$sort_usage su
WHERE se.saddr=su.session_addr
2、 那些正在使用臨時段的進程
SQL>Alter system kill session 'sid,serial#';
3、把TEMP表空間回縮一下
SQL>Alter tablespace TEMP coalesce;
法四、使用診斷事件的一種方法
1、 確定TEMP表空間的ts#
SQL>select ts#, name from sys.ts$ ;
TS# NAME
-----------------------
0 SYSYEM
1 RBS
2 USERS
3* TEMP
4 TOOLS
5 INDX
6 DRSYS
2、 執行清理操作
SQL>alter session set events 'immediate trace nameDROP_SEGMENTS level 4' ;
說明:
temp表空間的TS# 爲 3*, So TS#+ 1= 4
法五、 重建TEMP 表空間
Temporary tablespace是不能直接drop默認的臨時表空間的,不過我們可以通過以下方法來做。
準備:查看目前的TemporaryTablespace
SQL> select namefrom v$tempfile
1.創建中轉臨時表空間
create temporarytablespace TEMP1 TEMPFILE 'E:\ORACLE\ORADATA\ORCL\temp02.DBF' SIZE 512MREUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;
2.改變缺省臨時表空間 爲剛剛創建的新臨時表空間temp1
alter databasedefault temporary tablespace temp1;
3.刪除原來臨時表空間
drop tablespace tempincluding contents and datafiles;
4.重新創建臨時表空間
create temporarytablespace TEMP TEMPFILE 'E:\ORACLE\ORADATA\ORCL\temp01.DBF' SIZE 512MREUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;
5.重置缺省臨時表空間爲新建的temp表空間
alter databasedefault temporary tablespace temp;
6.刪除中轉用臨時表空間
drop tablespacetemp1 including contents and datafiles;
三、臨時表空間增刪改
1、改變臨時表空間大小
alter database tempfile'C:\ORADATA\ORCL\TEMP01.DBF' resize 21M; 2、擴展臨時表空間
方法一、增大臨時文件大小:
SQL> alter databasetempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ resize 100m;
方法二、將臨時數據文件設爲自動擴展:
SQL> alter databasetempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ autoextend on next 5m maxsize unlimited;
方法三、向臨時表空間中添加數據文件:
SQL> alter tablespace tempadd tempfile ‘/u01/app/oracle/oradata/orcl/temp02.dbf’ size 100m;
3、創建臨時表空間
create temporary tablespacetemp01 tempfile 'C:\ORADATA\ORCL\TEMP01.DBF' size 10M;
4、更改系統的默認臨時表空間
--查詢默認臨時表空間
select * from database_properties whereproperty_name='DEFAULT_TEMP_TABLESPACE';
--修改默認臨時表空間
alter database default temporary tablespace temp02;
--所有用戶的默認臨時表空間都將切換爲新的臨時表空間:
select username,temporary_tablespace,default_tablespace from dba_users;
--更改某一用戶的臨時表空間:
alter user scott temporary tablespace temp02;
5、刪除臨時表空間
--刪除臨時表空間的一個數據文件:
alter database tempfile 'C:\ORADATA\ORCL\TEMP03.DBF' drop;
--刪除臨時表空間(徹底刪除):
drop tablespace temp including contents and datafiles cascadeconstraints;
6、臨時表空間組介紹
--1)創建臨時表空間組:
create temporary tablespace tempts1 tempfile'C:\ORADATA\ORCL\TEMP1_01.DBF' size 2M tablespace group group1;
create temporary tablespace tempts2 tempfile'C:\ORADATA\ORCL\TEMP1_02.DBF' size 2M tablespace group group2;
--2)查詢臨時表空間組:dba_tablespace_groups視圖
select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------------------------------------
GROUP1 TEMPTS1
GROUP2 TEMPTS2
--3)將表空間從一個臨時表空間組移動到另外一個臨時表空間組:
alter tablespace tempts1 tablespace group GROUP2 ;
select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
GROUP2 TEMPTS1
GROUP2 TEMPTS2
--4)把臨時表空間組指定給用戶
alter user scott temporary tablespace GROUP2;
--5)在數據庫級設置臨時表空間
--alter database <db_name> default temporarytablespace GROUP2;
alter database orcl default temporary tablespace GROUP2;
--6)刪除臨時表空間組 (刪除組成臨時表空間組的所有臨時表空間)
drop tablespace tempts1 including contents and datafiles;
select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------------------------------------
GROUP2 TEMPTS2
drop tablespace tempts2 including contents and datafiles;
select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
7、對臨時表空間進行shrink(11g新增的功能)
--將temp表空間收縮爲20M
alter tablespace temp02 shrink space keep 20M;
--自動將表空間的臨時文件縮小到最小可能的大小
ALTER TABLESPACE temp SHRINK TEMPFILE ’/u02/oracle/data/lmtemp02.dbf’;
四、臨時表空間查詢
1、查看臨時表空間是否可用
SELECT D.TABLESPACE_NAME,SPACE"SUM_SPACE(M)",BLOCKS SUM_BLOCKS,
SPACE-NVL(FREE_SPACE,0)"USED_SPACE(M)",
ROUND((1-NVL(FREE_SPACE,0)/SPACE)*100,2)"USED_RATE(%)",
FREE_SPACE"FREE_SPACE(M)"
FROM (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,
SUM(BLOCKS) BLOCKS FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) D,
(SELECTTABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) FREE_SPACE
FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
UNION ALL --if have tempfile
SELECT D.TABLESPACE_NAME,SPACE"SUM_SPACE(M)",BLOCKS SUM_BLOCKS,
USED_SPACE"USED_SPACE(M)",ROUND(NVL(USED_SPACE,0)/SPACE*100,2)"USED_RATE(%)",
NVL(FREE_SPACE,0) "FREE_SPACE(M)"
FROM (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,
SUM(BLOCKS) BLOCKS FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME) D,
(SELECTTABLESPACE_NAME,ROUND(SUM(BYTES_USED)/(1024*1024),2) USED_SPACE,
ROUND(SUM(BYTES_FREE)/(1024*1024),2) FREE_SPACE
FROM V$TEMP_SPACE_HEADER GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+);
2、查看臨時表空間的使用情況
(GV_$TEMP_SPACE_HEADER視圖必須在sys用戶下才能查詢)
--GV_$TEMP_SPACE_HEADER視圖記錄了臨時表空間的使用大小與未使用的大小
--dba_temp_files視圖的bytes字段記錄的是臨時表空間的總大小
SELECT temp_used.tablespace_name,
total - used as"Free",
total as"Total",
round(nvl(total -used, 0) * 100 / total, 3) "Free percent"
FROM (SELECT tablespace_name, SUM(bytes_used) /1024 / 1024 used
FROM GV_$TEMP_SPACE_HEADER
GROUPBY tablespace_name) temp_used,
(SELECTtablespace_name, SUM(bytes) / 1024 / 1024 total
FROM dba_temp_files
GROUPBY tablespace_name) temp_total
WHERE temp_used.tablespace_name = temp_total.tablespace_name
3、 查找消耗資源比較的sql語句
Select se.username,
se.sid,
su.extents,
su.blocks *to_number(rtrim(p.value)) as Space,
tablespace,
segtype,
sql_text
from v$sort_usage su, v$parameter p, v$session se, v$sql s
where p.name = 'db_block_size'
and su.session_addr = se.saddr
and s.hash_value = su.sqlhash
and s.address = su.sqladdr
order by se.username, se.sid
4、查看當前臨時表空間使用大小與正在佔用臨時表空間的sql語句
select sess.SID, segtype,blocks * 8 / 1000 "MB", sql_text
from v$sort_usage sort, v$session sess, v$sql sql
where sort.SESSION_ADDR = sess.SADDR
and sql.ADDRESS = sess.SQL_ADDRESS
order by blocks desc;
五、臨時表空間回收測試
詳細測試步驟見附件。