溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

解決Oracle數(shù)據(jù)庫(kù)出現(xiàn)問(wèn)題時(shí)的腳本有哪些

發(fā)布時(shí)間:2021-11-09 10:43:09 來(lái)源:億速云 閱讀:156 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫(kù)

本篇內(nèi)容主要講解“解決Oracle數(shù)據(jù)庫(kù)出現(xiàn)問(wèn)題時(shí)的腳本有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“解決Oracle數(shù)據(jù)庫(kù)出現(xiàn)問(wèn)題時(shí)的腳本有哪些”吧!

>>>>查看操作系統(tǒng)負(fù)載

登上數(shù)據(jù)庫(kù)服務(wù)器后,第一個(gè)就是通過(guò)系統(tǒng)命令確認(rèn)下CPU、內(nèi)存、I/O是否異常,每個(gè)系統(tǒng)的命令不一樣,常見(jiàn)的有top、topas、vmstat、iostat。

>>>>查看等待事件

第二步就是連到數(shù)據(jù)庫(kù)查看活動(dòng)的等待事件,這是監(jiān)控、巡檢、診斷數(shù)據(jù)庫(kù)最基本的手段,通常81%的問(wèn)題都可以通過(guò)等待事件初步定為原因,它是數(shù)據(jù)庫(kù)運(yùn)行情況最直接的體現(xiàn),如下腳本是查看每個(gè)等待事件的個(gè)數(shù)、等待時(shí)長(zhǎng),并排除了一些常見(jiàn)的IDLE等待事件。

--墨天輪 wait_event 
col event for a45  
SELECT  inst_id,EVENT, SUM(DECODE(WAIT_TIME, 0, 0, 1)) "Prev", SUM(DECODE(WAIT_TIME, 0, 1, 0)) "Curr", COUNT(*) "Tot" , sum(SECONDS_IN_WAIT) SECONDS_IN_WAIT 
FROM GV$SESSION_WAIT
WHERE event NOT 
IN ('smon timer','pmon timer','rdbms ipc message','SQL*Net message from client','gcs remote message')     
  AND event NOT LIKE '%idle%'     
  AND event NOT LIKE '%Idle%'     
  AND event NOT LIKE '%Streams AQ%' 
GROUP BY inst_id,EVENT 
ORDER BY 1,5 desc;

這里就需要掌握一些常見(jiàn)異常等待事件的原因,并形成條件反射,比如library cache lock、read by other session、row cache lock、buffer busy waits、latch:shared pool、gc buffer busy、cursor: pin S on X、direct path read、log file sync、enq: TX - index contention、PX Deq Credit: send blkd、latch free、enq: TX - row lock contention等等,如果異常等待事件的個(gè)數(shù)和等待時(shí)間很長(zhǎng),那么排查原因的入口就在這里。

>>>>根據(jù)等待事件查會(huì)話

得到異常等待事件之后,我們就根據(jù)等待事件去查會(huì)話詳情,也就是查看哪些會(huì)話執(zhí)行哪些SQL在等待,另外還查出來(lái)用戶名和機(jī)器名稱,以及是否被阻塞。另外如下腳本可改寫成根據(jù)用戶查會(huì)話、根據(jù)SQL_ID查會(huì)話等等。

--墨天輪 session_by_event 
SELECT /*+rule */ sid, s.serial#, spid, event, sql_id, seconds_in_wait ws, row_wait_obj# obj, s.username, s.machine,  
BLOCKING_INSTANCE||'.'||blocking_session b_sess FROM v$session s,  
v$process p WHERE event='&event_name' AND s.paddr = p.addr order by 6;

>>>>查詢某個(gè)會(huì)話詳情

得到會(huì)話列表之后,可以根據(jù)如下SQL查詢某個(gè)會(huì)話的詳細(xì)信息,如上次個(gè)執(zhí)行的SQL_ID,登錄時(shí)間等,該SQL也可改寫成多個(gè)。

