大表delete刪數據導致數據庫異常解決

 更新時間:2022年07月07日 11:05:24   作者:Lucifer三思而后行  
這篇文章主要為大家介紹了大表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                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
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刪數據數據庫異常的資料請關注腳本之家其它相關文章!

相關文章

  • Oracle中基于hint的3種執行計劃控制方法詳細介紹

    Oracle中基于hint的3種執行計劃控制方法詳細介紹

    這篇文章主要介紹了Oracle中基于hint的3種執行計劃控制方法詳細介紹,它們分別是OUTLINE(大綱)、SQL PROFILE(概要文件)、SQL BASELINE(基線),文中包含大量實例,需要的朋友可以參考下
    2014-07-07
  • mybatis使用oracle進行添加數據的方法

    mybatis使用oracle進行添加數據的方法

    這篇文章主要介紹了mybatis使用oracle進行添加數據的方法,本文給大家分享我的心得體會,需要的朋友可以參考下
    2021-04-04
  • Oracle存儲過程返回游標實例詳解

    Oracle存儲過程返回游標實例詳解

    Oracle存儲過程返回游標有兩種實現方法一種是聲明系統游標,一種是聲明自定義游標,本文將詳細介紹,需要了解的朋友可以參考下
    2012-12-12
  • oracle if else語句使用介紹

    oracle if else語句使用介紹

    Oracle if else 語句的寫法及應用介紹,詳細可參考本文
    2012-11-11
  • 45個非常有用的 Oracle 查詢語句小結

    45個非常有用的 Oracle 查詢語句小結

    這里我們介紹的是 40+ 個非常有用的 Oracle 查詢語句,主要涵蓋了日期操作,獲取服務器信息,獲取執行狀態,計算數據庫大小等等方面的查詢。這些是所有 Oracle 開發者都必備的技能,所以快快收藏吧
    2014-04-04
  • oracle自動清理archivelog文件的具體方法

    oracle自動清理archivelog文件的具體方法

    這篇文章介紹了oracle自動清理archivelog文件的具體方法,有需要的朋友可以參考一下
    2013-09-09
  • ora-00119和ora-00132問題的解決方法

    ora-00119和ora-00132問題的解決方法

    這篇文章主要為大家詳細介紹了ora-00119和ora-00132問題的解決方法,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Oracle11g r2 卸載干凈重裝的詳細教程(親測有效已重裝過)

    Oracle11g r2 卸載干凈重裝的詳細教程(親測有效已重裝過)

    Oracle 的安裝和卸載相較于其他 mysql 要麻煩些,小編特此分享一篇教程關于Oracle11g 徹底卸載干凈并重新安裝,有需要的朋友可以參考下本文
    2021-06-06
  • 使用springboot暴露oracle數據接口的問題

    使用springboot暴露oracle數據接口的問題

    這篇文章主要介紹了使用springboot暴露oracle數據接口的問題,本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • oracle 11g的安裝注意事項總結

    oracle 11g的安裝注意事項總結

    這篇文章主要給大家介紹了關于oracle 11g的安裝注意事項,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03

最新評論

美丽人妻被按摩中出中文字幕