當前位置:首頁 » 編程語言 » sql殺死進程

sql殺死進程

發布時間: 2023-05-14 17:53:51

1. 如何殺死oracle死鎖進程

oracle死鎖時殺進程的方法:
第一步:嘗試在sqlplus中通過sql命令進行刪除,如果能夠刪除成功,則萬事大吉。但通常情況下,出現死鎖時,想通過命令行或者通過oracle的管理工具刪除有死鎖的session,oracle只會將該session標記為killed,但無法清除掉,往往需要通過第二步在操作系統層級進行刪除。
第二步:
1、select xisn, object_id, session_id, locked_mode from v$locked_object; --查死鎖的對象,獲取其SESSION_ID。
2、select username,sid,serial# from v$session where sid=29; --根據上步獲取到的sid查看其serial#號。
3、alter system kill session '29,57107'; --刪除進程,如已經刪除過,則會報ora-00031的錯誤;否則oracle會將該session標記為killed狀態,等待一段時間看能否會自動消失,如長時間消失不掉,則需要做後續步驟。
一些ORACLE中的進程被殺掉後,狀態被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟資料庫。現在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。

2. 如何查看sql server 2000中的某個資料庫有有多少用戶正在訪問

系統表sysprocesses 中有用戶連接記錄。亮陪可以根據資料庫名察鍵遲稱,查看連接的用戶。


Selectspid,hostname,loginame,user_name(uid)Asusername
Fromsysprocesses
Wheredbid=db_id('敗李glkf')


3. sql server死鎖的進程怎麼處理

怎麼解除SQL Server死鎖的問題?SQL Server死鎖是我們經常會碰到的問題,下面就為您介紹如何查詢SQL Server死鎖,希望對您學習SQL Server死鎖方面能有所幫助。   
SQL Server死鎖的查詢方法:    exec master.dbo.p_lockinfo 0,0 ---顯示死鎖的進程,不顯示正常的進程    exec master.dbo.p_lockinfo 1,0 ---殺死死鎖的進程,不顯示正常的進程.   
SQL Server死鎖的解除方法:    Create proc p_lockinfo    @kill_lock_spid bit=1, --是扒派否殺掉死鎖的進程,1 殺掉, 0 僅顯示    @show_spid_if_nolock bit=1 --如果沒有死鎖的進程,是否顯示正常進程信息,1 顯示,0 不顯示    as  春培賀  declare @count int,@s nvarchar(1000),@i int    select id=identity(int,1,1),標志,    進程ID=spid,線程ID=kpid,塊進程ID=blocked,資料庫ID=dbid,   
資料庫名=db_name(dbid),用戶ID=uid,用戶名=loginame,累計CPU時間=cpu,    登陸時間=login_time,打開事務數=open_tran, 進程狀態=status,    工作站名=hostname,應用程序名=program_name,工作站進程ID=hostprocess,    域名=nt_domain,網卡地址=net_address    into #t from(    select 標志='死鎖的進程',    spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,    status,hostname,program_name,hostprocess,nt_domain,net_address,   
s1=a.spid,s2=0    from mastersysprocesses a join (    select blocked from mastersysprocesses group by blocked    )b on a.spid=b.blocked where a.blocked=0    union all    select '|_犧中鋒牲品_>',    spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,    status,hostname,program_name,hostprocess,nt_domain,net_address,    s1=blocked,s2=1    from mastersysprocesses a where blocked<>0    )a order by s1,s2    select @count=@@rowcount,@i=1    if @count=0 and @show_spid_if_nolock=1    begin    insert #t    select 標志='正常的進程',    spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,    open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address    from mastersysprocesses    set @count=@@rowcount    end    if @count>0    begin    create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))    if @kill_lock_spid=1    begin    declare @spid varchar(10),@標志 varchar(10)    while @i<=@ count    begin    select @spid=進程ID,@標志=標志 from #t whereid=@ i    insert #t1 exec('dbcc inputbuffer(')')    if @標志='死鎖的進程' exec('kill'+@ spid)    set @i=@i+1    end    end    else    while @i<=@ count    begin    select @s='dbcc inputbuffer('+cast(進程ID as varchar)+')' from #t whereid=@ i    insert #t1 exec(@s)    set @i=@i+1    end    select a.*,進程的SQL語句=b.EventInfo    from #t a join #t1 b on a.id=b.id    end

