Drop Tablespace之后,Device or resource busy的解决办法

最近同事反馈了好几个问题,都是删除表空间和数据文件后,与之相应的磁盘设备文件进行回收时报错。文件的句柄被Oracle的后台进程继续持有。这种现象不仅仅出现在裸设备上,也同时出现在ASM上面。查了相关的MOS文档的介绍,都是反馈是bug。一般给出的Workground的方法是:

  • 重启数据库
  • 杀持有进程

对于一般的应用来说影响到不是很大,找一个合适的停机窗口重启一下既可以解决这类问题。但是对于一些重要的7*24的系统来说,就很麻烦了。但是也是有解决办法的。我这里主要介绍一下使用oradebug来释放文件句柄。

1.打开一个会话,执行对表的查询,此时该会话会打开文件的句柄。

SQL> connect test/test
Connected.
SQL> select sid from v$mystat where rownum select spid from v$process where addr=(select paddr from v$session where sid=159);

SPID
------------
20396

SQL> select * from test ;

NAME
--------------------
aaa
ccc

2.从操作系统上查看占用文件句柄的进程。

[oracle@ora10g ~]$ lsof /oracle/app/oracle/oradata/orcl/test.dbf 
COMMAND   PID   USER   FD   TYPE DEVICE      SIZE    NODE NAME
oracle  20354 oracle   22uW  REG    8,3 524296192 1855248 /oracle/app/oracle/oradata/orcl/test.dbf
oracle  20356 oracle   25u   REG    8,3 524296192 1855248 /oracle/app/oracle/oradata/orcl/test.dbf
oracle  20360 oracle   19u   REG    8,3 524296192 1855248 /oracle/app/oracle/oradata/orcl/test.dbf
oracle  20396 oracle   12u   REG    8,3 524296192 1855248 /oracle/app/oracle/oradata/orcl/test.dbf

3.查看文件的描述符(file description)

[oracle@ora10g ~]$ ls -l /proc/20396/fd
total 0
lrwx------ 1 oracle oinstall 64 Jul 26 15:09 0 -> /dev/pts/8
lrwx------ 1 oracle oinstall 64 Jul 26 15:14 1 -> /dev/pts/8
lrwx------ 1 oracle oinstall 64 Jul 26 15:14 10 -> /oracle/app/oracle/oradata/orcl/system01.dbf
l-wx------ 1 oracle oinstall 64 Jul 26 15:14 11 -> pipe:[60201]
lrwx------ 1 oracle oinstall 64 Jul 26 15:14 12 -> /oracle/app/oracle/oradata/orcl/test.dbf
lrwx------ 1 oracle oinstall 64 Jul 26 15:14 2 -> /dev/pts/8
lr-x------ 1 oracle oinstall 64 Jul 26 15:14 3 -> /dev/null
lr-x------ 1 oracle oinstall 64 Jul 26 15:14 4 -> /dev/null
lr-x------ 1 oracle oinstall 64 Jul 26 15:14 5 -> /dev/null
lr-x------ 1 oracle oinstall 64 Jul 26 15:14 6 -> /dev/null
lr-x------ 1 oracle oinstall 64 Jul 26 15:14 7 -> /dev/zero
lr-x------ 1 oracle oinstall 64 Jul 26 15:14 8 -> pipe:[60200]
lr-x------ 1 oracle oinstall 64 Jul 26 15:14 9 -> /oracle/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb

4.根据文件描述符,释放进程占用文件的句柄。

[oracle@ora10g ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.5.0 - Production on Fri Jul 26 15:23:37 2013

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> oradebug setospid 20396
Oracle pid: 15, Unix process pid: 20396, image: oracle@ora10g.localdomain (TNS V1-V3)
SQL> oradebug call close 12
Function returned 0

5.再次查看占用文件句柄的进程。

[oracle@ora10g ~]$ lsof /oracle/app/oracle/oradata/orcl/test.dbf 
COMMAND   PID   USER   FD   TYPE DEVICE      SIZE    NODE NAME
oracle  20354 oracle   22uW  REG    8,3 524296192 1855248 /oracle/app/oracle/oradata/orcl/test.dbf
oracle  20356 oracle   25u   REG    8,3 524296192 1855248 /oracle/app/oracle/oradata/orcl/test.dbf
oracle  20360 oracle   19u   REG    8,3 524296192 1855248 /oracle/app/oracle/oradata/orcl/test.dbf

最终我们把进程占用文件的句柄通过oradebug命令进行了释放,这种做法非常适合删除了某个表空间,然后要回收设备文件的时候发现某个进程占用,而又不敢轻易kill该进程(系统进程)的解决办法。mos上有下列相关的bug。

Bug 6316479 : RDBMS DOES NOT CLOSE FILE HANDLE ON DROPPED DATAFILE
Bug 11785938 : ASM IS NOT RELEASING FILE DESCRIPTORS AFTER DROP DISGROUP

分享到: 更多

Post a Comment

Your email is never published nor shared. Required fields are marked *