大表delete刪數據導致數據庫異常解決
目錄
- 一、問題描述
- 二、查看數據庫情況
- 三、提出方案
- 四、執行過程
一、問題描述
早上正在上班路上,群里客戶說,有一張24G的大表,delete刪了26小時還沒有跑完,目前進程還在跑讓幫忙處理下,停止當前進程,并保留對應條件的數據,多余數據刪掉。
二、查看數據庫情況
1.未開歸檔
2.UNDO表空間爆滿
三、提出方案
1.經過溝通,該表為測試數據表,目前沒有在使用;
于是打算rename該表,通過ctas的方式去將需要的數據撈出來,重建索引和相關約束。
2.存在一個問題:delete進程已經執行了26小時,如果kill進程,必然會導致undo回滾,回滾默認開啟并行會導致數據庫和系統負載很高,于是需要提前處理下,設置參數_fast_start_parallel_rollback_關掉UNDO并行。
--查看回滾參數設置,是否是默認并行 SQL> show parameter fast_start_parallel_rollback NAME TYPEVALUE ------------------------------------ ----------- ------------------------------ fast_start_parallel_rollback string LOW --LOW 代表 開啟CPU*2并行 --設置spfile取消并行 SQL> alter system set fast_start_parallel_rollback=false; System altered.
四、執行過程
1.備份保留 表創建語句。
2.記錄當前無效對象。
SELECT d.OWNER ,d.OBJECT_NAME ,d.OBJECT_TYPE ,d.status FROM dba_objects d WHERE d.status = "INVALID" AND d.owner = "**";
3.查看delete進程pid,系統級kill掉。
--查詢SID, SERIAL# select s.SQL_TEXT, se.SID, se.SERIAL# from v$session se, v$sql s where s.sql_id = se.SQL_ID and username = "**" and status = "ACTIVE" and s.SQL_TEXT like "%delete * from *****%"; --數據庫級kill進程 alter system kill session "2953,31083";
報錯
ERROR at line 1:
ORA-00031: session marked for kill
--系統級 kill進程
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=2953;
kill -9 105257
4.觀察undo回滾情況
--查看等待事件 select inst_id,event,count(*) from gv$session a where a.status="ACTIVE" and not (a.type = "BACKGROUND" and a.state="WAITING" and a.wait_class="Idle") group by inst_id,event order by a.inst_id,count(*) desc; --------------------------------------------------- 1 wait for a undo record 61 1 resmgr:cpu quantum 29 1 enq: RO - fast object reuse 22 1 enq: CR - block range reuse ckpt 20 1 free buffer waits 17 --查看當前數據回滾情況 alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"; select usn, state, undoblockstotal "Total", undoblocksdone "Done", undoblockstotal - undoblocksdone "ToDo", decode(cputime, 0, "unknown", sysdate + (((undoblockstotal - undoblocksdone) / (undoblocksdone / cputime)) / 86400)) "Estimated time to complete" from v$fast_start_transactions where state = "RECOVERING"; --------------------------------------------------- 83 RECOVERING 9026713 455 9026258 26-4月 -21
5.觀察系統負載,IO負載,內存使用情況
6.等待回滾完成,持續時間較久。
7.回滾成功后,rename 原表。
rename table to table_20210410;
8.CTAS將需要的數據撈到新表(原來的表名)中。
create table USER.TABLE nologging parallel 8 tablespace TBS as select /*+parallel(TABLE,"8")*/ * from USER.TABLE_20210410 where *** like "******%"; --取消并行 alter table USER.TABLE noparallel; --開啟logging alter table USER.TABLE logging;
9.rename索引,并重建索引。
alter index USER.INDEX1 rename to INDEX1_20210410; --重建索引 create index USER.INDEX1 on USER.TABLE (***) tablespace TBS parallel 8; --取消并行 alter index USER.INDEX1 noparallel;
10.創建約束,授權。
11.比對無效對象,數據是否一致
12.drop掉rename的表。
drop table USER.TABLE_20210410 cascade;
以上就是大表delete刪數據導致數據庫異常解決的詳細內容,更多關于delete刪數據數據庫異常的資料請關注其它相關文章!
