我在一個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 分區