天天看點

Oracle臨時表空間過大解決方法

解決​​Oracle​​臨時表空間過大有兩種方法,方法一增加臨時表空間的大小,方法二重建臨時表空間,解決臨時表空間過大的問題。

方案一:增加臨時表空間的大小

--1.臨時表空間的使用情況

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(+)     

  AND D.tablespace_name like 'TEMP%';

--檢視臨時表空間的總大小和最大擴充大小(能看到資料檔案)

select file_name,

      tablespace_name,

      bytes / 1024 / 1024 MB,

      autoextensible,

      maxbytes / 1024 / 1024 MAX_MB

  from dba_temp_files;

--增加臨時表空間的大小

alter tablespace temp1 add tempfile '/data/prod/proddata/temp013.dbf' size 4G;

alter tablespace temp2 add tempfile '/data/prod/proddata/temp024.dbf' size 4G;

--方案二:重建臨時表空間,解決臨時表空間過大的問題。

--0.檢視目前預設的臨時表空間

select *

  from database_properties

 where property_name = 'DEFAULT_TEMP_TABLESPACE';

--1.建立中轉臨時表空間

create temporary tablespace temp3 tempfile '/data/prod/proddata/temp31.dbf' size 4G tablespace group temp;

create temporary tablespace temp4 tempfile '/data/prod/proddata/temp41.dbf' size 4G tablespace group temp;

--2.删除原臨時表空間組中的臨時表空間

--2.1從預設臨時表空間組temp中移除temp1和temp2;

ALTER TABLESPACE temp1 TABLESPACE GROUP '';

ALTER TABLESPACE temp2 TABLESPACE GROUP '';

--2.2删除臨時表空間temp1和temp2

drop tablespace temp1 including contents and datafiles;

drop tablespace temp2 including contents and datafiles;

--2.3如果删除表空間的時候,hang住的話,可以使用下列語句,先把運作在temp臨時表空間的sql語句kill掉,這樣的sql語句多為排序的語句

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;

--2.4 kill相關程序

alter system kill session '584,23181';

alter system kill session '196,64972';

alter system kill session '262,19832';

alter system kill session '324,40273';

alter system kill session '326,38967';

alter system kill session '1266,54596';

or

--重新開機DB

--關閉應用-->關閉監聽-->shutdown immediate

--startup-->啟動監聽-->執行以下操作後打開應用

--2.5 建立臨時表空間,并加入臨時表空間組temp

create temporary tablespace temp1 tempfile '/data/prod/proddata/temp11.dbf' size 4G tablespace group temp;

create temporary tablespace temp2 tempfile '/data/prod/proddata/temp21.dbf' size 4G tablespace group temp;

--2.6 給臨時表空間組temp的成員temp1,temp2,temp3,temp4 各增加一個成員。

alter tablespace temp1 add tempfile '/data/prod/proddata/temp12.dbf' size 4G;

alter tablespace temp2 add tempfile '/data/prod/proddata/temp22.dbf' size 4G;

alter tablespace temp3 add tempfile '/data/prod/proddata/temp32.dbf' size 4G;

alter tablespace temp4 add tempfile '/data/prod/proddata/temp42.dbf' size 4G;

--2.7檢視臨時表空間組temp

select * from dba_tablespace_groups;

--3 臨時表空間組仍然使用99.98%,

--3.1為每個臨時表空間添加4G空間

alter tablespace temp1 add tempfile '/data/prod/proddata/temp13.dbf' size 4G;

alter tablespace temp2 add tempfile '/data/prod/proddata/temp23.dbf' size 4G;

alter tablespace temp3 add tempfile '/data/prod/proddata/temp33.dbf' size 4G;

alter tablespace temp4 add tempfile '/data/prod/proddata/temp43.dbf' size 4G;