當前位置:首頁 » 編程語言 » oraclekillsql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

oraclekillsql

發布時間: 2022-07-19 00:41:50

㈠ 如何查看oracle伺服器上正在執行的sql語句

首先,你要以dba身份登陸資料庫。 第二,為某個用戶開啟sql跟蹤。那個用戶就是你要跟蹤的、正在執行sql語句的那個用戶。命令如下: execute dbms_system.set_sql_trace_in_session(sid,serial#,true) 其中參數的意義是,sid-會話id,serial#-序列號,這兩個參數可以從v$session中得到。 第三,上面的命令執行成功之後資料庫就自動對該用戶所發出的所有sql語句進行跟蹤,並把結果寫在用戶跟蹤文件里。用戶跟蹤文件存放在資料庫伺服器上,路徑請參考init.ora文件中的ump參數值。文件名為ora_sid_xxxx.trc(for unix)或者oraxxxxx.trc(for NT),其中xxxx文件系統進程編號,這個編號可以從v$process和v$session兩個表通過關聯的方式查詢得到。

㈡ 請教oracle kill session spid 後不釋放鎖的問題

今天在做統計數據,整了一個特復雜的SQL,通過PL/SQL來執行,狀態欄下顯示執行完成,以及執行時間,可是彈出一個錯誤提示框,說執行錯誤,窗口上的「執行」按鈕不可用,點「中斷」也不起作用。
把該SQL拷貝到一新的窗口再次執行,依然提示成功的提示成功,報錯的窗口照樣彈出,提示錯誤,暈死。
這時,我得確定,這兩次SQL,是不是還在資料庫裡面執行。
select * from v$session se, v$sqlarea sq
where suser = 'test'
and se.sql_id = sq.sql_id
發現那兩條SQL確實還在運行,採用 kill session 來終止SQL的執行。
SQL> alter system kill session '3961,26056';
System altered
SQL> alter system kill session '4923,8094';
System altered
SQL>
再次執行以上語句查看session,發現session的status居然是killed,session還存在。原來 kill session 並沒有真正釋放資源,還需要在OS里kill進程來達到資源的真正釋放。
kill session 雖然沒釋放資源,但還是把v$session裡面的PADDR這個欄位變成一樣的了。由於PADDR欄位已經改變,我們無法通過v$session和v$process關聯來獲得spid(v$session的paddr和v$process的addr欄位進行關聯)。
只能採用以下方式:
select addr, pid, spid
FROM v$process p
where addr in (select p.addr
from v$process p
where pid <> 1
minus
select s.paddr from v$session s)

最後在unix環境用kill -9 spid殺掉進程,在windows環境用orakill sid spid殺掉進程。

這是再執行如下語句:
select *
from v$session se, v$sqlarea sq
where suser = 'test'
and se.sql_id = sq.sql_id
發現 killed 的記錄已經沒有了。

㈢ 查看Oracle中是否有鎖表的sql

oracle的鎖是個龐大的體系,種類很多,建議你專門搜尋資料學習一下。
從你的問題提問來看,你應該是問事務鎖,也就是常見的TX鎖,即dml操作帶來的鎖表。
----------------------------------------------------------------------------------------------------------

你可以用如下語句看到表上鎖等待情況:(集群或單實例環境通用)
SELECT DECODE(request,0,'Holder: ','Waiter: ')||inst_id , sid ,
id1, id2, lmode, request, type,CTIME
FROM GV$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM GV$LOCK WHERE request>0)
ORDER BY id1, request;

然後根據查出的sid,尋找sql語句:
select s.USERNAME,s.SID||','||s.SERIAL#,'kill -9 '||p.SPID,s.STATUS,s.SQL_ID,s.STATE,s.EVENT,s.WAIT_CLASS,s.PROGRAM,s.MACHINE,s.SECONDS_IN_WAIT,s.LAST_CALL_ET,sq.SQL_TEXT ,sq.SQL_FULLTEXT,s.USERNAME from v$session s,v$sqlarea sq ,v$process p
where s.PADDR = p.ADDR and s.SQL_ID = sq.SQL_ID(+)
and s.SID = 355 ;
------------------------------------------------------------------------------------
上面查找鎖的sql語句,需要你學習下鎖的級別,類型等知識。

㈣ oracle資料庫死鎖怎麼解決

Oracle資料庫出現死鎖的時候可以按照以下處理步驟加以解決:

