亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

處理Oracle中殺不掉的鎖

系統 2817 0

一些ORACLE中的進程被殺掉后,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟數據庫。 現在提供一種方法解決這種問題,那1.就是在ORACLE中殺不掉的,2.在OS一級再殺。

1.下面的語句用來查詢哪些對象被鎖:
select a.object_name,a.object_type,s.osuser,s.username,s.status,machine,s.sid,s.serial#
from v$locked_object l,dba_objects o ,v$session s ,all_objects a
where l.object_id = o.object_id and l.session_id=s.sid and a.object_id=l.OBJECT_ID



?
?
?

object_name: 被鎖的對象名;object_type: 對象類型; osuser:主機名稱; username:oracle鏈接用戶名;

machine:完整主機名;

?

1.2 查詢可能出現鎖表的語句(orale10g支持正則)

?
?


2.下面的語句用來殺死一個進程:
alter system kill session '24,111'; (其中24,111分別是上面查詢出的sid,serial#)

【注】以上兩步,可以通過Oracle的管理控制臺來執行。

3.如果利用上面的命令殺死一個進程后,進程狀態被置為"killed",但是鎖定的資源很長時間沒有被釋放,那么可以在os一級再殺死相應的進程( 線程 ),首先執行下面的語句獲得進程(線程)號:
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=24 (24是上面的sid)

4.在OS上殺死這個進程(線程):
1)在unix上,用root身份執行命令:
#kill -9 12345(即第3步查詢出的spid)
2)在windows(unix也適用)用orakill殺死線程,orakill是oracle提供的一個可執行命令,語法為:
orakill sid thread
其中:
sid:表示要殺死的進程屬于的實例名 就是你安裝的oracle的sid名字如我的是 orcl
thread:是要殺掉的線程號,即第3步查詢出的spid。
例:c:>orakill orcl 12345

====================================

Oracle中Kill session的研究

我們知道,在Oracle數據庫中,可以通過kill?session的方式來終止一個進程,其基本語法結構為:
alter?system?kill?session?’sid,serial#’?;?
?
被kill掉的session,狀態會被標記為killed,Oracle會在該用戶下一次touch時清除該進程.

我們發現當一個session被kill掉以后,該session的paddr被修改,如果有多個session被kill,那么多個session的paddr都被更改為相同的進程地址:
SQL>?select?saddr,sid,serial#,paddr,username,status?from?v$session?where?username?is?not?null;

SADDR???????????SID????SERIAL#?PADDR????USERNAME???????????????????????STATUS
--------?----------?----------?--------?------------------------------?--------
542E0E6C?????????11????????314?542B70E8?EYGLE??????????????????????????INACTIVE
542E5044?????????18????????662?542B6D38?SYS????????????????????????????ACTIVE


SQL>?alter?system?kill?session?’11,314’;

System?altered.

SQL>?select?saddr,sid,serial#,paddr,username,status?from?v$session?where?username?is?not?null;

SADDR???????????SID????SERIAL#?PADDR????USERNAME???????????????????????STATUS
--------?----------?----------?--------?------------------------------?--------
542E0E6C?????????11????????314?542D6BD4?EYGLE??????????????????????????KILLED
542E5044?????????18????????662?542B6D38?SYS????????????????????????????ACTIVE


SQL>?select?saddr,sid,serial#,paddr,username,status?from?v$session?where?username?is?not?null;

SADDR???????????SID????SERIAL#?PADDR????USERNAME???????????????????????STATUS
--------?----------?----------?--------?------------------------------?--------
542E0E6C?????????11????????314?542D6BD4?EYGLE??????????????????????????KILLED
542E2AA4?????????14????????397?542B7498?EQSP???????????????????????????INACTIVE
542E5044?????????18????????662?542B6D38?SYS????????????????????????????ACTIVE

SQL>?alter?system?kill?session?’14,397’;

System?altered.

SQL>?select?saddr,sid,serial#,paddr,username,status?from?v$session?where?username?is?not?null;

SADDR???????????SID????SERIAL#?PADDR????USERNAME???????????????????????STATUS
--------?----------?----------?--------?------------------------------?--------
542E0E6C?????????11????????314?542D6BD4?EYGLE??????????????????????????KILLED
542E2AA4?????????14????????397?542D6BD4?EQSP???????????????????????????KILLED
542E5044?????????18????????662?542B6D38?SYS????????????????????????????ACTIVE


在這種情況下,很多時候,資源是無法釋放的,我們需要查詢spid,在操作系統級來kill這些進程.但是由于此時v$session.paddr已經改變,我們無法通過v$session和v$process關聯來獲得spid那還可以怎么辦呢?
我們來看一下下面的查詢:
??SQL>?SELECT?s.username,s.status,
??2??x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,
??3??decode(bitand?(x.ksuprflg,2),0,null,1)
??4??FROM?x$ksupr?x,v$session?s
??5??WHERE?s.paddr(+)=x.addr
??6??and?bitand(ksspaflg,1)!=0;