--墨天輪 session_by_sid 
SELECT s.sid, s.serial#, spid, event, sql_id, PREV_SQL_ID,  
seconds_in_wait ws, row_wait_obj# obj, s.username, s.machine,  
module,blocking_session b_sess,logon_time  FROM v$session s, v$process p WHERE sid = '&sid' AND s.paddr = p.addr;

>>>>查詢對(duì)象信息

從前面兩個(gè)SQL都可以看到會(huì)話等待的對(duì)象ID,可以通過(guò)如下SQL查詢對(duì)象的詳細(xì)信息。

--墨天輪 obj_info 
col OBJECT_NAME for a30 
select owner,object_name,subobject_name,object_type from dba_objects where  
object_id=&oid;

>>>>查詢SQL語(yǔ)句

根據(jù)SQL_ID、HASH_VALUE查詢SQL語(yǔ)句。如果v$sqlarea中查不到,可以嘗試DBA_HIST_SQLTEXT視圖中查詢。

--墨天輪 sql_text 
select sql_id,SQL_fullTEXT from v$sqlarea where (sql_id='&sqlid' or  
hash_value=to_number('&hashvale') ) and rownum<2;

關(guān)于SQL語(yǔ)句的執(zhí)行計(jì)劃、對(duì)象的統(tǒng)計(jì)信息、性能診斷、跟蹤SQL等這里就不展開,后面計(jì)劃出一個(gè)類似的系列,敬請(qǐng)關(guān)注。

>>>>查詢會(huì)話阻塞情況

通過(guò)如下SQL查詢某個(gè)會(huì)話阻塞了多少個(gè)會(huì)話。

--墨天輪 blocking_sess 
select count(*),blocking_session from v$session where blocking_session  
is not null group by blocking_session;

>>>>查詢數(shù)據(jù)庫(kù)的鎖

通過(guò)如下SQL查詢某個(gè)會(huì)話的鎖,有哪些TM、TX鎖,以及會(huì)話和鎖關(guān)聯(lián)查詢的SQL,注意這里指定了ctime大于100秒,30%的情況是人為誤操作鎖表,導(dǎo)致應(yīng)用SQL被阻塞,無(wú)法運(yùn)行。

--墨天輪 lock 
set linesize 180 
col username for a15 
col owner for a15 
col OBJECT_NAME for a30 
col SPID for a10   
--查詢某個(gè)會(huì)話的鎖 
select /*+rule*/SESSION_ID,OBJECT_ID,ORACLE_USERNAME,OS_USER_NAME,PROCESS,
 LOCKED_MODE from gv$locked_object where session_id=&sid;  
 
--查詢TM、TX鎖 
select /*+rule*/* from v$lock where ctime >100 and type in ('TX','TM') order by 3,9;  
 
--查詢數(shù)據(jù)庫(kù)中的鎖 
select /*+rule*/s.sid,p.spid,l.type,round(max(l.ctime)/60,0)  
lock_min,s.sql_id,s.USERNAME,b.owner,b.object_type,b.object_name from  
v$session s, v$process p,v$lock l,v$locked_object o,dba_objects b  
where  o.SESSION_ID=s.sid and s.sid=l.sid and o.OBJECT_ID=b.OBJECT_ID  
and s.paddr = p.addr and l.ctime >100 and l.type in ('TX','TM','FB')  
group by  
s.sid,p.spid,l.type,s.sql_id,s.USERNAME,b.owner,b.object_type,b.object_name  
order by 9,1,3

>>>>保留現(xiàn)場(chǎng)證據(jù)

有的問(wèn)題可能需要分析很長(zhǎng)時(shí)間,或者是需要外部人員協(xié)助分析,那么保留現(xiàn)場(chǎng)證據(jù)就非常重要了,下面腳本是systemstate dump和hanganalyze步驟,如果有sqlplus無(wú)法登陸的情況,可以加-prelim參數(shù)。