4. 在sql資料庫中怎樣取消您自己的進程

查看坦畢鎖表進程SQL語句1:
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo,
dba_objects ao,
v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid;

查看鎖表激信寬進程SQL語句2:
select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;

殺掉鎖表進程:
如有記錄則表示有lock,記錄下SID和serial# ,將記錄的ID替明亮換下面的738,1429,即可解除LOCK
alter system kill session '738,1429';

5. 通過什麼指令殺死全部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

6. sql server 還原資料庫時提示資料庫正在使用,無法進行操作的解決方法

這個問題的原因在於有用戶連接了當前要做還原的資料庫,這里的用戶甚至包括當前要做還原的用戶。解決辦法就是關閉與要還原資料庫的所有連接。
腳本之家小編推薦的一個方法:到服務裡面重啟下sqlserver服務即可。
問題一描述:SQL
Server資料庫備份還原後,在資料庫名稱後會出現「受限制訪問」字樣
問題二描述:在對SQL
Server資料庫進行還原時,提示:System.Data.SqlClient.SqlError:因為資料庫正在使用,所以無法獲得對資料庫的獨占訪問權。(Microsoft.SqlServer.Smo)。出現此問題的原因是在還原資料庫時,有其他用戶正在使用資料庫。還原資料庫要求資料庫工作在單用戶模式。通常就是DBA在操作時,不允許其他用戶連接資料庫。
問題一解決辦法:
右鍵點擊資料庫
->
屬性
->
選項
->
狀態
->
限制訪問
->
選擇Multiple
->
確定。
問題二解決辦法:
方法一(最方便):右鍵點擊資料庫
->
屬性
->
選項
->
狀態
->
限制訪問
->
選擇Single->
確定。然後還原。
方法二(最直接):斷開資料庫連接
方法三(最暴力):注銷/重啟資料庫伺服器
方法四(最麻煩):寫代碼修改資料庫相關屬性,雖然麻煩,有的時候還是要用到,那就用到的時候再研究。
①先切換資料庫到master資料庫。執行語句
select
*
from
master..sysprocesses
where
dbid=db_id(
'資料庫名稱')
②然後逐步運行語句
exec
kill
spid(上一步結果集中的數據),
問題就解決了。哈哈
今天在還原資料庫的時候,提示"因為資料庫正在使用,所以無法獲得對資料庫的獨占訪問權",無論我是重啟資料庫,還是重啟計算機,都不能解決問題,多番嘗試後,終於解決了該問題。現將引發該問題的原因與解決方案寫出來,有不對的地方歡迎大家提出來。
引發原因:是因為我在還原資料庫的時候,還有其他的用戶正在使用資料庫,所以就會出現以上提示。
解決方法:
1,設置資料庫在單用戶模式下工作。
設置方法:在需要還原的資料庫上右擊,在右鍵菜單命令上選擇"屬性"-
>"選項"-
>"狀態"-
>"限制訪問"-
>"Single"。這是SQLSERVER2005的菜單命令,其它版本請自己查找。
2,利用SQL語句,殺死正在使用該資料庫的所有進程,自己以前在做一個SQL
SERVER操作小工具的時候有寫過該功能的SQL,貼出來供大家參考:
復制代碼
代碼如下:
declare
@dbname
varchar(50)
set
@dbname='資料庫名稱'
declare
@sql
varchar(50)
declare
cs_result
cursor
local
for
select
'kill
'+cast(spid
as
varchar(50))
from
sys.sysprocesses
where
db_name(dbid)=@dbname
open
cs_result
fetch
next
from
cs_result
into
@sql
while
@@fetch_status=0
begin

execute(@sql)

fetch
next
from
cs_result
into
@sql
end
close
cs_result
deallocate
cs_result
該SQL語句利用游標循環所有正在使用該資料庫的進程,並通過kill命令殺死進程。
3,利用SQL語句,斷開所有用戶鏈接,並回滾所有事務,具體SQL語句如下:
復制代碼
代碼如下:
ALTER
DATABASE
[資料庫名稱]
SET
OFFLINE
WITH
ROLLBACK
IMMEDIATE
注意:在使用方法2與3時,不要在需要的還原的資料庫下執行,建議在master資料庫下面執行。

