十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
1.查哪個過程被鎖\x0d\x0a查V$DB_OBJECT_CACHE視圖:SELECT*FROMV$DB_OBJECT_CACHEWHEREOWNER='過程的所屬用戶'ANDLOCKS!='0';\x0d\x0a2. 查是哪一個SID,通過SID可知道是哪個SESSION.\x0d\x0a查V$ACCESS視圖:SELECT*FROMV$ACCESSWHEREOWNER='過程的所屬用戶'ANDNAME='剛才查到的過程名';\x0d\x0a3. 查出SID和SERIAL#\x0d\x0a查V$SESSION視圖:SELECTSID,SERIAL#,PADDRFROMV$SESSIONWHERESID='剛才查到的SID'查V$PROCESS視圖:SELECTSPIDFROMV$PROCESSWHEREADDR='剛才查到的PADDR';\x0d\x0a4. 殺進程(1).先殺ORACLE進程:ALTERSYSTEMKILLSESSION'查出的SID,查出的SERIAL#';(2).再殺操作系統(tǒng)進程:KILL-9剛才查出的SPID或ORAKILL剛才查出的SID剛才查出的SPID方法二:經(jīng)常在oracle的使用過程中碰到這個問題,所以也總結(jié)了一點解決方法:)1)查找死鎖的進程:sqlplus"/assysdba"SELECT\x0d\x0as.username,l.\x0d\x0aOBJECT_ID\x0d\x0a,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESSFROMV$LOCKED_OBJECTl,V$SESSIONSWHERE\x0d\x0al.SESSION_ID=\x0d\x0aS.SID;2)kill掉這個死鎖的進程:altersystemkillsession‘sid,serial#’;(其中sid=\x0d\x0al.session_id)3)如果還不能解決,\x0d\x0aselectpro.spidfromv$sessionses,v$processprowhereses.sid=XXandses.paddr=pro.addr;其中sid用死鎖的sid替換。

成都創(chuàng)新互聯(lián)專注于慶安企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城系統(tǒng)網(wǎng)站開發(fā)。慶安網(wǎng)站建設(shè)公司,為慶安等地區(qū)提供建站服務(wù)。全流程按需設(shè)計網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
嘗試在sqlplus中通過sql命令進行刪除,如果能夠刪除成功,則萬事大吉。
但通常情況下,出現(xiàn)死鎖時,想通過命令行或者通過oracle的管理工具刪除有死鎖的session,oracle只會將該session標(biāo)記為killed,但無法清除掉,往往需要通過第二步在操作系統(tǒng)層級進行刪除。
altersystemkillsession29,57107。--刪除進程,如已經(jīng)刪除過,則會報ora-00031的錯誤,否則oracle會將該session標(biāo)記為killed狀態(tài),等待一段時間看能否會自動消失,如長時間消失不掉,則需要做后續(xù)步驟。一些ORACLE中的進程被殺掉后,狀態(tài)被置為killed,但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟數(shù)據(jù)庫。現(xiàn)在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
通過查詢系統(tǒng)表,獲取被鎖進程號,然后kill鎖住的進程,這個需要管理員權(quán)限才可以操作。
查看鎖表進程SQL語句:
select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;
殺掉鎖表進程:
alter system kill session 'SID,serial#';
1、生成Kill Session語句
select?'alter?system?kill?session?'''?||?SID?||','?||?SERIAL#?||?''';'?from
(
select?distinct?a.sid,?a.Serial#,?status,?machine,?LOCKWAIT,?logon_time
from?v$session?a,?v$locked_object?b
where?(a.status?=?'ACTIVE'?or?a.status?=?'INACTIVE')
and?a.sid?=?b.session_id
and?b.ORACLE_USERNAME='XYHISTEST'--加上用戶名是避免把其他系統(tǒng)的會話也關(guān)閉,以免傷及無辜
)
2、批量執(zhí)行第一步生成的語句
alter?system?kill?session?'sid,serial#';
--alter?system?kill?session?'6976,33967';
3、查詢oracle用戶名,機器名,鎖表對象
SELECT?l.session_id?sid,?s.serial#,?l.locked_mode,l.oracle_username,
l.os_user_name,s.machine,?s.terminal,?o.object_name,?s.logon_time
FROM?v$locked_object?l,?all_objects?o,?v$session?s
WHERE?l.object_id?=?o.object_id
AND?l.session_id?=?s.sid
ORDER?BY?sid,?s.serial#?;
/*或者
select?s.SID,?s.OSUSER,?p.spid?as?OSPID,?s.MACHINE,?s.TERMINAL,?s.PROGRAM
from?v$session?s,?v$process?p
where?s.sid?=?6??--session_id
and?s.paddr?=?p.addr;
*/
4、查詢是執(zhí)行何sql語句導(dǎo)致鎖表的
select?b.sql_text
from?v$session?a,?v$sql?b
where?a.sid?=?6?--session_id
and?a.SQL_ADDRESS?=?b.ADDRESS(+);
/*--或者
SELECT?l.session_id?sid,?s.serial#,?l.locked_mode,?l.oracle_username,?s.user#,
l.os_user_name,s.machine,?s.terminal,a.sql_text,?a.action
FROM?v$sqlarea?a,v$session?s,?v$locked_object?l
WHERE?l.session_id?=?s.sid
AND?s.prev_sql_addr?=?a.address
ORDER?BY?sid,?s.serial#;
*/
首先你要知道表鎖住了是不是正常鎖?因為任何DML語句都會對表加鎖。
你要先查一下是那個會話那個sql鎖住了表,有可能這是正常業(yè)務(wù)需求,不建議隨便KILL session,如果這個鎖表是正常業(yè)務(wù)你把session kill掉了會影響業(yè)務(wù)的。
建議先查原因再做決定。
(1)鎖表查詢的代碼有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
(2)查看哪個表被鎖
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
(3)查看是哪個session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
(4)查看是哪個sql引起的
select b.username,b.sid,b.serial#,c.* from v$locked_object a,v$session b,v$sql c where a.session_id = b.sid
and b.SQL_ID = c.sql_id and c.sql_id = ''
order by b.logon_time;
(5)殺掉對應(yīng)進程
執(zhí)行命令:alter system kill session'1025,41';
其中1025為sid,41為serial#.