/* 1. 检查参数文件类型 ,如果不是spfile ,scope=memory ,要记得尽快去修改pfile */
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /opt/oracle/112/dbs/spfilemyor
cl11.ora
/* 2. 查看当前数据文件size */
select tablespace_name,sum(bytes)/1024/1024/1024 GB
from dba_data_files group by tablespace_name
union all
select tablespace_name,sum(bytes)/1024/1024/1024 GB
from dba_temp_files group by tablespace_name order by GB;
/* 3. 建立一个新undo tbs,先df确认有足够空间,默认的AUTOEXTEND OFF*/
create undo tablespace UNDOTBS02 datafile '/opt/oracle/oradata/myorcl11/undotbs02.dbf' size 100m ;
/* 4. 查看当前事务,存在活动事务时,是可以切换undo tbs的,只是正使用的回滚段无法offline,
仍保持online状态(dba_rollback_segs),而在v$rollstat中段的status是PENDING OFFLINE */
select count(*) from v$transaction;
/* 此时如果drop原来tbs,会收到 */
SQL> drop tablespace undotbs01 including contents;
drop tablespace undotbs01 including contents
*
ERROR at line 1:
ORA-30013: undo tablespace 'UNDOTBS01' is currently in use
/* 5. 等待dba_rollback_segs原tbs的段全部offline,或者看v$rollstat已不存在 */
drop tablespace undotbs01 including contents and datafiles;
/* 如果急着想干掉原来的transaction */
select ss.sid,ss.SERIAL#,p.SPID,ss.SCHEMANAME,ss.OSUSER,ss.TERMINAL,ss.PROGRAM
from v$session ss, v$process p, v$transaction t
where ss.TADDR = t.ADDR
and ss.PADDR = p.ADDR
and t.UBAFIL = &fno; --&fno是undotbs1的file#
/* 记下 p.SPID 3293 ,没记看最后...
因为alter system kill session 会使paddr 指向同一个虚拟地址.
此时v$process和v$session失去关联,进程就此中断.
然后Oracle就等待PMON去清除这些Session.
所以通常等待一个被标记为Killed的Session退出需要花费很长的时间.
如果此时被Kill的process,重新尝试执行任务,那么马上会收到进程中断的提示,
process退出,此时Oracle会立即启动PMON来清除该session.这被作为一次异常中断处理 */
SQL> alter system kill session '39,35';
System altered.
/* 此时v$session status被标记为killed,事务回滚,在v$transaction中消失,
但dba_rollback_segs,v$rollstat仍是占用状态*/
/* kill ospid, 如果session 一直处于killed 状态,那么可以考虑在操作系统级别kill掉相关的进程。
不过在操作之前,要先确认session 是否在执行rollback 操作, v$session关联查不到v$transaction就okay */
# lsof -p 3293
oracle 3293 oracle 11u REG 8,2 10493952 283525 /opt/oracle/oradata/myorcl11/append02.dbf
oracle 3293 oracle 12u REG 8,2 104865792 282798 /opt/oracle/oradata/myorcl11/undotbs01.dbf (deleted)
--文件句柄未释放,还可以恢复文件
# cp /proc/3293/fd/12 ~/undotbs01.dbf.frm
# kill -9 3293
--至此undotbs01才被真正删除,空间释放
/* 网上查到还有一个语句 */
SQL> ALTER SYSTEM DISCONNECT SESSION'sid,serial#' POST_TRANSACTION;
SQL> ALTER SYSTEM DISCONNECT SESSION'sid,serial#' IMMEDIATE;
POST_TRANSACTION 选项会等待事务完成之后在断开连接。
IMMEDIATE 选项会立即断开连接,然后事务会进行recover操作。
/* 与kill session 命令不同,disconnect session 命令会kill 掉 dedicated server process,
该命令等同于在操作系统级别kill 掉server process。
使用alter system disconnectsession 命令就不需要切换到系统来kill session,
也从而减少了kill 错进程的几率 */
/* 如果已经asks了,没记下v$process.spid,因为v$process的信息都不会动
所以还是不难找,下面的sql可基本上最快定位到process*/
select pid,spid,pname,serial#,program from v$process
where addr in (
select p.addr from v$process p where pid <> 1
minus
select s.paddr from v$session s);
PID SPID PNAME SERIAL# PROGRAM
---------- ------------------------ ----- ---------- -----------------------------------
17 3073 D000 1 oracle@localhost.myrh6 (D000)
18 3075 S000 1 oracle@localhost.myrh6 (S000)
36 4195 81 oracle@localhost.myrh6 (TNS V1-V3)
--总结就是,不要太着急,多等会再drop总是好的
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28859270/viewspace-776228/ ,如需转载,请注明出处,否则将追究法律责任。