大批量數據刪除

我在一個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 監控

對於尚未killsession,查出這個session執行的語句,將結果反饋運營,並詢問是否可以kill session date

已經標記爲killedsession,請繼續監控 cgi

 

--刪除數據 select

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

相關文章
相關標籤/搜索