找到正在使用temp file的session

有的时候,我们需要删除某个temp file的时候,会发现该tempfile正在被使用,我们无法drop其文件,我们可以用如下的方式来进行。

sys @ ORA10G ( 9.78.218.143 ) > ALTER DATABASE TEMPFILE ' E: \O RA10G \O RACLE \O RADATA \O RA10G \T EMP01.DBF ' DROP INCLUDING DATAFILES ;
ALTER DATABASE TEMPFILE ' E: \O RA10G \O RACLE \O RADATA \O RA10G \T EMP02.DBF ' DROP INCLUDING DATAFILES
*
ERROR at line 1 :
ORA - 25152 : TEMPFILE cannot be dropped at this time
 
 
Elapsed : 00 : 00 : 00.23

此时你的temp tablespace中有2个文件,我们得找到哪个session是使用temp file1,哪个session在使用我想删除的temp file2.

我们来找一下。注意tempfile的segment file number,其实是db_files,加上file id。

sys @ ORA10G ( 9.78.218.143 ) > select file_id from dba_temp_files where file_name = ' E: \O RA10G \O RACLE \O RADATA \O RA10G \T EMP02.DBF ' ;
 
  
FILE_ID
--------
--
         2

 
Elapsed : 00 : 00 : 00.06
sys @ ORA10G ( 9.78.218.143 ) >
sys @ ORA10G ( 9.78.218.143 ) >
SQL > show parameter db_files
 
NAME                                   TYPE                               VALUE
----------------------------------
-- -------------------------------- ------------------------------
db_files                               integer                           200
sys @ ORA10G ( 9.78.218.143 ) >

所以,那个temp file的id应该是202了。我们往往看到alertlog中有报错说202号文件无法扩展了,你如果去看dba_data_files中,找不到这个文件,而在dba_temp_files中直接找这一号的文件,也找不到,那是因为要用db_files数加上temp file的id才是。

好了。我们继续来找是哪个session在占用这个temp file。

sys @ ORA10G ( 9.78.218.143 ) > l
 
1   select c . spid ,
 
2           b . tablespace ,
 
3           b . segfile #,
 
4           b . segblk #,
 
5           round ((( b . blocks * d . VALUE ) / 1024 / 1024 ) , 2 ) size_mb ,
 
6           a . SID ,
 
7           a . serial #,
 
8           a . username ,
 
9           a . osuser ,
 
10           a . program ,
 
11           a . status
 
12     from v $ session a , v $ sort_usage b , v $ process c , v $ parameter d
 
13     where b . segfile # = &seg_temp_file_id
 
14       and d . name = ' db_block_size '
 
15       and a . saddr = b . session_addr
 
16       and a . paddr = c . addr
 
17 order by b . tablespace , b . segfile #, b.segblk#, b.blocks
sys @ ORA10G ( 9.78.218.143 ) > /
Enter value for seg_temp_file_id : 202
old   13 where b . segfile # = &seg_temp_file_id
new   13 where b . segfile # = 202
 
SPID           TABLESPACE                         SEGFILE #    SEGBLK#    SIZE_MB        SID    SERIAL# USERNAME                       OSUSER                         PROGRAM                                                  STATUS
----------
-- ------------------------------- ---------- ---------- ---------- ---------- ---------- ------------------------------ ------------------------------ ---------------------------------------------------------------- --------
7496           TEMP                                     202       63753         172         148           43 SYS                             HEJIANMIN \ Administrator         sqlplus . exe                                               ACTIVE
 
Elapsed : 00 : 00 : 00.06
sys @ ORA10G ( 9.78.218.143 ) >

Kill完之后,你就可以删除你指定的temp file了。

sys @ ORA10G ( 9.78.218.143 ) > alter system kill session ' 148,43 ' ;
 
System altered .
 
Elapsed : 00 : 00 : 01.00
sys @ ORA10G ( 9.78.218.143 ) >
sys @ ORA10G ( 9.78.218.143 ) >
sys @ ORA10G ( 9.78.218.143 ) >
sys @ ORA10G ( 9.78.218.143 ) > ALTER DATABASE TEMPFILE ' E: \O RA10G \O RACLE \O RADATA \O RA10G \T EMP02.DBF ' DROP INCLUDING DATAFILES ;
 
Database altered .
 
Elapsed : 00 : 00 : 00.37
sys @ ORA10G ( 9.78.218.143 ) >
 
原文地址:http://www.oracleblog.org/working-case/find-the-session-use-temp-file/
 

你可能感兴趣的:(找到正在使用temp file的session)