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
--查当前登录到数据库的会话
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