ITPub博客

首页 > 数据库 > Oracle > OS 删除temp表空间 而磁盘空间未释放的解决方案

OS 删除temp表空间 而磁盘空间未释放的解决方案

原创 Oracle 作者:maohaiqing0304 时间:2014-09-15 15:48:24 1 删除 编辑


标题:OS 删除temp表空间 而磁盘空间未释放的解决方案 

作者:lōττéry©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]



2013-04-29 17:57:47的笔记.今天发现说很乱,此文特加以整理


场景:
昨天在系统上删除了32G的temp01.dbf文件,结果还没有释放磁盘空间 df -hl看下/目录还是使用100%
未释放磁盘空间原因:在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用.

所有在用命令drop tablespace temp [including contents and datafiles];会停在那里
等待事件:
SQL> SELECT SID,SEQ# EVENT,P1TEXT,P2TEXT,P3TEXT,STATE FROM v$session_wait s where s.SID=159;
 
SID   SEQ# EVENT                   P1TEXT  P2TEXT          P3TEXT  STATE
----------------------------------------------------------------------------
159   440  enq: TS - contention  name|mode tablespace ID   dba    WAITING
SQL>  


如下解决方案①②可以将OS磁盘空间释放和temp表空间删除:
① 
可以通过在系统上执行lsof |grep ..看下已经删除但仍被应用程序占用的文件列表

 [root@kfdb49 dbs]# lsof |grep deleted | grep TEMP
oracle     1804    oracle   31u      REG              253,0  34359730176    1376405 /oracle/app/product/10.2.0/db_1/dbs/TEMP01.DBF (deleted)


让os自动回收磁盘空间方法:kill掉相应的进程 或者 停掉使用这个文件的应用

1)kill -9 1804      ... 再drop tablespace temp including contents and datafiles;
2)restart oracle 对应的空间会被释放


在重启的时候注意要 shutdown immediate  等待事物提交完成,再重启 要是重启的时候指定了临时文件
1、CREATE CONTROLFILE REUSE DATABASE "instance“.....
2、alter database backup controlfile to trace as '新位置';  参数文件指定好新位置,为了下次启动使用
3、alter database open;
4、create spfile from pfile;


检查磁盘空间:
[root@kfdb49 dbs]#  df -hl 



②
查找数据库中谁在用这个temp;


--查看谁在用这个temp表空间/及其当时的一个结果~
SQL>   select se.SADDR,
         se.SID,
         SE.SERIAL#,
         se.USERNAME,
         se.OWNERID,
         se.STATUS,
         se.OSUSER,
         se.PROCESS,
         se.MACHINE,
         se.TERMINAL,
         se.PROGRAM,
         se.SQL_id,
         su.TABLESPACE,
         su.EXTENTS,
         su.BLOCKS
    FROM v$session se, v$sort_usage su
   WHERE se.saddr = su.session_addr;

SADDR   SID    SERIAL# USERNAME     OWNERID    STATUS   OSUSER      PROCESS      MACHINE             TERMINAL         PROGRAM  SQL_ID   TABLESPACE EXTENTS  BLOCKS
----------------------------------------------------------------------------------------------------------------------------------------------------------------
2133DF5C 158   36     SYS          2147483644 INACTIVE MHQ-PC\mhq  1896:1968    WORKGROUP\MHQ-PC     MHQ-PC       plsqldev.exe                      TEMP      23   2944
 
SQL> 


从结果中发现  STATUS ==> INACTIVE 可以直接通过如下语句kill掉进程来释放磁盘空间..
语句:
Alter system kill session '158,36'; 
再drop tablespace temp including contents and datafiles;
再检查磁盘空间:
[root@kfdb49 dbs]#  df -hl 

若 STATUS ==> ACTIVE通过SQL_ID找到对应的sql再和相关人员确认方案...

 


此条目发表在 Oracle 分类目录。将固定连接加入收藏夹。



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28602568/viewspace-1270065/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
.

注册时间:2013-03-13

  • 博文量
    117
  • 访问量
    2626269