是不是oralce應(yīng)當(dāng)有alert日志,里面有記錄不?一般報(bào)錯(cuò)的有可能會(huì)有事件日志的??纯词欠裼杏涗洈?shù)據(jù)的file id#,block#等信息?
10年積累的網(wǎng)站建設(shè)、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有陸港免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
AWR( Automatic Workload Repository )報(bào)告是對(duì)oracle的性能評(píng)定以及發(fā)現(xiàn)問(wèn)題SQL語(yǔ)句的重要手段。 AWR報(bào)告的原理是基于oracle數(shù)據(jù)庫(kù)的定時(shí)鏡像功能。默認(rèn)情況下,Oracle數(shù)據(jù)庫(kù)后臺(tái)進(jìn)程會(huì)以一定間隔(一小時(shí))收集系統(tǒng)當(dāng)前狀態(tài)鏡像
這時(shí)候需要找出造成異常阻塞的session并清除。
oracle session通常具有三個(gè)特征:
(1)一個(gè)session可能阻塞多個(gè)session;
(2)一個(gè)session最多被一個(gè)session阻塞;
(3)session阻塞關(guān)系不會(huì)形成環(huán)路。(環(huán)路即死鎖,oracle能自動(dòng)解除)
因此session的阻塞關(guān)系為一棵樹(shù),進(jìn)而DB系統(tǒng)所有session的BLOCK阻塞關(guān)系是一個(gè)由若干session阻塞關(guān)系樹(shù)構(gòu)成的森林,而異常session一定會(huì)在故障爆發(fā)時(shí)成為根(root)。因此,找尋異常鎖表session的過(guò)程就是找出異常的root。
一般認(rèn)為異常root有兩個(gè)特征:(1)block樹(shù)的規(guī)模過(guò)大,阻塞樹(shù)規(guī)模即被root層層阻塞的session總數(shù);(2)阻塞的平均等待時(shí)間過(guò)長(zhǎng)。
查找異常session的方法一:
OEM— performance— Blocking Sessions
查找異常session的方法二:
select r.root_sid, s.serial#,
r.blocked_num, r.avg_wait_seconds,
s.username,s.status,s.event,s.MACHINE,
s.PROGRAM,s.sql_id,s.prev_sql_id
from (select root_sid, avg(seconds_in_wait) as avg_wait_seconds,
count(*) - 1 as blocked_num
from (select CONNECT_BY_ROOT sid as root_sid, seconds_in_wait
from v$session
start with blocking_session is null
connect by prior sid = blocking_session)
group by root_sid
having count(*) 1) r,
v$session s
where r.root_sid = s.sid
order by r.blocked_num desc, r.avg_wait_seconds desc;
該SQL語(yǔ)句即是根據(jù)v$session的字段blocking_session統(tǒng)計(jì)阻塞樹(shù)根阻塞session的計(jì)數(shù)以及平均阻塞時(shí)間、并進(jìn)行排序,排名最前的往往是異常session。
解決Oracle測(cè)試數(shù)據(jù)庫(kù)中的ORA-1555錯(cuò)誤:
現(xiàn)象:
應(yīng)用的夜維從夜里00:00開(kāi)始執(zhí)行,但因?yàn)閔ang的原因(暫時(shí)猜測(cè)為夜維處理的某條數(shù)據(jù)和當(dāng)前應(yīng)用正常處理的某條數(shù)據(jù)相同,出現(xiàn)前后等待同一資源鎖的現(xiàn)象),直到第二天白天09:25左右才繼續(xù)執(zhí)行,但此時(shí)應(yīng)用日志記錄:
snapshot too old: rollback segment number 29 with name "_SYSSMU29$" too small
原因分析:
因hang導(dǎo)致夜維的DELETE語(yǔ)句一直處于等待狀態(tài)(超過(guò)一天),直到資源鎖釋放,但此時(shí)由于開(kāi)始存放于UNDO中的前鏡像超過(guò)UNDO_RETENTION參數(shù)設(shè)置的時(shí)間,且這是高并發(fā)的一個(gè)系統(tǒng),很快可能就會(huì)被應(yīng)用session覆蓋UNDO中的記錄,導(dǎo)致無(wú)法找到UNDO中的記錄產(chǎn)生一致性讀,因此報(bào)錯(cuò)ORA-1555,此次執(zhí)行失敗。
引申:
不過(guò)從這個(gè)報(bào)錯(cuò)現(xiàn)象可以接觸到ORA-1555這個(gè)經(jīng)典的錯(cuò)誤號(hào),尤其是在生產(chǎn)中,也是一種不多見(jiàn)的情況,尤其在現(xiàn)在UNDO基本都是用Oracle自動(dòng)管理方式,且磁盤空間分配都比較大的情況下。
這個(gè)ORA-1555的錯(cuò)誤是Oracle回滾段錯(cuò)誤中的一種經(jīng)典。UNDO用于記錄DML操作數(shù)據(jù)的前鏡像,ORA-1555的錯(cuò)誤簡(jiǎn)單用一句話總結(jié),我覺(jué)得就是當(dāng)DML語(yǔ)句需要用UNDO記錄的數(shù)據(jù)找到前鏡像時(shí),該記錄已經(jīng)被覆蓋,導(dǎo)致無(wú)法利用UNDO中的記錄完成一致性讀。當(dāng)然Oracle也有UNDO_RETENTION等參數(shù)避免這種情況的產(chǎn)生,但仍舊可能發(fā)生,原因有多種,解決方法也有多種,下面就簡(jiǎn)單說(shuō)明介紹下。
從原因來(lái)講,ORA-1555的錯(cuò)誤原因歸為兩種,一是一致性讀,一個(gè)是延遲塊(鎖)清除。
連接數(shù)據(jù)庫(kù)服務(wù)器
(1)???啟動(dòng)服務(wù)器端監(jiān)聽(tīng)器與數(shù)據(jù)庫(kù)服務(wù)
Linux/Unix下,啟動(dòng)監(jiān)聽(tīng)器:
$ lsnrctl start
關(guān)閉監(jiān)聽(tīng)器:
$ lsnrctl stop
查看監(jiān)聽(tīng)狀態(tài):
$ lsnrctl status
啟動(dòng)數(shù)據(jù)庫(kù):
$ sqlplus /nolog
SQLconn sys@myoracle as sysdba?? --這里的myoracle是前面配置的客戶端本地服務(wù)名
或
SQLconn / as sysdba
SQLstartup
Windows下,啟動(dòng)監(jiān)聽(tīng)器:
C:lsnrctl start
啟動(dòng)Oracle實(shí)例服務(wù):
C:oradim ?a href="" class="none" title="cs" rel="external"cstartup –sid myoracle
關(guān)閉Oracle實(shí)例服務(wù):
C:oradim –shutdown –sid myoracle
以上服務(wù)必須同時(shí)啟動(dòng),客戶端才能連接數(shù)據(jù)庫(kù)。由于默認(rèn)配置的監(jiān)聽(tīng)器名稱是Listener,上述命令可以正常啟動(dòng)監(jiān)聽(tīng)器,如果監(jiān)聽(tīng)器名稱是其它名稱,如aListener,則需要用下列方式才能啟動(dòng):
Linux/Unix下:
$ lsnrctl start aListener
Windows下:
C:lsnrctl start aListener
(2)???測(cè)試連接數(shù)據(jù)庫(kù)服務(wù)器
測(cè)試的方法多種多樣,可以在上面配置本地服務(wù)名時(shí)進(jìn)行測(cè)試,也可以是第三方客戶端工具,如PL/SQL Developer,最方便的是用Oracle自帶的sqlplus工具,以下利用sqlplus進(jìn)行測(cè)試:
C:sqlplus /nolog
SQLconn zgh@myoracle
已連接。
方法一, 直接拋
SQL?DECLARE
2????--?測(cè)試異常.
3????e_test_exception?EXCEPTION;
4??BEGIN
5
6????--?直接拋出異常,測(cè)試下面的捕獲
7????RAISE?e_test_exception;
8
9????EXCEPTION
10??????WHEN?e_test_exception?THEN
11????????dbms_output.put_line('Test?Error?!');
12??????WHEN?OTHERS?THEN
13????????dbms_output.put_line('OTHERS?Error!');
14??END;
15??/
Test?Error?!
PL/SQL?procedure?successfully?completed.
方法二, 定義個(gè)錯(cuò)誤代碼與消息后, 再拋。
SQL?BEGIN
2????--?錯(cuò)誤代碼允許的范圍是?-20,000~20,999
3????RAISE_APPLICATION_ERROR(-20000,?'My?Error?Happen!');
4
5????EXCEPTION
6??????WHEN?OTHERS?THEN
7????????dbms_output.put_line('Error?Code?=?'?||?TO_CHAR(SQLCODE)?);
8????????dbms_output.put_line('Error?Message?=?'?||?SQLERRM?);
9??END;
10??/
Error?Code?=?-20000
Error?Message?=?ORA-20000:?My?Error?Happen!
PL/SQL?procedure?successfully?completed.