大批量数据删除

我在一个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

对于还没有killsession,查出这个session执行的语句,将结果反馈运营,并询问是否能够kill session

已经标记为killedsession,请继续监控

 

--删除数据

按步就班的辦法
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 分区

 

转载于:https://my.oschina.net/u/729507/blog/78886

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值