在Oracle中,可以用kill session來終止一個(gè)會(huì)話進(jìn)程,其基本語法結(jié)構(gòu)為:
成都創(chuàng)新互聯(lián)公司成立于2013年,先為廣豐等服務(wù)建站,廣豐等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為廣豐企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
alter system kill session 'sid,serial' ;
殺掉(kill)Oracle中的會(huì)話(Session)的方法:
SQL conn etl/etl
Connected.
SQL ?update test set status='invalid';
55944 rows updated.
SQL update test2 set dropped='Y';
3090 rows updated.
Oracle Database,簡稱Oracle。是甲骨文公司的一款關(guān)系數(shù)據(jù)庫管理系統(tǒng)。它是在數(shù)據(jù)庫領(lǐng)域一直處于領(lǐng)先地位的產(chǎn)品??梢哉fOracle數(shù)據(jù)庫系統(tǒng)是目前世界上流行的關(guān)系數(shù)據(jù)庫管理系統(tǒng)。
ORACLE數(shù)據(jù)庫系統(tǒng)是美國ORACLE公司(甲骨文)提供的以分布式數(shù)據(jù)庫為核心的一組軟件產(chǎn)品,是目前最流行的客戶/服務(wù)器(CLIENT/SERVER)或B/S體系結(jié)構(gòu)的數(shù)據(jù)庫之一。比如SilverStream就是基于數(shù)據(jù)庫的一種中間件。ORACLE數(shù)據(jù)庫是目前世界上使用最為廣泛的數(shù)據(jù)庫管理系統(tǒng)。
問題場景:在操作大數(shù)據(jù)量的時(shí)候,會(huì)出現(xiàn)種種問題導(dǎo)致數(shù)據(jù)不正確導(dǎo)致需要重新處理數(shù)據(jù),如果這個(gè)時(shí)候刪除表數(shù)據(jù)會(huì)無法刪除成功,然后手動(dòng)終止會(huì)話可能會(huì)提示“標(biāo)記要終止的會(huì)話”,這是因?yàn)槭謩?dòng)終止會(huì)話后,進(jìn)程的狀態(tài)被設(shè)置為“killed”,但是鎖定的資源很長時(shí)間沒有被釋放,那么可以在OS級(jí)再殺死相應(yīng)的進(jìn)程(線程),詳細(xì)操作如下:
1,查詢臨時(shí)會(huì)話的session:
--查找sql執(zhí)行的會(huì)話session id, 用session id 這一欄的數(shù)據(jù)進(jìn)行kill掉會(huì)話
SELECT B.SID,
? B.OBJECT,
? A.SQL_ID,
? A.LOGON_TIME,
? A.SQL_EXEC_START,
? A.MODULE,
? C.SQL_TEXT,
? C.SQL_FULLTEXT,
? A.OSUSER,
? A.EVENT#,
? A.EVENT,
? A.INST_ID,
? A.ACTION,
? A.PROCESS,
? A.STATUS,
? 'alter system kill session ''' || a.sid || ', ' || a.serial# ||
? ', @' || a.inst_id || ''' IMMEDIATE;' kill_session,
? A.*
FROM GV$SESSION A, GV$ACCESS B,GV$SQL C
WHERE A.SID = B.SID
AND A.INST_ID = B.INST_ID
AND A.SQL_ID = C.SQL_ID(+)
AND A.INST_ID = C.INST_ID(+)
--AND A.TYPE 'BACKGROUND'
--AND A.STATUS = 'ACTIVE'
AND B.OWNER = 'BI_DM'
--AND A.INST_ID =1
--AND A.ACTION IN ('ORA$AT_SA_SPC_SY_4630','ORA$AT_OS_OPT_SY_4629')
AND B.OBJECT = 'TMP_T_JOBNAME'
--AND A.USERNAME LIKE 'DEV%'
--AND A.MACHINE IN (/*'infor',*/'winitdb')
ORDER BY A.SQL_EXEC_START;
2,執(zhí)行session id 里面是語句
alter system kill session '2761, 65372, @2' IMMEDIATE;
在kill session的時(shí)候,當(dāng)提示RA-00031:標(biāo)記要終止的會(huì)話 時(shí)
按如下操作:
1,select a.spid,b.sid,b.serial#,b.username?from v$process a,v$session b?where a.addr=b.paddr?and b.status='KILLED';
2,如果利用上面的命令殺死一個(gè)進(jìn)程后,進(jìn)程狀態(tài)被置為"killed",但是鎖定的資源很長時(shí)間沒有被釋放,那么可以在OS級(jí)再殺死相應(yīng)的進(jìn)程(線程),首先執(zhí)行下面的語句獲得進(jìn)程(線程)號(hào):?
select b.spid,a.osuser,b.program?from v$session a,v$process b?where a.paddr=b.addr??and a.sid=9065? ? ?--9065就是上面的sid
.在OS上殺死這個(gè)進(jìn)程(線程)
1)、在unix上,用root身份執(zhí)行命令:#kill -9 9065(即第2步查詢出的spid)?
2)、在windows(unix也適用)用orakill殺死線程,orakill是oracle提供的一個(gè)可執(zhí)行命令,語法為:orakill sid thread?
其中:
sid:表示要?dú)⑺赖倪M(jìn)程屬于的實(shí)例名 ??梢杂胹elect?name?from?v$database;查詢
thread:是要?dú)⒌舻木€程號(hào),即第2步查詢出的spid。?
? ? 例:c:orakill system 9065
注意:這里要注意的是kill OS進(jìn)程是在服務(wù)端操作,而不是你程序所在客戶機(jī)
1、由于oracle運(yùn)行在Linux系統(tǒng)里面,第一步,我們要連接Linux系統(tǒng)。
2、然后我們轉(zhuǎn)換到oracle安裝用戶里面。 我的是 oracle。
3、然后我們運(yùn)行oracle的環(huán)境里的變量, 用來輸入相關(guān)命令。
4、進(jìn)去oracle的控制臺(tái)。輸入一個(gè)命令: sqlplus ?/ as sysdba。
5、如果要啟動(dòng)數(shù)據(jù)庫,就輸入命令: startup。
6、如果關(guān)閉數(shù)據(jù)庫, 就輸入命令: shutdown immediate。
sqlplus環(huán)境下 alter system kill session 'sid,serial#';
如果不行的話在操作系統(tǒng)下操作:
windows: orakill 實(shí)例名 spid
linux: kill -9 spid
你可以考慮使用在操作系統(tǒng)層面來殺掉客戶端會(huì)話的連接進(jìn)程,這樣資源馬上就可以釋放掉,如果只是在數(shù)據(jù)庫級(jí)別的話,即便是管理員殺掉會(huì)話,那么v$session里面也不過是顯示killed狀態(tài),而不是真正的釋放掉,同時(shí)如果此時(shí)實(shí)際的連接數(shù)量達(dá)到參數(shù)session設(shè)定數(shù)量上線的話,新的連接將會(huì)報(bào)錯(cuò)無法連接,直到資源釋放才可以。