Oracle Undo空間爆滿的急救指南
在Oracle數(shù)據(jù)庫(kù)運(yùn)維過(guò)程中,Undo空間爆滿是高頻且棘手的問(wèn)題——一旦發(fā)生,會(huì)直接導(dǎo)致事務(wù)無(wú)法提交、數(shù)據(jù)庫(kù)報(bào)錯(cuò)(如ORA-01555、ORA-30036)、業(yè)務(wù)卡頓甚至中斷,給運(yùn)維和業(yè)務(wù)帶來(lái)不小麻煩。很多DBA習(xí)慣用在線切換Undo表空間的方式解決,但其實(shí)不同場(chǎng)景下有更高效、更安全的方案。本文將從基礎(chǔ)認(rèn)知、問(wèn)題診斷、核心解決方案(含參考內(nèi)容優(yōu)化)、更優(yōu)替代方案、避坑指南及長(zhǎng)期預(yù)防,全方位搞定Undo空間爆滿問(wèn)題,新手也能直接上手實(shí)操。
一、先搞懂:Undo空間是什么?為什么會(huì)爆滿?
1. Undo空間核心作用
Undo空間(回滾表空間)是Oracle數(shù)據(jù)庫(kù)的核心組件,主要用于:① 事務(wù)回滾(執(zhí)行ROLLBACK時(shí),通過(guò)Undo數(shù)據(jù)恢復(fù)數(shù)據(jù)原貌);② 一致性讀(多用戶并發(fā)時(shí),讓查詢看到事務(wù)提交前的一致性數(shù)據(jù),避免臟讀);③ 閃回查詢(通過(guò)Undo數(shù)據(jù)恢復(fù)誤操作前的數(shù)據(jù))。
2. 爆滿的3大核心原因(高頻場(chǎng)景)
- 長(zhǎng)事務(wù)/未提交事務(wù):這是最常見(jiàn)原因!比如批量更新、全表刪除等操作未及時(shí)提交,會(huì)持續(xù)占用Undo空間,甚至導(dǎo)致空間被耗盡,尤其高并發(fā)場(chǎng)景下風(fēng)險(xiǎn)更高。
- Undo參數(shù)配置不合理:
UNDO_RETENTION(Undo數(shù)據(jù)保留時(shí)間)設(shè)置過(guò)長(zhǎng),導(dǎo)致過(guò)期Undo數(shù)據(jù)無(wú)法被回收;或Undo表空間初始配置過(guò)小、未開(kāi)啟自動(dòng)擴(kuò)展,無(wú)法滿足事務(wù)需求。 - 異常事務(wù)/業(yè)務(wù)邏輯問(wèn)題:比如循環(huán)中反復(fù)執(zhí)行DML操作卻不提交、超大范圍更新未拆分,或事務(wù)中混入耗時(shí)的非核心操作(如發(fā)消息、調(diào)接口),導(dǎo)致Undo數(shù)據(jù)持續(xù)累積。
3. 爆滿的典型報(bào)錯(cuò)(快速識(shí)別)
當(dāng)出現(xiàn)以下報(bào)錯(cuò)時(shí),基本可以判定為Undo空間爆滿或相關(guān)異常,需優(yōu)先排查Undo表空間:
- ORA-01555: snapshot too old(快照過(guò)舊,多因Undo數(shù)據(jù)被提前覆蓋或空間不足)
- ORA-30036: unable to extend segment in undo tablespace(無(wú)法擴(kuò)展Undo段,空間已耗盡)
- ORA-30013: undo tablespace 'XXX' is currently in use(刪除Undo表空間時(shí)常見(jiàn),提示表空間仍被占用)
二、基礎(chǔ)排查:先確認(rèn)Undo空間爆滿情況
在動(dòng)手解決前,需先通過(guò)SQL查詢,明確Undo表空間的使用率、占用會(huì)話、異常事務(wù),避免盲目操作。以下是3個(gè)核心排查SQL,直接復(fù)制執(zhí)行即可。
1. 查詢所有表空間使用情況(重點(diǎn)看Undo表空間)
SELECT tablespace_name,
round(used_space*
(SELECT value
FROM v$parameter
WHERE name='db_block_size')/power(2,30),2) USED_GB, -- 已使用空間(GB) round(tablespace_size*
(SELECT value
FROM v$parameter
WHERE name='db_block_size')/power(2,30)) MAXSIZE_GB, -- 最大可用空間(GB) round(used_percent,2) AS Usage -- 使用率(%)
FROM dba_tablespace_usage_metrics
ORDER BY Usage desc;【說(shuō)明】:執(zhí)行后,重點(diǎn)關(guān)注tablespace_name為UNDOTBS1(默認(rèn)Undo表空間)的Usage字段,若使用率超過(guò)90%,需及時(shí)處理;若達(dá)到100%,則已完全爆滿。

2. 排查占用Undo空間的未提交事務(wù)
-- 方法1:查詢關(guān)聯(lián)Undo表空間的未釋放會(huì)話SELECT s.sid,
s.serial#,
s.username,
s.program,
s.machine,
t.start_time,
t.status,
t.xidusn
FROM v$session s, v$transaction t
WHERE s.saddr = t.ses_addr
AND t.xidusn IN
(SELECT segment_id
FROM dba_rollback_segs
WHERE tablespace_name = 'UNDOTBS1'); -- 替換為爆滿的Undo表空間名 -- 方法2:查詢超過(guò)1小時(shí)未釋放的活躍事務(wù)(精準(zhǔn)定位長(zhǎng)事務(wù))SELECT s.sid,
s.serial#,
s.username,
s.sql_id,
q.sql_text,
s.last_call_et/3600 AS hours_in_exec
FROM v$session s, v$sql q
WHERE s.sql_id = q.sql_id
AND s.status = 'ACTIVE'
AND s.last_call_et > 3600; -- 單位:秒,3600即1小時(shí)【說(shuō)明】:通過(guò)上述SQL,可找到占用Undo空間的會(huì)話ID(sid)、序列號(hào)(serial#)、操作的SQL語(yǔ)句,判斷是否為長(zhǎng)事務(wù)或異常事務(wù),為后續(xù)處理提供依據(jù)。
3. 查看Undo回滾段狀態(tài)
SELECT *
FROM dba_rollback_segs t
WHERE t.STATUS='ONLINE'
AND t.tablespace_name='UNDOTBS1'; -- 替換為目標(biāo)Undo表空間名【說(shuō)明】:若查詢結(jié)果為空,說(shuō)明該Undo表空間已無(wú)在線回滾段,可安全處理;若有結(jié)果,說(shuō)明仍有事務(wù)占用,需先釋放。
三、核心方案:在線切換Undo表空間(參考內(nèi)容優(yōu)化版)
在線切換Undo表空間是最常用、最安全的解決方案(無(wú)需停機(jī),不影響業(yè)務(wù)正常運(yùn)行),適用于Undo表空間已爆滿、無(wú)法快速釋放空間的場(chǎng)景。以下是優(yōu)化后的完整步驟,補(bǔ)充了注意事項(xiàng)和異常處理,比參考內(nèi)容更具實(shí)操性。
步驟1:創(chuàng)建新的Undo表空間
create undo tablespace UNDOTBS2
ON NEXT 100M -- 數(shù)據(jù)文件路徑,需確保路徑存在且有寫(xiě)入權(quán)限 SIZE 1024M
-- 初始大小(1GB),可根據(jù)實(shí)際需求調(diào)整 AUTOEXTEND
-- 新Undo表空間名,建議遵循UNDOTBS+數(shù)字的命名規(guī)范 datafile '/data/oracle/oradata/orcl/undotbs2.dbf'
-- 自動(dòng)擴(kuò)展,每次擴(kuò)展100M MAXSIZE UNLIMITED; -- 最大大小無(wú)限制,避免再次爆滿【注意】:數(shù)據(jù)文件路徑需根據(jù)自身Oracle環(huán)境調(diào)整(可通過(guò)select name from v$datafile;查詢現(xiàn)有數(shù)據(jù)文件路徑),避免路徑錯(cuò)誤導(dǎo)致創(chuàng)建失敗。
步驟2:切換Undo表空間(核心操作)
ALTER SYSTEM set undo_tablespace=UNDOTBS2 scope=both;
【說(shuō)明】:scope=both表示修改同時(shí)生效于內(nèi)存和參數(shù)文件,無(wú)需重啟數(shù)據(jù)庫(kù);若僅寫(xiě)scope=memory,數(shù)據(jù)庫(kù)重啟后會(huì)恢復(fù)為原Undo表空間。
步驟3:驗(yàn)證切換是否成功
-- 方法1:查看當(dāng)前Undo表空間配置 show parameter undo; -- 方法2:查看新Undo表空間的回滾段狀態(tài)(應(yīng)顯示多個(gè)ONLINE狀態(tài)) select * from dba_rollback_segs t where t.STATUS='ONLINE' and t.tablespace_name='UNDOTBS2';
【驗(yàn)證標(biāo)準(zhǔn)】:方法1執(zhí)行后,undo_tablespace的值應(yīng)為UNDOTBS2;方法2執(zhí)行后,應(yīng)顯示多個(gè)狀態(tài)為ONLINE的回滾段,說(shuō)明切換成功。

步驟4:釋放舊Undo表空間(UNDOTBS1)
切換成功后,舊Undo表空間(UNDOTBS1)仍占用磁盤(pán)空間,需手動(dòng)釋放,核心是先確保無(wú)事務(wù)占用,再刪除表空間。
-- 1. 再次確認(rèn)舊Undo表空間無(wú)在線回滾段(關(guān)鍵步驟,避免刪除失?。㏒ELECT *
FROM dba_rollback_segs t
WHERE t.STATUS='ONLINE'
AND t.tablespace_name='UNDOTBS1'; -- 2. 若仍有未釋放的回滾段,手動(dòng)離線(替換為實(shí)際回滾段名) ALTER ROLLBACK SEGMENT "_SYSSMU3_1723003836$" OFFLINE; ALTER ROLLBACK SEGMENT "_SYSSMU4_1254879796$" OFFLINE; -- 3. 確認(rèn)無(wú)事務(wù)占用舊Undo表空間(無(wú)結(jié)果即為無(wú)占用)SELECT s.sid,
s.serial#,
s.username
FROM v$session s, v$transaction t
WHERE s.saddr = t.ses_addr
AND t.xidusn IN
(SELECT segment_id
FROM dba_rollback_segs
WHERE tablespace_name = 'UNDOTBS1'); -- 4. 刪除舊Undo表空間(徹底釋放磁盤(pán)空間) drop tablespace UNDOTBS1 including contents
AND datafiles;【警告】:刪除表空間前,務(wù)必確認(rèn)無(wú)事務(wù)占用,否則會(huì)報(bào)ORA-30013錯(cuò)誤;若報(bào)錯(cuò),可參考本文“避坑指南”中的解決方案處理。
步驟5:可選(優(yōu)化新Undo表空間配置)
-- 調(diào)整Undo數(shù)據(jù)保留時(shí)間(根據(jù)業(yè)務(wù)需求,默認(rèn)900秒,可適當(dāng)縮短減少空間占用) -- 查看調(diào)整后的保留時(shí)間 show parameter undo_retention; ALTER SYSTEM SET UNDO_RETENTION=900 SCOPE=BOTH;
四、更優(yōu)解決方案(分場(chǎng)景選擇,比切換更高效)
在線切換Undo表空間雖安全,但并非所有場(chǎng)景都最優(yōu)。以下3種方案,根據(jù)實(shí)際場(chǎng)景選擇,可快速解決問(wèn)題,減少操作成本。
方案1:緊急擴(kuò)容(適用于臨時(shí)爆滿,無(wú)需切換表空間)
若Undo空間只是臨時(shí)爆滿,且無(wú)長(zhǎng)時(shí)間未提交事務(wù),可直接擴(kuò)容Undo表空間,比切換更快捷,適合業(yè)務(wù)高峰期緊急處理。
-- 方法1:新增數(shù)據(jù)文件擴(kuò)容(推薦,不影響現(xiàn)有數(shù)據(jù))
ALTER TABLESPACE UNDOTBS1 ADD DATAFILE '/data/oracle/oradata/orcl/undotbs1_02.dbf' SIZE 1024M AUTOEXTEND
ON NEXT 100M MAXSIZE UNLIMITED;
-- 方法2:擴(kuò)大現(xiàn)有數(shù)據(jù)文件大小(若數(shù)據(jù)文件未達(dá)最大限制)
ALTER DATABASE DATAFILE '/data/oracle/oradata/orcl/undotbs1.dbf' RESIZE 2048M; -- 擴(kuò)大到2GB【優(yōu)勢(shì)】:操作簡(jiǎn)單、耗時(shí)短,無(wú)需切換表空間,適合緊急緩解空間壓力;【適用場(chǎng)景】:臨時(shí)突發(fā)爆滿、Undo表空間配置過(guò)小、無(wú)長(zhǎng)事務(wù)占用。
方案2:終止長(zhǎng)事務(wù)/異常事務(wù)(適用于長(zhǎng)事務(wù)導(dǎo)致的爆滿)
若排查發(fā)現(xiàn),Undo空間爆滿是由少數(shù)長(zhǎng)事務(wù)(如持續(xù)幾小時(shí)的批量操作)導(dǎo)致,可直接終止事務(wù),快速釋放空間,無(wú)需擴(kuò)容或切換。
-- 1. 先查詢長(zhǎng)事務(wù)對(duì)應(yīng)的sid和serial#(參考前文排查SQL)SELECT s.sid,
s.serial#,
s.username,
q.sql_text,
s.last_call_et/3600 AS hours_in_exec
FROM v$session s, v$sql q
WHERE s.sql_id = q.sql_id
AND s.status = 'ACTIVE'
AND s.last_call_et > 3600; -- 2. 終止事務(wù)(替換為查詢到的sid和serial#,需謹(jǐn)慎操作) alter system kill session '24,111'; -- 格式:'sid,serial#'【注意事項(xiàng)】:① 終止會(huì)話前,需確認(rèn)該事務(wù)并非核心業(yè)務(wù)事務(wù)(如訂單支付、數(shù)據(jù)同步),避免導(dǎo)致業(yè)務(wù)數(shù)據(jù)不一致;② 終止后,事務(wù)會(huì)自動(dòng)回滾,回滾時(shí)間取決于事務(wù)大小,回滾期間不要強(qiáng)制重啟數(shù)據(jù)庫(kù);③ 執(zhí)行kill操作需具備ALTER SYSTEM權(quán)限或DBA角色。
【優(yōu)勢(shì)】:從根源釋放空間,無(wú)需額外占用磁盤(pán),操作成本最低;【適用場(chǎng)景】:長(zhǎng)事務(wù)、異常未提交事務(wù)導(dǎo)致的爆滿,且事務(wù)可終止。
方案3:優(yōu)化業(yè)務(wù)邏輯(長(zhǎng)期根治,避免重復(fù)爆滿)
若Undo空間頻繁爆滿,說(shuō)明核心問(wèn)題在業(yè)務(wù)邏輯,需從源頭優(yōu)化,徹底解決問(wèn)題,這是最推薦的長(zhǎng)期方案。
- 拆分長(zhǎng)事務(wù):將超大批量操作(如全表更新、刪除)拆分為小事務(wù),每處理1000-5000行就執(zhí)行一次COMMIT,減少Undo數(shù)據(jù)累積。
- 優(yōu)化SQL操作:用
BULK COLLECT + FORALL替代逐行FETCH+UPDATE,減少上下文切換和Undo生成頻次;報(bào)表導(dǎo)出等非核心操作,改用臨時(shí)表(CREATE GLOBAL TEMPORARY TABLE),避免占用Undo空間。 - 異步化非核心操作:將事務(wù)中的發(fā)消息、寫(xiě)日志、調(diào)用外部接口等非核心動(dòng)作,移出主事務(wù),用DBMS_SCHEDULER或隊(duì)列表后續(xù)處理,縮短事務(wù)周期。
- 合理設(shè)置
UNDO_RETENTION:根據(jù)業(yè)務(wù)需求調(diào)整保留時(shí)間,參考V$UNDOSTAT中的MAXQUERYLEN(最長(zhǎng)查詢時(shí)間),避免設(shè)置過(guò)長(zhǎng)導(dǎo)致Undo數(shù)據(jù)無(wú)法回收。
五、避坑指南(實(shí)操必看,避免踩雷)
坑1:kill會(huì)話后,Undo空間仍未釋放
【原因】:kill會(huì)話后,事務(wù)會(huì)進(jìn)入回滾狀態(tài),回滾完成后空間才會(huì)釋放;若事務(wù)過(guò)大,回滾可能需要幾分鐘甚至幾小時(shí)。
【解決】:耐心等待回滾完成,可通過(guò)select * from v$transaction;查看回滾進(jìn)度;若長(zhǎng)時(shí)間未完成,可重啟數(shù)據(jù)庫(kù)(非緊急不推薦,會(huì)中斷所有業(yè)務(wù))。
坑2:刪除舊Undo表空間時(shí)報(bào)錯(cuò)(ORA-30013)
【原因】:舊Undo表空間仍有回滾段處于ONLINE狀態(tài),或有事務(wù)正在使用該表空間。
【解決】:① 先執(zhí)行select SEGMENT_NAME,TABLESPACE_NAME,STATUS from dba_rollback_segs where tablespace_name='UNDOTBS1';,找到所有ONLINE狀態(tài)的回滾段;② 手動(dòng)將其離線(ALTER ROLLBACK SEGMENT "回滾段名" OFFLINE;);③ 若仍報(bào)錯(cuò),可修改pfile文件,添加隱含參數(shù)后重啟數(shù)據(jù)庫(kù),再刪除表空間(具體步驟參考)。
坑3:切換Undo表空間后,數(shù)據(jù)庫(kù)重啟又恢復(fù)原狀
【原因】:切換時(shí)未指定scope=both,僅修改了內(nèi)存中的配置,未同步到參數(shù)文件(spfile)。
【解決】:重新執(zhí)行ALTER SYSTEM set undo_tablespace=UNDOTBS2 scope=both;,確保參數(shù)同步到內(nèi)存和參數(shù)文件;若仍有問(wèn)題,可手動(dòng)修改spfile文件。
坑4:盲目調(diào)整UNDO_RETENTION參數(shù),導(dǎo)致閃回查詢失敗
【原因】:將UNDO_RETENTION設(shè)置過(guò)短,導(dǎo)致Undo數(shù)據(jù)被提前覆蓋,影響閃回查詢、數(shù)據(jù)恢復(fù)功能。
【解決】:調(diào)整前先查詢SELECT MAX(MAXQUERYLEN) FROM V$UNDOSTAT;,將UNDO_RETENTION設(shè)置為不小于最長(zhǎng)查詢時(shí)間的值,兼顧空間釋放和業(yè)務(wù)需求。
六、RAC環(huán)境專屬解決方案(補(bǔ)充)
RAC(Real Application Clusters)環(huán)境與單實(shí)例Oracle的核心區(qū)別的是:每個(gè)節(jié)點(diǎn)有獨(dú)立的Undo表空間(默認(rèn)配置),節(jié)點(diǎn)間Undo資源相互獨(dú)立,無(wú)法跨節(jié)點(diǎn)共享。因此RAC環(huán)境Undo爆滿多為“單節(jié)點(diǎn)爆滿”,少數(shù)情況下多節(jié)點(diǎn)同時(shí)爆滿,處理需兼顧節(jié)點(diǎn)獨(dú)立性和集群一致性,避免影響集群正常運(yùn)行。
1. RAC環(huán)境Undo爆滿核心特點(diǎn)(與單實(shí)例區(qū)別)
- 每個(gè)RAC節(jié)點(diǎn)對(duì)應(yīng)專屬Undo表空間(如節(jié)點(diǎn)1對(duì)應(yīng)UNDOTBS1,節(jié)點(diǎn)2對(duì)應(yīng)UNDOTBS2),單個(gè)節(jié)點(diǎn)Undo爆滿不影響其他節(jié)點(diǎn),但會(huì)導(dǎo)致該節(jié)點(diǎn)上的事務(wù)無(wú)法執(zhí)行。
- 集群層面無(wú)統(tǒng)一Undo管理,需針對(duì)每個(gè)節(jié)點(diǎn)單獨(dú)排查、處理,不可跨節(jié)點(diǎn)操作其他節(jié)點(diǎn)的Undo表空間。
- 常見(jiàn)額外原因:節(jié)點(diǎn)負(fù)載不均衡(某節(jié)點(diǎn)承擔(dān)大量批量事務(wù))、集群服務(wù)異常導(dǎo)致Undo回滾段無(wú)法正常回收、跨節(jié)點(diǎn)事務(wù)未及時(shí)提交(雖不共享Undo,但會(huì)導(dǎo)致對(duì)應(yīng)節(jié)點(diǎn)Undo持續(xù)占用)。
2. RAC環(huán)境專屬排查步驟(精準(zhǔn)定位爆滿節(jié)點(diǎn))
先定位哪個(gè)節(jié)點(diǎn)的Undo表空間爆滿,再針對(duì)性處理,核心排查SQL如下(可在任意節(jié)點(diǎn)執(zhí)行,查看所有節(jié)點(diǎn)狀態(tài)):
-- 1. 查看所有節(jié)點(diǎn)的Undo表空間使用情況(關(guān)鍵:區(qū)分節(jié)點(diǎn))SELECT inst_id,
-- 節(jié)點(diǎn)ID(RAC核心標(biāo)識(shí)) tablespace_name,
round(used_space*
(SELECT value
FROM v$parameter
WHERE name='db_block_size')/power(2,30),2) USED_GB, round(tablespace_size*
(SELECT value
FROM v$parameter
WHERE name='db_block_size')/power(2,30)) MAXSIZE_GB, round(used_percent,2) AS Usage
FROM gv$tablespace_usage_metrics -- gv$視圖:查詢所有RAC節(jié)點(diǎn)信息
WHERE tablespace_name LIKE 'UNDOTBS%' -- 過(guò)濾Undo表空間
ORDER BY inst_id,
Usage desc; -- 2. 排查指定節(jié)點(diǎn)(如節(jié)點(diǎn)1)占用Undo的未提交事務(wù)SELECT s.inst_id,
s.sid,
s.serial#,
s.username,
s.program,
t.start_time,
t.status
FROM gv$session s, gv$transaction t
WHERE s.saddr = t.ses_addr
AND s.inst_id = 1 -- 替換為爆滿的節(jié)點(diǎn)ID
AND t.xidusn IN
(SELECT segment_id
FROM dba_rollback_segs
WHERE tablespace_name = 'UNDOTBS1'); -- 對(duì)應(yīng)節(jié)點(diǎn)的Undo表空間 -- 3. 查看各節(jié)點(diǎn)Undo回滾段狀態(tài)SELECT inst_id,
segment_name,
tablespace_name,
status
FROM gv$rollback_segs
WHERE tablespace_name LIKE 'UNDOTBS%';【說(shuō)明】:通過(guò)上述SQL,可快速定位“哪個(gè)節(jié)點(diǎn)、哪個(gè)Undo表空間、哪個(gè)事務(wù)”導(dǎo)致的爆滿,為后續(xù)處理提供精準(zhǔn)依據(jù)。
3. RAC環(huán)境分場(chǎng)景解決方案(實(shí)操可直接復(fù)制)
場(chǎng)景1:?jiǎn)喂?jié)點(diǎn)Undo爆滿(最常見(jiàn))
處理原則:僅操作爆滿節(jié)點(diǎn)的Undo表空間,不影響其他節(jié)點(diǎn),步驟與單實(shí)例類似,但需指定節(jié)點(diǎn)操作。
CREATE UNDO TABLESPACE UNDOTBS1_NEW DATAFILE '/data/oracle/oradata/rac/undotbs1_new.dbf' SIZE 2048M AUTOEXTEND
ON NEXT 200M MAXSIZE UNLIMITED; -- 1. 切換到爆滿節(jié)點(diǎn)(如節(jié)點(diǎn)1),創(chuàng)建新Undo表空間(僅在該節(jié)點(diǎn)生效)-- 路徑需對(duì)應(yīng)節(jié)點(diǎn)1的數(shù)據(jù)文件路徑
-- 2. 切換該節(jié)點(diǎn)的Undo表空間(僅影響當(dāng)前節(jié)點(diǎn)) ALTER SYSTEM SET undo_tablespace=UNDOTBS1_NEW SCOPE=BOTH;后續(xù)驗(yàn)證切換、釋放舊Undo表空間的步驟,與單實(shí)例一致(參考第三章),但需確保所有操作均在爆滿節(jié)點(diǎn)執(zhí)行,不可跨節(jié)點(diǎn)刪除其他節(jié)點(diǎn)的Undo表空間。
場(chǎng)景2:多節(jié)點(diǎn)同時(shí)Undo爆滿
處理原則:逐個(gè)節(jié)點(diǎn)處理,優(yōu)先處理核心業(yè)務(wù)所在節(jié)點(diǎn),避免同時(shí)操作多個(gè)節(jié)點(diǎn)導(dǎo)致集群不穩(wěn)定。
- 步驟1:通過(guò)排查SQL,分別記錄每個(gè)爆滿節(jié)點(diǎn)的Undo表空間名稱(如節(jié)點(diǎn)1:UNDOTBS1,節(jié)點(diǎn)2:UNDOTBS2)。
- 步驟2:逐個(gè)節(jié)點(diǎn)執(zhí)行“創(chuàng)建新Undo表空間→切換→釋放舊表空間”操作(參考場(chǎng)景1),不可批量執(zhí)行跨節(jié)點(diǎn)操作。
- 步驟3:處理完成后,檢查集群狀態(tài)(
crsctl status cluster),確保所有節(jié)點(diǎn)Undo表空間切換成功,無(wú)異常報(bào)錯(cuò)。
場(chǎng)景3:跨節(jié)點(diǎn)事務(wù)導(dǎo)致的Undo持續(xù)占用
若排查發(fā)現(xiàn),某節(jié)點(diǎn)Undo爆滿是由跨節(jié)點(diǎn)事務(wù)(如節(jié)點(diǎn)1發(fā)起、節(jié)點(diǎn)2執(zhí)行的批量操作)導(dǎo)致,需先終止跨節(jié)點(diǎn)事務(wù),再釋放空間。
-- 1. 查詢跨節(jié)點(diǎn)事務(wù)對(duì)應(yīng)的節(jié)點(diǎn)、sid、serial#
SELECT s.inst_id, s.sid, s.serial#, s.username, q.sql_text
FROM gv$session s, gv$sql q
WHERE s.sql_id = q.sql_id AND s.status = 'ACTIVE'
AND s.last_call_et > 3600 -- 超過(guò)1小時(shí)的長(zhǎng)事務(wù) AND s.program LIKE '%oracle@%'; -- 跨節(jié)點(diǎn)事務(wù)特征 -- 2. 終止跨節(jié)點(diǎn)事務(wù)(需在事務(wù)所在節(jié)點(diǎn)執(zhí)行,替換對(duì)應(yīng)inst_id、sid、serial#)
ALTER SYSTEM KILL SESSION '100,200,1'; -- 格式:'sid,serial#,inst_id'4. RAC環(huán)境專屬避坑點(diǎn)
- 坑5:跨節(jié)點(diǎn)刪除Undo表空間(RAC特有):誤在節(jié)點(diǎn)1刪除節(jié)點(diǎn)2的Undo表空間,會(huì)導(dǎo)致節(jié)點(diǎn)2崩潰,需嚴(yán)格區(qū)分節(jié)點(diǎn)ID和Undo表空間的對(duì)應(yīng)關(guān)系。
- 坑6:切換Undo表空間未指定節(jié)點(diǎn):在RAC環(huán)境執(zhí)行
ALTER SYSTEM set undo_tablespace時(shí),若未指定節(jié)點(diǎn),僅會(huì)修改當(dāng)前執(zhí)行節(jié)點(diǎn)的配置,其他節(jié)點(diǎn)不受影響,需逐個(gè)節(jié)點(diǎn)切換或使用集群命令同步。 - 坑7:忽略集群服務(wù)狀態(tài):處理Undo爆滿前,需先檢查集群服務(wù)(
crsctl status resource -t),若集群服務(wù)異常,需先恢復(fù)集群,再處理Undo問(wèn)題,避免操作失敗。
七、長(zhǎng)期預(yù)防:避免Undo空間爆滿再次發(fā)生
解決問(wèn)題不如預(yù)防問(wèn)題,做好以下3點(diǎn),可大幅降低Undo空間爆滿的概率,減少運(yùn)維成本。
- 定期監(jiān)控Undo空間:創(chuàng)建定時(shí)任務(wù),每周查詢Undo表空間使用率,當(dāng)使用率超過(guò)80%時(shí),及時(shí)預(yù)警,提前處理(如擴(kuò)容、優(yōu)化事務(wù))。
- 合理配置Undo表空間:新建數(shù)據(jù)庫(kù)時(shí),根據(jù)業(yè)務(wù)量配置足夠大的Undo表空間(建議初始大小不小于2GB),開(kāi)啟自動(dòng)擴(kuò)展,避免初始配置過(guò)小。
- 定期優(yōu)化業(yè)務(wù)和SQL:排查系統(tǒng)中的長(zhǎng)事務(wù)、慢SQL,優(yōu)化業(yè)務(wù)邏輯,避免批量操作未拆分、事務(wù)未及時(shí)提交等問(wèn)題,從根源減少Undo空間占用。
【RAC環(huán)境額外預(yù)防】:① 均衡節(jié)點(diǎn)負(fù)載,避免單個(gè)節(jié)點(diǎn)承擔(dān)過(guò)多批量事務(wù);② 定期檢查各節(jié)點(diǎn)Undo表空間配置,確保所有節(jié)點(diǎn)Undo初始大小、自動(dòng)擴(kuò)展參數(shù)一致;③ 監(jiān)控跨節(jié)點(diǎn)長(zhǎng)事務(wù),建立預(yù)警機(jī)制(如超過(guò)30分鐘未提交則預(yù)警)。
八、總結(jié)
Oracle Undo空間爆滿的核心解決思路是:先排查(確認(rèn)爆滿原因、占用事務(wù)),再處理(根據(jù)場(chǎng)景選擇切換、擴(kuò)容、終止事務(wù)),最后預(yù)防(優(yōu)化配置、業(yè)務(wù)邏輯)。
在線切換Undo表空間是通用且安全的方案,適合大多數(shù)場(chǎng)景;緊急擴(kuò)容適合臨時(shí)爆滿;終止長(zhǎng)事務(wù)適合針對(duì)性解決;優(yōu)化業(yè)務(wù)邏輯是長(zhǎng)期根治的關(guān)鍵。實(shí)操時(shí),務(wù)必注意備份數(shù)據(jù)、確認(rèn)事務(wù)安全性,避免因操作失誤導(dǎo)致業(yè)務(wù)中斷。
RAC環(huán)境需重點(diǎn)關(guān)注“節(jié)點(diǎn)獨(dú)立性”,排查和處理均需區(qū)分節(jié)點(diǎn),避免跨節(jié)點(diǎn)誤操作;多節(jié)點(diǎn)爆滿需逐個(gè)處理,兼顧集群穩(wěn)定性。
以上就是Oracle Undo空間爆滿的急救指南的詳細(xì)內(nèi)容,更多關(guān)于Oracle Undo空間爆滿的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
oracle中的substr()函數(shù)用法實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于oracle中substr()函數(shù)用法的相關(guān)資料,substr函數(shù)是用于字符串的截取的函數(shù),只適用于string類型,并不適用于字符數(shù)組,需要的朋友可以參考下2023-11-11
Oracle中直方圖對(duì)執(zhí)行計(jì)劃的影響詳解
這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)中直方圖對(duì)執(zhí)行計(jì)劃的影響的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
Oracle 11g安裝錯(cuò)誤提示未找到wfmlrsvcapp.ear的解決方法
這篇文章主要為大家詳細(xì)介紹了Oracle 11g安裝錯(cuò)誤提示未找到wfmlrsvcapp.ear的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Oracle 11g實(shí)現(xiàn)安全加固的完整步驟
這篇文章主要給大家介紹了關(guān)于Oracle 11g實(shí)現(xiàn)安全加固的完整步驟,文中通過(guò)示例代碼將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Oracle 11g具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
PLSQLDeveloper登錄遠(yuǎn)程連接Oracle的操作
這篇文章主要介紹了PLSQLDeveloper登錄遠(yuǎn)程連接Oracle的操作方法,通過(guò)圖文并茂給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Oracle 12CR2查詢轉(zhuǎn)換教程之臨時(shí)表轉(zhuǎn)換詳解
這篇文章主要給大家介紹了關(guān)于Oracle 12CR2查詢轉(zhuǎn)換教程之臨時(shí)表轉(zhuǎn)換的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11

