【問題原因】
重新整理當前活動將呼叫
sp_msset_current_activity
儲存過程。在定義該儲存過程時,首先將
lock_timeout
變數設定為
5000 毫秒(
ms)。然後,會建立兩個全域性臨時表,它們針對下面的系統表在表級別發出
ix 鎖,在鍵級別發出
x 鎖:
tempdb..sysobjects
tempdb..sysindexes
tempdb..syscolumns
如果在5000 毫秒(
ms)內未將前面的鎖授予該程序,則查詢將停止,並出現「症狀
」一節中顯示的錯誤資訊。
再重新整理一次通常會成功。但是,如果保持這兩個鎖的時間太長,則也會顯示該錯誤資訊。如果執行
sp_lock
儲存過程,則可計算出哪個程序正在對
dbid 2 (tempdb)
的物件id 1
、和3
保持鎖定。
詳細見:
【解決方法】
1.檢視鎖資訊
create
table
#t(req_spid
int,obj_name
sysname
)declare
@snvarchar
(4000)
,@rid
int,@dbname
sysname
,@id
int,@objname
sysname
declare
tbcursor
forselect
distinct
req_spid,dbname=
db_name
(rsc_dbid),rsc_objid
from
master..syslockinfo
where
rsc_type
in(4,5)
open
tbfetch
next
from
tbinto
@rid,@dbname,@id
while
@@fetch_status
=0begin
set@s=
'select@objname=namefrom['
+@dbname+
']..sysobjects whereid=@id'
exec
sp_executesql
@s,n'@objnamesysnameout,@idint'
,@objnameout,@id
insert
into
#tvalues
(@rid,@objname)
fetch
next
from
tbinto
@rid,@dbname,@id
endclose
tbdeallocate
tb select
程序id=a.req_spid
,資料庫
=db_name
(rsc_dbid),型別
=case
rsc_type
when
1then
'null
資源(未使用)
'when
2then
'資料庫
'when
3then'檔案
'when
4then'索引
'when
5then'表
'when
6then'頁
'when
7then'鍵
'when
8then
'擴充套件盤區
'when
9then
'rid
(行id)'
when
10then
'應用程式
'end,物件
id=rsc_objid
,物件名
=b.obj_name
,rsc_indid
from
master..syslockinfoa
left
join#tb
ona.req_spid=b.req_spid
godrop
table
#t2.殺掉相應資料庫的程序
create
proc sp_killallprocessindb
@dbname varchar
(100)
asif
db_id
(@dbname)
=null
begin
'database dose not exist'
endelse
begin
declare
@spid varchar
(30)
declare
tmpcursor cursor
forselect
'kill '
+convert
(varchar
, spid)
as spid
from
master..sysprocesses
where
db_name
(dbid)
= @dbname
andspid <>
@@spid
anddbid <> 0
open
tmpcursor
fetch
next from tmpcursor
into
@spid
while
@@fetch_status
= 0begin
exec
(@spid)
fetch
next from tmpcursor
into
@spid
endclose
tmpcursor
deallocate
tmpcursor
endgo
--to execute
exec
dbo.sp_killallprocessindb 'dbname'
然後就可以重新整理資料庫的表與儲存過程了。
[注]:該方法也適用於資料庫強制還原
3.sp_lock
錯誤 1222 已超過了鎖請求超時時段
問題原因 重新整理當前活動將呼叫 sp msset current activity 儲存過程。在定義該儲存過程時,首先將 lock timeout 變數設定為 5000 毫秒 ms 然後,會建立兩個全域性臨時表,它們針對下面的系統表在表級別發出 ix 鎖,在鍵級別發出 x 鎖 tempdb.sys...
異常 1222 已超過了鎖請求超時時段
1.解釋 應該是你的表體積很大,處理的時候費事,因為幾乎所有資料庫操作都需要加或多或少的鎖,所以會超時。首先你可以使用select from sys.sysprocesses where blocked 0查查有哪些程序阻塞了。然後拿spid,執行dbcc inputbuffer spid 來檢查是...
已超過了鎖請求超時時段的原因
應該是你的表體積很大,處理的時候費事,因為幾乎所有資料庫操作都需要加或多或少的鎖,所以會超時。首先你可以使用select from sys.sysprocesses where blocked 0查查有哪些程序阻塞了。然後拿spid,執行dbcc inputbuffer spid 來檢查是什麼語句造...