第一步:嘗試在sqlplus中通過sql命令進行刪除,如果能夠刪除成功,則萬事大吉!但通常情況下,出現死鎖時,想通過命令行或者通過Oracle的管理工具刪除有死鎖的session,oracle只會將該session標記為killed,但無法清除掉,往往需要通過第二步在操作系統層級進行刪除!

.2.0.1.0
Connectedasquik
SQL>selectxisn,object_id,session_id,locked_modefromv$locked_object;--查死鎖的對象,獲取其SESSION_ID
XIDUSNOBJECT_IDSESSION_IDLOCKED_MODE
-----------------------------------------
1030724293
1030649293
SQL>selectusername,sid,serial#fromv$sessionwheresid=29;--根據上步獲取到的sid查看其serial#號
USERNAMESIDSERIAL#
--------------------------------------------------
QUIK2957107
SQL>altersystemkillsession'29,57107';--刪除進程,如已經刪除過,則會報ora-00031的錯誤;否則oracle會將該session標記為killed狀態,等待一段時間看能否會自動消失,如長時間消失不掉,則需要做後續步驟
altersystemkillsession'29,57107'
ORA-00031:sessionmarkedforkill
SQL>selectpro.spidfromv$sessionses,v$processprowhereses.sid=29andses.paddr=pro.addr;--查看spid號,以便在操作系統中根據該進程號刪除進程
SPID
------------
2273286

第二步:進入操作系統進行刪除進程,本示例的操作系統是IBM aix。

login:root--錄入用戶名
root'sPassword:--錄入密碼
*******************************************************************************
**
**
*WelcometoAIXVersion5.3!*
**
**
*PleaseseetheREADMEfilein/usr/lpp/bosforinformationpertinentto*
*.*
**
**
*******************************************************************************
Lastunsuccessfullogin:FriApr2314:42:57BEIDT2010on/dev/pts/1from10.73
.52.254
Lastlogin:FriApr2315:27:50BEIDT2010on/dev/pts/2from10.73.52.254
#ps-ef|grep2273286--查看進程詳情
root22898642494636017:07:15pts/10:00grep2273286
oracle22732861014:38:24-0:21oracleQUIK(LOCAL=NO)
#kill-92273286--刪除進程,小心操作,別寫錯進程號,如果oracle的關鍵進程被刪,資料庫會崩潰的!
#ps-ef|grep2273286--再次查看
root22898642494636017:07:15pts/10:00grep2273286
ForWindows,attheDOSPrompt:orakillsidspid
ForUNIXatthecommandline>kill–9spid

㈤ 如何殺掉Oracle中的會話

有時,Oracle中造成一些表被死鎖或者會話異常退出,如執行了更新記錄操作後,既沒有commit也沒有rollback,網路就斷開了,也會造表或記錄被鎖住,待到超時後才會被解開,那樣都會造成應用操作被阻塞。

可以以Oralce管理員許可權用戶登錄Oracle數據,查詢到被鎖的對象,然後殺除指定的會話。

用下面的語句查詢被鎖的對象,可以帶上更多約束條件,如schemaname等更精確的匹配。

SELECT
a.object_id, a.session_id, b.object_name, c.*
FROM
v$locked_object a, dba_objects b, v$session c

WHERE
a.object_id = b.object_id

AND
a.SESSION_ID = c.sid(+)

殺Seesion的SQL語句語法如下:
alter system kill session 'sid, serial#'

如上面查出來的一條記錄的sid是53, serial#為663,就執行以下的語句 alter system kill session '53,663'

如果要一次性殺死多個會話,一個一個填寫sid和serial#十分的繁瑣,應該在查詢被鎖對象的同時拼湊出多條的殺會話語句,以分號分隔,一起復制下來,然後就可以批量的執行了。

拼湊kill語句的方式如下,下面加了一個過濾條件和一個排序,殺除真正關心的表,並且著重注意超時時間過長的會話。
SELECT 'alter system kill session ''' || c.sid || '' || ',' || c.serial# ||''';',

a.object_id, a.session_id, b.object_name, c.*
FROM v$locked_object a, dba_objects b, v$session c
WHERE a.object_id = b.object_id
AND a.SESSION_ID = c.sid(+)
AND schemaname = 'Unmi'
ORDER BY logon_time

