sqlkill進程
『壹』 表被鎖了,想通過打開PL/sql工具的菜單欄Tools→Sessions…窗口來kill掉進程
在操作資料庫的時候,有時候會由於操作不當引起資料庫表被鎖定,這么我們經常不知所措,不知怎麼給這些表解鎖,在pl/sql Developer工具的的菜單「tools」裡面的「sessions」可以查詢現在存在的會話,但是我們很難找到那個會話被鎖定了,想找到所以被鎖的會話就更難了,下面這叫查詢語句可以查詢出所以被鎖的會話。如下:
SELECT sn.username, m.SID,sn.SERIAL#, m.TYPE,
DECODE (m.lmode,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl.',
4, 'Share',
5, 'S/Row Excl.',
6, 'Exclusive',
lmode, LTRIM (TO_CHAR (lmode, '990'))
) lmode,
DECODE (m.request,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl.',
4, 'Share',
5, 'S/Row Excl.',
6, 'Exclusive',
request, LTRIM (TO_CHAR (m.request, '990'))
) request,
m.id1, m.id2
FROM v$session sn, v$lock m
WHERE (sn.SID = m.SID AND m.request != 0) --存在鎖請求,即被阻塞
OR ( sn.SID = m.SID --不存在鎖請求,但是鎖定的對象被其他會話請求鎖定
AND m.request = 0
AND lmode != 4
AND (id1, id2) IN (
SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0 AND s.id1 = m.id1
AND s.id2 = m.id2)
)
ORDER BY id1, id2, m.request;
通過以上查詢知道了sid和 SERIAL#就可以開殺了
alter system kill session 'sid,SERIAL#';
『貳』 如何kill掉一個資料庫的進程
linux環境下從操作系統層面kill掉的話
kill -9 進程號
資料庫層面:alter system kill
session 『sid,serial#』;
『叄』 sql kill 進程是強制關閉進程嗎
kill -9 是強制關閉
另外有常用的kill -2;kill -15是正常關閉
『肆』 sqlserver kill掉進程後數據會丟失嗎如何恢復丟失的數據
你是用的SQLSERVER資料庫嗎?在SQLSERVER2008裡面有個【活動監視器】,
快捷鍵Ctrl+Alt+A,
可以看到操作的狀態以及進程ID,看到哪個佔用時間太久,可以把它kill掉。
『伍』 如何查詢SQL進程,並殺死進程
如何查詢SQL進程,並殺死進程。
--步驟1 觀察SQL進程:將使用資料庫「PXJY」的進程取出
--參考:SQL幫助:sysprocesses,DB_ID
select *
--主要有用的是這幾個列:
spid,dbid,uid,open_tran,status,cmd,loginame
--這些列的意義可以參看幫助。
from master.dbo.sysprocesses
where dbid=(select db_id(N'pxjy'))
--步驟2 殺死進程
--參考:SQL幫助:KILL
--假設剛才取出的記錄級中有記錄,spid=1
KILL 1
--其他需要考慮的問題如:sysprocesses的查看許可權,判斷取出的記錄集是否為空集,多條記錄的循環殺死。
『陸』 在SQL SERVER中用「KILL」死鎖問題
可以用 sp_executesql 系統存儲過程來執行它
如:
EXEC sp_executesql N'KILL 51'
記住,一定要在字元串前加N,或者定義為nvarchar,nchar,ntext類型。
『柒』 sql 怎麼手動殺死死鎖進程
用kill命令,殺進程。
『捌』 sqldeveloper怎麼殺死死鎖的表
嘗試在sqlplus中通過sql命令進行刪除,如果能夠刪除成功,則萬事大吉。
但通常情況下,出現死鎖時,想通過命令行或者通過oracle的管理工具刪除有死鎖的session,oracle只會將該session標記為killed,但無法清除掉,往往需要通過第二步在操作系統層級進行刪除。
altersystemkillsession29,57107。--刪除進程,如已經刪除過,則會報ora-00031的錯誤,否則oracle會將該session標記為killed狀態,等待一段時間看能否會自動消失,如長時間消失不掉,則需要做後續步驟。一些ORACLE中的進程被殺掉後,狀態被置為killed,但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟資料庫。現在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
『玖』 如何終止SQL Server中的用戶進程
首先,我們在主資料庫中創建「KILL2」這個進程,代碼如下所示(參考圖一):
USE [master]
GO
IF EXISTS (SELECT * FROM master.dbo.sysobjects
WHERE id = OBJECT_ID(N'[kill2]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[kill2]
GO
--Usage1: Kill2 '51-57' --> Kills all the session IDs from 51 to 57
--Usage2: Kill2 '58' --> Kills the session IDs 58
--Usage3: Kill2 '51,56,100,58'
--> Kills the session IDs 51,56,100 and 58
--Usage4: Kill2 'DB=MyDatabase'
--> Kills all the session IDs that are connected
to the database "MyDatabase"
use master
go
set concat_null_yields_null off
go
create procere kill2 @param2 varchar(500)
as
--declare @param2 varchar(500)
declare @param varchar(500)
declare @startcount int
declare @killcmd varchar(100)
declare @endcount int
declare @spid int
declare @spid2 int
declare @tempvar varchar(100)
declare @tempvar2 varchar(100)
--set @param2 ='54'
set @param=REPLACE(@param2,' ','')
if CHARINDEX('-',@param) <> 0
begin
select @startcount= convert(int,SUBSTRING(@param,1,charindex('-',@param)-1))
select @endcount=convert(int,SUBSTRING(@param,charindex('-',@param)+1,(LEN(@param)-charindex('-',@param))))
print 'Killing all SPIDs from ' + convert(varchar(100),@startcount)+' to ' +convert(varchar(100),@endcount)
while @startcount <=@endcount
begin
set @spid=(select spid from master.dbo.sysprocesses where spid=@startcount and spid>50)
if @spid = @startcount
begin
print 'Killing '+convert(varchar(100),@startcount)
set @killcmd ='Kill '+convert(varchar(100),@startcount)
exec(@killcmd)
end
else
begin
Print 'Cannot kill the SPID ' +convert(varchar(100),@startcount) + ' because it does not Exist'
end
set @startcount=@startcount + 1
end
end
if CHARINDEX(',',@param) <> 0
begin
set @tempvar =@param
while charindex(',',@tempvar ) <> 0
begin
SET @tempvar2=left(@tempvar,charindex(',',@tempvar)-1)
set @spid=(select spid from master.dbo.sysprocesses where spid=CONVERT(varchar(100),@tempvar2) and spid>50)
if @spid = CONVERT(varchar(100),@tempvar2)
begin
print 'Killing '+CONVERT(varchar(100),@tempvar2)
set @killcmd='Kill '+CONVERT(varchar(100),@tempvar2)
exec (@killcmd)
end
else
begin
Print 'Cannot kill the SPID ' +CONVERT(varchar(100),@tempvar2) + ' because it does not Exist'
end
set @tempvar =REPLACE(@tempvar,left(@tempvar,charindex(',',@tempvar)),'')
end
set @spid=(select spid from master.dbo.sysprocesses where spid=CONVERT(varchar(100),@tempvar) and spid>50)
if @spid = CONVERT(varchar(100),@tempvar)
begin
print 'Killing '+CONVERT(varchar(100),@tempvar)
set @killcmd='Kill '+CONVERT(varchar(100),@tempvar)
exec (@killcmd)
end
else
begin
Print 'Cannot kill the SPID ' +CONVERT(varchar(100),@tempvar) + ' because it does not Exist'
end
end
if CHARINDEX('=',@param2) <>0
begin
print 'Killing all the SPIDs that are connected to the database '+RIGHT(@param2,(len(@param2)-3))
declare dbcursor
cursor forward_only for select SPID from master.dbo.sysprocesses where DB_NAME(dbid) = RIGHT(@param2,(len(@param2)-3))
open dbcursor
fetch dbcursor into @spid
while @@FETCH_STATUS =0
begin
set @spid2=(select spid from master.dbo.sysprocesses where spid=@spid and spid>50)
if @spid = @spid2 begin
print 'Killing '+CONVERT(varchar(100),@spid2)
set @killcmd='Kill '+CONVERT(varchar(100),@spid2)
exec (@killcmd)
end
else
begin
Print 'Cannot kill the SPID ' +CONVERT(varchar(100),@spid2) + ' because it does not Exist'
end
fetch dbcursor into @spid
end
close dbcursor
deallocate dbcursor
end
if CHARINDEX('-',@param)=0 and CHARINDEX(',',@param) = 0 and CHARINDEX('=',@param)=0
begin
set @spid=(select spid from master.dbo.sysprocesses where spid=CONVERT(varchar(100),@param) and spid>50)
if @spid = CONVERT(varchar(100),@param)
begin
print 'Killing '+CONVERT(varchar(100),@param)
set @killcmd='Kill '+CONVERT(varchar(100),@param)
exec (@killcmd)
end
else
begin
Print 'Cannot kill the SPID ' +CONVERT(varchar(100),@param) + ' because it does not Exist'
end
end
go
--kill2 '51'
--go
--kill2 '51-56'
--go
--kill2 '56,57,58,52'
--go
--kill2 'db=AdventureWorks2008'
--kill2 'db=My Database'
--go
--sp_who
圖一
現在,我們假設進程ID(SPID)為51、52、53、54、55、57這幾個進程(見圖二)連接到了SQL Server資料庫,而我們只想把進程ID為54、55和57的進程結束掉。
圖二
執行以下命令。注意,在這個例子當中還在命令中加入了其他幾個SQL Server中不存在的SPID:61和100。
use master
go
kill2 '54,57,55,61,100'
go
運行結果:
Killing 54
Killing 57
Msg 6104, Level 16, State 1, Line 1
Cannot use KILL to kill your own process.
Cannot kill the SPID 55 because it does not Exist
Cannot kill the SPID 61 because it does not Exist
Cannot kill the SPID 100 because it does not Exist
圖三
我們可以從結果(見圖三)看到,執行指令後成功終止了SPID 54。當試圖終止57時失敗了。同時結果也顯示了為什麼沒能終止特定SPID的信息
下面,假設我們有51、52、53、54、55、57、58、59和60這幾個SPID,而我們的目標是結束SPID從25到70的進程。
執行以下命令:
use master
go
kill2 '25-75'
go
運行結果:
Killing all SPIDs from 25 to 75
Cannot kill the SPID 25 because it does not Exist
…..
Cannot kill the SPID 48 because it does not Exist
Cannot kill the SPID 49 because it does not Exist
Cannot kill the SPID 50 because it does not Exist
Killing 51
Killing 52
Killing 53
Killing 54
Killing 55
Cannot kill the SPID 56 because it does not Exist
Killing 57
Msg 6104, Level 16, State 1, Line 1
Cannot use KILL to kill your own process.
Killing 58
Killing 59
Killing 60
Cannot kill the SPID 61 because it does not Exist
.....
Cannot kill the SPID 75 because it does not Exist
圖四
從結果(見圖四)我們可以看到「KILL2」存儲過程忽略了所有SPID小於50的連接,而結束了從51到70的所有進程。
接下來,假設我們要終結掉所有連接到資料庫AdventureWorks2008的會話,同時又假設SPID為53、54、58和60的進程連接到了該資料庫(見圖五)。
圖五
現在,我們執行以下的T-SQL語句結束掉所有這些會話。
Use master
go
kill2 'db=AdventureWorks2008'
go
運行結果:
Killing all the SPIDs that are connected to the database AdventureWorks2008
Killing 53
Killing 54
Killing 58
Killing 60
圖六
從結果(見圖六)我們可以看到「KILL2」存儲過程終止了所有連接到AdventureWorks2008資料庫的會話。
用法四
「KILL2」存儲過程的第四種用法類似於「KILL命令,也就是一次解決一個會話,如下所示:
Use master
go
kill2 '56'
go
『拾』 通過什麼指令殺死全部mysql進程
kill掉第一個鎖表的進程, 依然沒有改善. 既然不改善, 咱們就想辦法將所有鎖表的進程kill掉吧, 簡單的腳本如下.
#!/bin/bash
mysql -u root -e "show processlist" | grep -i "Locked" >> locked_log.txt
for line in `cat locked_log.txt | awk '{print $1}'`
do
echo "kill $line;" >> kill_thread_id.sql
done
現在kill_thread_id.sql的內容像這個樣子
kill 66402982;
kill 66402983;
kill 66402986;
kill 66402991;
.....
好了, 我們在mysql的shell中執行, 就可以把所有鎖表的進程殺死了.
mysql>source kill_thread_id.sql
當然了, 也可以一行搞定
for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'`
do
mysqladmin kill ${id}
done