7. SQL 進程死鎖

首先,需要把你的AutoCommit=TRUE,然後,這是一個編程習慣問題,在pb中,對於數據窗口的操作,首先設置數據窗口的提交方式,我一直

採用 key columns,use

update,然後記得在每次連接完成後,記得及時釋放,譬如,在retrieve完成後,記得及時利用resetupdate()清除數據狀態,然後,

再每次資料庫更新,也就是update()後,記得利用
ll_num1=.update()
if ll_num=1 then
commit;
dw_free.resetupdate( )
else
rollback;
messagebox("提示!","數據保存失敗! ")
end if

以上說法我不贊同:
1、首先AutoCommit=TRUE,以後執行delete,update,insert語句都相當執行了commit,如果是把幾個SQL語句當作是一個完整的事務,要不整

體成功提交,要不rollback,這就寫就不會得到正確的結果。
2、其次key columns,use update,要具體情況具體使用,這種形式的並發性最差,適合對數據的並發性要求不高的場合。
3、再次程序的死鎖原因是多方面的,上述兩個方面只是其中的原因罷了,具體情況具體分析,例如數據盡快提交、建立合理的索引、合理的SQ

L語句、避免交叉事務、對於數據量龐大的表,應及時轉移到歷史庫,我想可以很大程度上避免死鎖。
以上愚見,歡迎拍磚。

在MSSQL控制台中,管理-當前活動-鎖/進程ID看看是那幾個進程在死鎖,然後在進程信息中將這些死鎖的進程殺死/

對查詢進行優化

也建議檢查:外鍵建立索引,如果上索引,再調試下網路

對外鍵建索引可以緩解這個問題。

如在商品字典和銷售明細表中,銷售明細表中商品編號是外鍵,如果在銷售明細表的商品編號上沒有索引,update商品字典會造成銷售明細表

整表鎖表。

解決Sybase資料庫死鎖的方法

人民銀行吉林市中心支行科技處 劉志明

在聯機事務處理(OLTP)的資料庫應用系統中,多用戶、多任務的並發性是系統最重要的技術指標之一。為了提高並發性,目前大部分RDBMS都采

用加鎖技術。然而由於現實環境的復雜性,使用加鎖技術又不可避免地產生了死鎖問題。因此如何合理有效地使用加鎖技術,最小化死鎖是開

發聯機事務處理系統的關鍵。

死鎖產生的原因

在聯機事務處理系統中,造成死機主要有兩方面原因。一方面,由於多用戶、多任務的並發性和事務的完整性要求,當多個事務處理對多個資

源同時訪問時,若雙方已鎖定一部分資源但也都需要對方已鎖定的資源時,無法在有限的時間內完全獲得所需的資源,就會處於無限的等待狀

態,從而造成其對資源需求的死鎖。
另一方面,資料庫本身加鎖機制的實現方法不同,各資料庫系統也會產生其特殊的死鎖情況。如在Sybase SQL Server 11中,最小鎖為2K一頁

的加鎖方法,而非行級鎖。如果某張表的記錄數少且記錄的長度較短(即記錄密度高,如應用系統中的系統配置表或系統參數表就屬於此類表)

,被訪問的頻率高,就容易在該頁上產生死鎖。
幾種死鎖情況及解決方法
清算應用系統中,容易發生死鎖的幾種情況如下:
● 不同的存儲過程、觸發器、動態SQL語句段按照不同的順序同時訪問多張表;
● 在交換期間添加記錄頻繁的表,但在該表上使用了非群集索引(non-clustered);
● 表中的記錄少,且單條記錄較短,被訪問的頻率較高;
● 整張表被訪問的頻率高(如代碼對照表的查詢等)。
以上死鎖情況的對應處理方法如下:
● 在系統實現時應規定所有存儲過程、觸發器、動態SQL語句段中,對多張表的操作總是使用同一順序。如:有兩個存儲過程proc1、proc2,

都需要訪問三張表zltab、z2tab和z3tab,如果proc1按照zltab、z2tab和z3tab的順序進行訪問,那麼,proc2也應該按照以上順序訪問這三張

表。
● 對在交換期間添加記錄頻繁的表,使用群集索引(clustered),以減少多個用戶添加記錄到該表的最後一頁上,在表尾產生熱點,造成死鎖

