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 对应的空间会被释放
检查磁盘空间:
[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再和相关人员确认方案...