oracle kill session.delete 600w(1.25G)数据 1个多小时无结果

mx表中数据太多,查询变慢,备份去年2011年的,然后将2011年数据删掉。 

delete from t_busi_presend_mx where cjsj<to_date('2012','yyyy');

这个语句,执行1个多小时了,没有反应,现在决定,把这个session删掉,想别的方法来删除这600W数据,kill session方法如下(按顺序执行sql)。某DBA给我分析:

1.select sum(bytes/1024/1024/1024) GB ,status from dba_undo_extents group by status;

kill session之前:

SQL> select sum(bytes/1024/1024/1024) GB ,status from dba_undo_extents group by status;

        GB STATUS
---------- ---------
0.00878906 UNEXPIRED
0.01403808 EXPIRED
0.78137207 ACTIVE

 

kill session之后:

SQL> select sum(bytes/1024/1024/1024) GB ,status from dba_undo_extents group by status;

        GB STATUS
---------- ---------
1.25329589 UNEXPIRED
0.01867675 EXPIRED
0.00097656 ACTIVE

答:

这个delete 操作,会将删除的数据放到 undo 回滚段里面,如果回滚段空间不够,就会等待,你的回滚段只有 14m,可用,所以这个删除操作停在这了。

两个办法

1 等

2 把这个进程杀掉

问:
等  应该是没有结果的吧 因为数据有1.25G 回滚段只有14M 怎么等都等不来吧 这种情况  会有结果么 ? 不是只有14M回滚段?
答:
不知道啥时候出结果,因为你的数据库一直在用。不是 只有 14m,而是只有 14m 可用。你现在没有删除成功,能回滚。杀进程吧。
 
2.select sid,serial#,logon_time,username,program,machine,event from v$session
  where wait_class <> 'Idle'
  order by logon_time desc
--查当前登录到数据库的会话

kill session之前:

我的电脑名:LEJER0FQOX6AT6H.所以上面第二行记录是我刚才执行的delete会话。

kill session之后:

SQL> select sid,serial#,logon_time,username,program,machine,event from v$session
  2    where wait_class <> 'Idle'
  3    order by logon_time desc
  4  ;

       SID    SERIAL# LOGON_TIME  USERNAME                       PROGRAM                                                          MACHINE                                                          EVENT
---------- ---------- ----------- ------------------------------ ---------------------------------------------------------------- ---------------------------------------------------------------- ----------------------------------------------------------------

SQL> 

 

3.

杀掉进程 

alter   system   kill   session   '96,51686'     --这个96,51686是上面查询出来的sid和serial#。

执行过后,报错(所以,这一句执行了相当与没有用):

ORA-00031:标记要终止的会话
4.

select spid os_sid
  from v$process
  where addr = (select paddr from v$session where sid = &oracle_sid);

--输入 96,这个96,是上面第二句sql查出的sid。

OS_SID
------------
4520

 

5.查实例名

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orclyxkj

SQL>

 

6.
你在查看一下,看进程是否存在

如果还存在,可以用这个

这个是直接杀系统进程,比较狠

在oracle服务器端windows 开个命令窗口

C:\Users\Administrator>set ORACLE_SID=orclyxkj

C:\Users\Administrator>orakill orclyxkj 4520    --这个4520是步骤4中查出来的

Kill of thread id 4520 in instance orclyxkj successfully signalled.

C:\Users\Administrator>


到这里,进程就杀掉了。再查询,进程应该没有了。

注意6中如果在本机客户端执行,会报这个错:

C:\Documents and Settings\Administrator>set ORACLE_SID=orclyxkj

C:\Documents and Settings\Administrator>orakill orclyxkj 4520

Could not attach to Oracle instance orclyxkj: err = 2


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值