。這類表多為往來賬的流水表,其特點是在交換期間需要在表尾追加大量的記錄,並且對已添加的記錄不做或較少做刪除操作。
● 對單張表中記錄數不太多,且在交換期間select或updata較頻繁的表可使用設置每頁最大行的辦法,減少數據在表中存放的密度,模擬行級

鎖,減少在該表上死鎖情況的發生。這類表多為信息繁雜且記錄條數少的表。
如:系統配置表或系統參數表。在定義該表時添加如下語句:
with max_rows_per_page=1
● 在存儲過程、觸發器、動態SQL語句段中,若對某些整張表select操作較頻繁,則可能在該表上與其他訪問該表的用戶產生死鎖。對於檢查

賬號是否存在,但被檢查的欄位在檢查期間不會被更新等非關鍵語句,可以採用在select命令中使用at isolation read uncommitted子句的方

法解決。該方法實際上降低了select語句對整張表的鎖級別,提高了其他用戶對該表操作的並發性。在系統高負荷運行時,該方法的效果尤為

顯著。
例如:
select*from titles at isolation read uncommitted
● 對流水號一類的順序數生成器欄位,可以先執行updata流水號欄位+1,然後再執行select獲取流水號的方法進行操作。
小結
筆者對同城清算系統進行壓力測試時,分別對採用上述優化方法和不採用優化方法的兩套系統進行測試。在其他條件相同的情況下,相同業務

筆數、相同時間內,死鎖發生的情況如下:
採用優化方法的系統: 0次/萬筆業務;
不採用優化方法的系統:50~200次/萬筆業務。
所以,使用上述優化方法後,特別是在系統高負荷運行時效果尤為顯著。總之,在設計、開發資料庫應用系統,尤其是OLTP系統時,應該根據

應用系統的具體情況,依據上述原則對系統分別優化,為開發一套高效、可靠的應用系統打下良好的基礎。

經驗:

1:前台問題:檢視代碼查看事物是否被提交或回滾。

2:後台問題:有時候由於處理的問題復雜度高。資料庫日誌空間已滿或不夠

導致事物未能提交。UNIX下的SYBAE就是典型的一例。解決辦法各資料庫廠商有更詳細的說明。

雖然我從9轉到10遇到了好多問題,也浪費了好幾天的時間,但到了現在,我真覺得10比9好。

10沒有了MSSQL專用介面,用的是OLEDB介面,用這個介面一定要注意一個問題是表死鎖的事!

網上講的連接方式都是天下一大抄。

用OLEDB要加上 SQLCA.Lock = "RC",

不然連查詢也會死鎖。

另個一個就是10寫的軟體不再亂碼了,我在繁體寫的軟體在簡體下運行不亂碼,反之也可以。

第三就是編譯速度明顯快很多。

第四就是編譯的時候有了XP樣式皮膚,感覺漂亮多了。

編程要是要養成好習慣,在sql語句insert和update之後,要及時commit,數據窗口update()後也要及時commit;

阻塞是因為多個進程對同一一個資源的訪問沖突,當一個進程排它訪問一個資源時(從進入事務到事務結束為止),當有其他進程需要訪問同

樣的資源時,即造成阻塞(根據鎖的級別和粒度設置);

在實際應用中阻塞可能因為事務沒有提交或者網路速度太慢或者大容量的數據查詢等都可能會造成阻塞。

阻塞可以通過sp_who 系統存儲過程進行查看,執行sp_who 後查看所有blk不等於

0的進程ID(SPID),直到找到SPID在blk列出現,但當前spid 的blk列 =0 即它就是阻塞的源頭。

最簡單的辦法可用 kill spid(源頭進程的SPID值),同時結合sp_lock過程可查看到當前進程的加鎖情況(如鎖的類型被鎖的對象)

最後最重要的是要根據 在查詢到源頭後,使用 DBCC INPUTBUFFER (spid)查看最後一次提交的內容,即可找到因為事務沒有提交造成的阻塞(

一般不能使用 AutoCommit=True,因為大部分MIS程序需要使用批提交,來保證數據的完成性)

http://www.51onnet.com/bbs/forumdisplay.php?f=6

你可能平時編程時沒有注意。在 SQLCA(Transaction)默認情況下 AutoCommit = false(不自動提交)。在同一事務中,如果不提交事務,

