我在一个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分钟而已)
要检查数据库中什么用户的操作产生这么大量的redo,可以查询表dbmgr.REDO_ALERT_KILL_REC_TBL。
如果在当时的时间点下有记录,说明就是被记录的这一个或几个session造成的log卷问题。
如果没有查到记录,可以在一段时间间隔内(如间隔3分钟)执行以下语句,2次执行结果redosize差值最大的session产生的redo最多
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;
检查这个session是否已经被kill,是否标记为killed。
对于还没有kill的session,查出这个session执行的语句,将结果反馈运营,并询问是否能够kill session。
已经标记为killed的session,请继续监控
--删除数据
按步就班的辦法1. drop index
2. disable trigger
3. force not logging
4. delete rows
5. create original index
6. enable trigger
7. force logging
你先create new_table as select 条件就是你要保留的数据
然后把整个表truncate,然后把new_table改名
这样应该比你直接删除快些~
或者做成分区表,直接truncate 分区