USERNAME???????????????????????STATUS???ADDR???????KSLLAPSC???KSLLAPSN?KSLLASPO???????KSLLID1R?KS?D
------------------------------?--------?--------?----------?----------?------------?----------?--?-
????????????????????????????????????????542B44A8??????????0??????????0???????????????????????0
???????????????????????????????ACTIVE???542B4858??????????1?????????14?24069?????????????????0????1
???????????????????????????????ACTIVE???542B4C08?????????26?????????16?15901?????????????????0????1
???????????????????????????????ACTIVE???542B4FB8??????????7?????????46?24083?????????????????0????1
???????????????????????????????ACTIVE???542B5368?????????12?????????15?24081?????????????????0????1
???????????????????????????????ACTIVE???542B5718?????????15?????????46?24083?????????????????0????1
???????????????????????????????ACTIVE???542B5AC8?????????79??????????4?15923?????????????????0????1
???????????????????????????????ACTIVE???542B5E78?????????50?????????16?24085?????????????????0????1
???????????????????????????????ACTIVE???542B6228????????754?????????15?24081?????????????????0????1
???????????????????????????????ACTIVE???542B65D8??????????1?????????14?24069?????????????????0????1
???????????????????????????????ACTIVE???542B6988??????????2?????????30?14571?????????????????0????1

USERNAME???????????????????????STATUS???ADDR???????KSLLAPSC???KSLLAPSN?KSLLASPO???????KSLLID1R?KS?D
------------------------------?--------?--------?----------?----------?------------?----------?--?-
SYS????????????????????????????ACTIVE???542B6D38??????????2??????????8?24071?????????????????0
????????????????????????????????????????542B70E8??????????1?????????15?24081???????????????195?EV
????????????????????????????????????????542B7498??????????1?????????15?24081???????????????195?EV
SYS????????????????????????????INACTIVE?542B7848??????????0??????????0???????????????????????0
SYS????????????????????????????INACTIVE?542B7BF8??????????1?????????15?24081???????????????195?EV

16?rows?selected.

?
我們注意,紅字標出的部分就是被Kill掉的進程的進程地址.

簡化一點,其實就是如下概念:
SQL>?select?p.addr?from?v$process?p?where?pid?<>?1?2?minus?3?select?s.paddr?from?v$session?s;
ADDR
--------
542B70E8
542B7498
?

Ok,現在我們獲得了進程地址,就可以在v$process中找到spid,然后可以使用Kill或者orakill在系統級來殺掉這些進程.實際上,我猜測:當在Oracle中kill?session以后,?Oracle只是簡單的把相關session的paddr?指向同一個虛擬地址.此時v$process和v$session失去關聯,進程就此中斷.然后Oracle就等待PMON去清除這些Session.所以通常等待一個被標記為Killed的Session退出需要花費很長的時間.如果此時被Kill的process,重新嘗試執行任務,那么馬上會收到進程中斷的提示,process退出,此時Oracle會立即啟動PMON來清除該session.這被作為一次異常中斷處理.

處理Oracle中殺不掉的鎖


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久福利资源网站免费看 | 国内精品99| 无套嗨操| 国产欧美日韩精品一区二区三区 | 国产成人在线视频免费观看 | 日本三级带日本三级带黄首页 | 99热伊人| 欧美 xx性 在线 | 午夜国产精品理论片久久影院 | 在线观看国产区 | 欧美日韩亚洲国产一区二区综合 | 欧美巨大video粗暴 | 国产精品入口麻豆午夜 | 国产一区二区亚洲精品天堂 | 97在线成人免费视频观看 | 国产精品九九久久精品女同 | 国内精品影院久久久久 | 99久久精品免费看国产免费 | 国内拍拍自拍视频在线观看 | 中文字幕不卡免费高清视频 | 欧美一区二区在线观看免费网站 | 99国产精品视频免费观看 | 久久精品视频免费看 | 日日夜夜精品 | 精品玖玖玖视频在线观看 | 色域综合 | 成人综合久久综合 | 一级毛片高清大全免费观看 | 中文伊人 | 九九精品免费视频 | 国产亚洲欧洲国产综合一区 | 欧美在线视频a | 99精品福利 | 欧美一级二级aaa免费视频 | 干美女网站| 欧美一级α片毛片免费观看 | 亚洲黑人巨大videos0 | 国产午夜爽爽窝窝在线观看 | 九九热最新 | 亚洲sss视频 | 激情四月婷婷 |