你遇到過下面類似的情況嗎?一個用戶進程長期佔用資源而不釋放,導致Oracle進程佔用了系統的大量資源,Oralce系統的效率變得很低。如果簡單的關閉重啟Oracle
實例,勢必影響所有的用戶。有沒有辦法僅僅只Kill掉有問題的用戶進程而不用關閉整個Oralce實例呢?答案是可以的,使用Oralce提供的一個名叫Orakill的工具。

大家都知道,Windows
2000是一個基於線程的操作系統,而不是象Unix、Linux那樣基於進程的操作系統。整個Oracle的後台進程、用戶進程等,在Windows
2000環境下,都包含在ORACLE.EXE這單獨的一個體系進程中了,通過查看』任務管理器』――』進程』就可以看到。如果你不是使用MTS多線程服
務器的模式,如果你Kill掉ORACLE.EXE這個進程,將導致整個Oracle實例關閉,如同使用Shutdown
abort命令一樣。

由於Windows自己沒有提過一個專門用來Kill掉單個線程的工具,因此Oracle從Oracle7.3.3.6開始,自己提供了一個基於字元界面的用來在Windows環境下強制Kill掉一個線程的工具――Orakill。

在NT中如果使用alter system kill
session
'sid,serial#'來清楚會話,在執行之後該會話的狀態會變為KILLED,但是有時候這個狀態會保持很長時間,直到最後被清除。

如果想更快地從內存中清理這個會話,那麼可以在使用了alter
system之後,再在NT中使用Orakill實用程序(該程序隨Oracle資料庫同時安裝)直接清除該會話的線程。

Orakill的使用方法如下:

Dos提示符下:>orakill sid thread

說明: sid Oracle的Sid號

thread Oracle的線程id號

首先取得被殺掉的會話的Thread Number:

SET pagesize 100

SET linesize 100

COLUMN Program format a20

SELECT s.sid AS "Sid", s.serial# AS "Serial#", p.spid AS
"ThreadID",

s.osuser

AS "OSUser", s.program AS "Program"

FROM v$process p, v$session s

WHERE p.addr = s.paddr(+)

ORDER BY s.sid

輸出可能如下:

Sid Serial# ThreadID OSUser Program

--- ------- -------- ------ -------

...

10 809 102 User01 Prog.exe

11 345 333 SeUser App.exe

15 719 422 User01 Prge.exe

20 345 123 SeUs Acco.exe

555

324

然後在命令行窗口執行Orakill命令

例:orakill ORCL 555

orakill ORCL 324

orakill的命令幫助如下:

C:>orakill

Usage: orakill sid thread

where sid = the Oracle instance to target

thread = the thread id of the thread to kill

The thread id should be retrieved from the spid column of a query
such

as:

SELECT spid, osuser, s.program

FROM v$process p, v$session s

WHERE p.addr = s.paddr;

需要注意的是,如果你Kill掉的是Oracle的核心後台線程(DBWR, LGWR, SMON or
PMON),將導致Oracle實例關閉。檢查Oracle的核心後台線程的方法如下:

sql:>Select vb.name NOME, vp.programe PROCESSNAME,
vp.spid THREADID, vs,sid SID

sql:>From v$session vs, v$process vp, v$bgprocess
vb

sql:>Where vb.addr <>
『00』 and

sql:>vb.paddr = vp.addr and

sql:>vp.addr = vs.paddr

查詢結果如下:

NOME
PROCESSNAME
THREADID SID

----- ----------------------------------- --------- ------

PMON
ORACLE.EXE
169
1

DBW0
ORACLE.EXE
215
2

LGWR
ORACLE.EXE
280
3

CKPT
ORACLE.EXE
267
4

SMON
ORACLE.EXE
287
5

RECO
ORACLE.EXE
288
6

SNP0
ORACLE.EXE
271
7

SNP1
ORACLE.EXE
282
8

8 rows selected.

特別提醒,這里的sid指的是oracle的實例號



select instance from v$instance;
而且orakill只能用於oracle實例安裝在windows上的時候

㈥ 如何殺掉(kill)Oracle中的會話(Session)

殺掉(kill)Oracle中的會話(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里kill session的影響

1.看看資料庫是否有其他人在開發程序啊?最好讓他們先退出來
2.kill session 要看看操作系統的session是否kill掉了

㈧ oracle資料庫 用戶session Kill不掉

用alert system kill session的方式殺會話,會話會被標注為killed狀態,但不一定會立即釋放。
所以對於確信可以殺掉的會話,
建議在操作系統級別使用kill -9的方式,簡單粗暴又高效
windows呢,可以使用orakill sid spid的方式