--systemstate dump 
sqlplus -prelim / as sysdba 
oradebug setmypid 
oradebug unlimit; 
oradebug dump systemstate 266; 
--wait for 1 min 
oradebug dump systemstate 266; 
--wait for 1 min 
oradebug dump systemstate 266; 
oradebug tracefile_name;  
 --hanganalyze 
oradebug setmypid 
oradebug unlimit; 
oradebug dump hanganalyze 3
 --wait for 1 min 
oradebug dump hanganalyze 3 
--wait for 1 min 
oradebug dump hanganalyze 3 
oradebug tracefile_name

>>>>殺會(huì)話

通常情況下,初步定為問(wèn)題后為了快速恢復(fù)業(yè)務(wù),需要去殺掉某些會(huì)話,特別是批量殺會(huì)話,有時(shí)還會(huì)直接kill所有LOCAL=NO的進(jìn)程,再殺會(huì)話時(shí)一定要檢查確認(rèn),更不能在別的節(jié)點(diǎn)或者別的服務(wù)器上執(zhí)行。

-墨天輪 kill_sess 
set line 199  
col event format a35    
--殺某個(gè)SID會(huì)話 
SELECT /*+ rule */ sid, s.serial#, 'kill -9 '||spid, event, 
blocking_session b_sess FROM v$session s, v$process p WHERE sid='&sid' AND s.paddr = p.addr order by 1;   
--根據(jù)SQL_ID殺會(huì)話 
SELECT /*+ rule */ sid, s.serial#, 'kill -9 '||spid, event,  
blocking_session b_sess FROM v$session s, v$process p WHERE sql_id='&sql_id' AND s.paddr = p.addr order by 1;   
--根據(jù)等待事件殺會(huì)話 
SELECT /*+ rule */ sid, s.serial#, 'kill -9 '||spid, event,  
blocking_session b_sess FROM v$session s, v$process p WHERE event='&event' AND s.paddr = p.addr order by 1;   
--根據(jù)用戶殺會(huì)話 
SELECT /*+ rule */ sid, s.serial#, 'kill -9 '||spid, event,  
blocking_session b_sess FROM v$session s, v$process p WHERE username='&username' AND s.paddr = p.addr order by 1;   
--kill所有LOCAL=NO進(jìn)程 
ps -ef|grep LOCAL=NO|grep $ORACLE_SID|grep -v grep|awk '{print $2}' |xargs ki

>>>>重啟方法

tail -f alert_.log
alter system checkpoint;
alter system switch logfile;
shutdown immediate;
startu

如需要修改靜態(tài)參數(shù)、內(nèi)存等問(wèn)題,需要重啟數(shù)據(jù)庫(kù),(不要覺(jué)得重啟很LOW,在很多情況下為了快速恢復(fù)業(yè)務(wù)經(jīng)常使用這個(gè)從網(wǎng)吧里傳出來(lái)的絕招),記住千萬(wàn)不要在這個(gè)時(shí)候死磕問(wèn)題原因、當(dāng)作課題研究,我們的首要任務(wù)是恢復(fù)業(yè)務(wù)。

>>>>CRT按鈕小技巧

另外介紹一個(gè)小技巧,就是把常用的腳本整理到SecureCRT的Button Bar中,只需要點(diǎn)一下設(shè)置好的button,就相當(dāng)于直接執(zhí)行相應(yīng)的SQL語(yǔ)句,這樣就不用每次粘貼復(fù)制執(zhí)行,或者是把腳本上傳到每個(gè)服務(wù)器上。不過(guò)不要設(shè)置DDL等操作性的button,以免誤點(diǎn)。

解決Oracle數(shù)據(jù)庫(kù)出現(xiàn)問(wèn)題時(shí)的腳本有哪些

到此,相信大家對(duì)“解決Oracle數(shù)據(jù)庫(kù)出現(xiàn)問(wèn)題時(shí)的腳本有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI