在網上搜索了很多次oracle表空間查詢語句,現在記錄下來 查詢oracle表空間大小: 其中包含了當前的表空間和臨時表空間總空間大小和當前使用情況,突然看到其中包含臨時表空間語句,產生了一些興趣,度了一番之後,如下: 臨時表空間使用情況 創建臨時表空間,比起普通表空間多了temporary關鍵字 ...
在網上搜索了很多次oracle表空間查詢語句,現在記錄下來
查詢oracle表空間大小:
SELECT * FROM ( SELECT D.TABLESPACE_NAME, SPACE || 'M' "SUM_SPACE(M)", BLOCKS "SUM_BLOCKS", SPACE - NVL (FREE_SPACE, 0) || 'M' "USED_SPACE(M)", ROUND ( (1 - NVL (FREE_SPACE, 0) / SPACE) * 100, 2) || '%' "USED_RATE(%)", FREE_SPACE || 'M' "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, ( SELECT TABLESPACE_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 SELECT D.TABLESPACE_NAME, SPACE || 'M' "SUM_SPACE(M)", BLOCKS SUM_BLOCKS, USED_SPACE || 'M' "USED_SPACE(M)", ROUND (NVL (USED_SPACE, 0) / SPACE * 100, 2) || '%' "USED_RATE(%)", NVL (FREE_SPACE, 0) || 'M' "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, ( SELECT TABLESPACE_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(+) ORDER BY 1)
其中包含了當前的表空間和臨時表空間總空間大小和當前使用情況,突然看到其中包含臨時表空間語句,產生了一些興趣,度了一番之後,如下:
臨時表空間使用情況
創建臨時表空間,比起普通表空間多了temporary關鍵字
create temporary tablespace x_temp tempfile 'F:\app\Admin\oradata\orcl\temp_x.dbf' size 10m autoextend on next 10m maxsize 2048m extent management local
查詢臨時表空間使用情況時,如果臨時表空間是dictionary managed temporary tablespace,可以使用下麵SQL:
SELECT (S.TOT_USED_BLOCKS/F.TOTAL_BLOCKS)*100 AS "PERCENT USED" FROM (SELECT SUM(USED_BLOCKS) TOT_USED_BLOCKS FROM V$SORT_SEGMENT WHERE TABLESPACE_NAME='TEMP' ) S, (SELECT SUM(BLOCKS) TOTAL_BLOCKS FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='TEMP' ) F;
如果臨時表空間是Locally Manageed Temporary Tablespace,可以使用下麵SQL:
SELECT T.TABLESPACE_NAME, ( U.TOT_USED_BLOCKS / T.TOTAL_BLOCKS ) * 100 AS "PERCENT USED" FROM (SELECT TABLESPACE_NAME, SUM(USED_BLOCKS) TOT_USED_BLOCKS FROM V$SORT_SEGMENT WHERE TABLESPACE_NAME = 'TEMP' GROUP BY TABLESPACE_NAME) U, (SELECT TABLESPACE_NAME, SUM(BLOCKS) TOTAL_BLOCKS FROM DBA_TEMP_FILES WHERE TABLESPACE_NAME = 'TEMP' GROUP BY TABLESPACE_NAME) T;
也可以使用如下SQL:
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(%)", SPACE - used_space "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, (SELECT tablespace, Round(SUM(blocks * 8192) / (1024 * 1024), 2) USED_SPACE FROM v$sort_usage GROUP BY tablespace) F WHERE D.tablespace_name = F.tablespace(+)
在最開始查詢臨時表空間的臨時表部分sql語句是記錄了temp文件在某一時刻使用過的最大大小,視圖v$temp_space_header顯示的是每一個temp文件在某一個時刻使用過的最大大小,從本質上說,它顯示的是每一個tempfile的初始化大小,而不是實際分配的塊大小,而v$sort_usage中可以看到臨時表空間的當前使用情況
臨時表空間爆滿處理
臨時表空間主要用來做查詢和存放一些緩衝區數據。臨時表空間消耗的主要原因是需要對查詢的中間結果進行排序,進行導入導出expdp/impdp等,當臨時表空間滿了之後,根據查找的內容,有以下處理方式
1、重啟資料庫會釋放部分臨時表空間,不太適用於生產環境
2、增加臨時表空間數據文件大小
alter tablespace temp add tempfile '/data/prod/proddata/temp013.dbf' size 8G
3、重建臨時表空間
create temporary tablespace TEMPA TEMPFILE 'F:/app/Admin/oradata/orcl/temp02.dbf ' SIZE 8192M REUSE AUTOEXTEND ON NEXT 1024K MAXSIZE UNLIMITED; alter database default temporary tablespace tempa; drop tablespace temp including contents and datafiles;
當tempa表空間滿了之後亦可以切換回temp表空間
create temporary tablespace TEMP TEMPFILE 'F:/app/Admin/oradata/orcl/temp01.dbf ' SIZE 8192M REUSE AUTOEXTEND ON NEXT 1024K MAXSIZE UNLIMITED; alter database default temporary tablespace temp; drop tablespace tempa including contents and datafiles;
這樣實現預設臨時表空間切換,臨時表空間組這些後面再考慮,一般要求drop的臨時表空間最好不存在活動的排序操作,若刪除過程中出現卡住的現象,可以用以下查詢語句查出進程,驗證影響後,可將進程殺掉
Select se.username, se.sid, se.serial#, 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;
alter system kill session '66,6666; (假如某一條運行的sql語句的SID為66,serial#為6666)
4、收縮臨時表空間
alter tablespace temp shrink space keep 4G
KEEP 選項用來指定壓縮時表空間或者數據文件shrink的最小值,如果沒有執行該命令,那麼表空間或數據文件將被壓縮到最小值。如下
alter tablespace temp shrink space
TEMP表空間被壓縮到最小,Temp 表空間過小對性能是有影響的,所以在shrink時,還是建議使用keep 指定最小值
SELECT * FROM DBA_TEMP_FREE_SPACE;
該語句也可以查看臨時表空間使用情況
參考:https://www.cnblogs.com/kerrycode/p/5797233.html