我在一个600万的表中删除300万。删除好几个小时。产生log卷和redo量的告警。通过分析 数据库
--1.关掉tableb的全部触发器,这个必定要关掉,movingdata的时候必定要所有关掉,否则批量操做的时候卡死你Y的。
alter system table cgidata.nbz_act_task_tel_rela disable all triggers;
--执行完毕以后,启动触发器
alter system table cgidata.nbz_act_task_tel_rela enable all triggers;
--2,除了主键索引以外,tableb表剩余的索引所有删除掉。等执行完毕以后,重建索引(索引重建很快,个人600万数据的表的7个索引重建才花了2分钟而已) session
要检查数据库中什么用户的操做产生这么大量的redo,能够查询表dbmgr.REDO_ALERT_KILL_REC_TBL。 spa
若是在当时的时间点下有记录,说明就是被记录的这一个或几个session形成的log卷问题。 索引
若是没有查到记录,能够在一段时间间隔内(如间隔3分钟)执行如下语句,2次执行结果redosize差值最大的session产生的redo最多 io
select sysdate,se.username , se.sid, se.serial#,se.status,se.machine,se.osuser,round(st.value/1024/1024) redosize
from v$session se, v$sesstat st
where se.sid = st.sid
and st.STATISTIC# = (select STATISTIC# from v$statname where NAME='redo size')
-- and se.username is not null
and st.value>10*1024*1024
order by redosize; table
检查这个session是否已经被kill,是否标记为killed。 监控
对于尚未kill的session,查出这个session执行的语句,将结果反馈运营,并询问是否可以kill session。 date
已经标记为killed的session,请继续监控 cgi
--删除数据 select
按步就班的辦法你先create new_table as select 条件就是你要保留的数据
或者作成分区表,直接truncate 分区