可以SELECT、Retrieve,但其它事務(其它計算機的應用程序連接資料庫的事務)就不能。所以導致死鎖,而在單機開發環境看不出來。
你需要在所有的 UPDATE、DELETE 的SQL語句後面,或者數據窗口的Update函數調用之後執行 COMMIT 或 ROLLBACK

死鎖可能存在的原因及解決辦法
一次偶然的機會在論壇上看到一個關於死鎖(其實是阻塞)的帖子,於是把自己的一個小東東拿出來和大家分享,想不到很多人都遇到過這個

問題。

其實解鎖並不是根本的解決辦法,感覺我自己有點誤導大家了,於是有了下面的內容,希望大家能根據自己的應用找出根源,而不是解鎖:

阻塞可能存在的原因及解決方法:

1、事務未提交

這是造成阻塞最常見的原因,因為PB默認是自動啟動事務的,如果你執行了 update,delete ,insert 語句,不執行Commit 則會出現阻塞(

不建議採用自動提交事務的方式,原因在上一帖中交代過),解決的辦法很簡單,查找到所有的修改數據命令(U、I、D)查看是否正常提交,找

到後加入Commit即可;

2、SQL SERVER 沒有正常安裝SP3

對於代碼正常的用戶,仍然出現阻塞,則需要檢查你機器的補丁,特別是WIN2003的機器不安裝補丁,1433都不能監聽;如果沒有安裝補丁

即可(我原來就是被這種情況害過)

3、當然可能你會告訴我,代碼也沒有問題,補丁也裝了,仍然出現可能就需要查看你的機器的CPU和內存的使用率(運行taskmgr),SQL

SERVER 的機器峰值狀態可能出現阻塞,解決的辦法就是出錢:升級伺服器;

4、復雜的查詢或者大容量查詢,比如在查詢中使用多個表的聯合查詢,或者使用 in ,not in 等語句,是非常耗時的,這種解決的辦法稍微復

雜點,需要根據你的應用修改SQL 語句,優化SQL 效率,關於SQL 優化是另外一個復雜的話題,本人也學習中...

能想起的好象就這些了,可能不是很完善,希望有人能補充!

你可能平時編程時沒有注意。在 SQLCA(Transaction)默認情況下 AutoCommit = false(不自動提交)。在同一事務中,如果不提交事務,

可以SELECT、Retrieve,但其它事務(其它計算機的應用程序連接資料庫的事務)就不能。所以導致死鎖,而在單機開發環境看不出來。
你需要在所有的 UPDATE、DELETE 的SQL語句後面,或者數據窗口的Update函數調用之後執行 COMMIT 或 ROLLBACK

補充一點,除了在執行了Update,Delete,Insert需要及時Commit外,在SQL Server中由於使用一個Tempdb的資料庫,這個資料庫是對所有用戶共享

的,當使用了統計類型的SQL函數如:sum,count等,SQL Server會自動使用Tempdb進行暫存統計數據,這樣很容易造成Tempdb被鎖住,所以在讀取了

一個很復雜Store Procere或創建過臨時表後應進行commit,以便釋放Tempdb資源,在retrieved事件中加commit是一個解決辦法,特別是在讀取

報表後更應加,一般報表的Store Procere都比較復雜,在程序中內嵌了SQL游標來讀取數據後也要加commit,我增經試過被鎖住,找了很久才知

熱點內容
安卓機投屏用什麼app 發布:2025-07-17 14:10:50 瀏覽:223
php在線培訓 發布:2025-07-17 13:50:07 瀏覽:349
廣播廣告的腳本 發布:2025-07-17 13:47:51 瀏覽:903
pythonid3 發布:2025-07-17 13:31:50 瀏覽:325
文件被加密如何破解 發布:2025-07-17 13:31:50 瀏覽:29
網路編程經驗 發布:2025-07-17 13:13:20 瀏覽:67
學編程小孩 發布:2025-07-17 13:13:16 瀏覽:997
關電源能釋放緩存嗎 發布:2025-07-17 13:07:14 瀏覽:932
哪個moba配置要求較低 發布:2025-07-17 13:05:34 瀏覽:800
scratch編程視頻教學 發布:2025-07-17 12:50:36 瀏覽:636