網站首頁 編程語言 正文
一、問題描述
早上正在上班路上,群里客戶說,有一張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;
原文鏈接:https://juejin.cn/post/7029500376353079310
相關推薦
- 2022-12-08 重溫Python基礎之列表操作_python
- 2022-03-30 Android用動畫顯示或隱藏視圖_Android
- 2022-07-07 圖解AVL樹數據結構輸入與輸出及實現示例_C 語言
- 2022-10-04 python中numpy矩陣的零填充的示例代碼_python
- 2022-12-03 React為什么需要Scheduler調度器原理詳解_React
- 2022-06-18 android實現在圖標上顯示數字_Android
- 2022-10-21 解決Git?Revert?再次合代碼無效問題_相關技巧
- 2023-02-09 python如何尋找主串中所有指定子串下標_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支