由於操作系統空間不足,客戶需要清理刪除臨時表空間,測試環境模擬場景進行操作。
一、前期環境准備
SQL> create temporary tablespace temp_b tempfile '/11.2.0.4/app/oracle/oradata/tt11204/temp_b.dbf' size 10m; Tablespace created.
SQL> alter user yang temporary tablespace temp_b;
SQL>conn yang/yang
執行如下SQL報錯,臨時表空間不足
SQL> select * from dba_objects,dba_segments order by 1,2,3,4,5,6
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP_B
select file_name,file_id,tablespace_name,bytes/1024/1024/1024,blocks,status,AUTOEXTENSIBLE from dba_temp_files
FILE_NAME FILE_ID TABLESPACE_NAME BYTES/1024/1024/1024 BLOCKS STATUS AUTOEX
------------------------------------------------------------ ---------- -------------------- -------------------- ---------- -------------- ------
/11.2.0.4/app/oracle/oradata/tt11204/temp01.dbf 1 TEMP .028320313 3712 ONLINE YES
/11.2.0.4/app/oracle/oradata/tt11204/temp_b.dbf 3 TEMP_B .009765625 1280 ONLINE NO
對臨時表空間自擴展后
SQL> alter database tempfile '/11.2.0.4/app/oracle/oradata/tt11204/temp_b.dbf' AUTOEXTEND On;
再次執行
SQL> select * from dba_objects,dba_segments order by 1,2,3,4,5,6
修改用戶默認表空間,與實際情況進行模擬還原
SQL> alter user yang temporary tablespace temp;
二、問題現象准備
以下為實際操作步驟 查詢臨時表空間組 NULL SQL> select * from dba_tablespace_groups; SQL> select property_value from database_properties where property_name='DEFAULT_TEMP_TABLESPACE'; TEMP 數據庫默認臨時表空間 SQL> select username,TEMPORARY_TABLESPACE from dba_users where ACCOUNT_STATUS='OPEN' order by 2; USERNAME TEMPORARY_TABLESPACE -------------------- ------------------------------ SYSTEM TEMP SYS TEMP TEST TEMP TT TEMP TESTA TEMP YANG TEMP ZABBIX TEMP SCOTT TEMP 8 rows selected.
SQL> select file_id,tablespace_name,bytes/1024/1024/1024 from dba_temp_files
FILE_ID TABLESPACE_NAME BYTES/1024/1024/1024
---------- -------------------- --------------------
1 TEMP .028320313
2 TEMP_B .009765625 通過上述查詢可以發現,數據庫不存在臨時表空間組,默認臨時表空間是TEMP,而另一個表空間temp_b並無人使用,因此進行刪除回收空間。
刪除臨時表空間一直hang住,也不報錯ALERT無任何有效信息
SQL> drop tablespace temp_b including contents and datafiles;
三、問題處理
新開session 查詢event SQL> select INST_ID,sid,serial#,USERNAME,STATUS,MACHINE,SQL_ID,EVENT,(sysdate-LOGON_TIME)*86400 as "s",LAST_CALL_ET from
gv$session where status='ACTIVE' and username is not null; INST_ID SID SERIAL# USERNAME STATUS MACHINE SQL_ID EVENT s LAST_CALL_ET ------- ------ ------- -------------------- ---------- -------------------- -------------------- ------------------------------ ------- ------------ 1 11 19289 SYS ACTIVE enmo 2ymxxw3mapxd9 SQL*Net message to client 5 0 1 72 621 SYS ACTIVE enmo 9mzfur1h8f49p enq: TS - contention 1203 77
可以發現等待事件
enq: TS - contention
SQL> select sid,username,event,sql_id,BLOCKING_SESSION from gv$session where sid=72;
SID USERNAME EVENT SQL_ID BLOCKING_SESSION
------ -------------------- ------------------------------ -------------------- ----------------
72 SYS enq: TS - contention 9mzfur1h8f49p 66
SQL> select INST_ID,sid,serial#,USERNAME,STATUS,MACHINE,SQL_ID,EVENT,(sysdate-LOGON_TIME)*86400 as "s",LAST_CALL_ET from gv$session where sid=66;
INST_ID SID SERIAL# USERNAME STATUS MACHINE SQL_ID EVENT s LAST_CALL_ET
------- ------ ------- -------------------- ---------- -------------------- -------------------- ------------------------------ ------- ------------
1 66 1 ACTIVE enmo smon timer 828829 828830
當臨時段存在被使用的情況時,臨時段將被保護,無法被刪除。
SQL> select USERNAME,SESSION_ADDR,SQL_ID,TABLESPACE,CONTENTS,BLOCKS from v$sort_usage
USERNAME SESSION_ADDR SQL_ID TABLESPACE CONTENTS BLOCKS
-------------------- ---------------- -------------------------- --------
SYS 00000000F57220D0 c61dmq2mac2m9 TEMP TEMPORARY 128
YANG 00000000F57D9550 c5zk3pjstds2b TEMP_B TEMPORARY 17152
找到使用臨時段的session kill
問題處理。
SQL> select INST_ID,sid,serial#,USERNAME,STATUS,MACHINE,SQL_ID,EVENT,(sysdate-LOGON_TIME)*86400 as "s",LAST_CALL_ET from gv$session where saddr='&SESSION_ADDR ';
SQL>alter system kill session 'sid,serial#' immediate;