不清楚表是什么原因造成不能的。
sql server表被鎖,無法表重命名,不能修改表結構,也無法洗掉,修改時報錯
“出現超時時間已到,在操作完成之前超時間已過或服務器未回應”
查了網上的解決辦法可能被鎖時,發現確實表被鎖了,就執行了“kill 行程號”后
解鎖時報錯
“正在進行事務回滾。估計回滾已完成: 0%。估計剩余時間: 0 秒”
執行drop table時,一直執行無法完成。
表的資料量非常小,不存在資料量大造成的阻塞問題
因為設計的資料庫很重要,不能重啟服務器,所以請教有沒有其他的辦法呀?
uj5u.com熱心網友回復:
declare @spid int
Set @spid = 74 --鎖表行程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)
如果這個陳述句解鎖不了,表還是被占用,不重啟mssql,只有一個辦法等。這明顯行程阻塞了
uj5u.com熱心網友回復:
打開SQL Server Management Studio, 新建2個查詢連接,連接1執行以下SQL:
select @@spid --> 記下本行程的SPID值
drop table [表名]
然后, 連接2執行以下SQL:
-- 查看阻塞連接1的源頭行程之SPID
select blocked
from sys.sysprocesses
where spid=[連接1的SPID值]
kill [blocked的值]
uj5u.com熱心網友回復:
小表不一定就不阻塞,如果它在一個大事務中,鎖住是很正常的事情。先創建這個存盤程序,然后在服務器上執行一下。
IF OBJECT_ID('[Proc_DBA_BlockingWarning]') IS NOT NULL
DROP PROC [Proc_DBA_BlockingWarning]
GO
-- =============================================
-- Author: yenange
-- Create date: 2014-11-18
-- Description: 阻塞預警
-- =============================================
CREATE PROCEDURE [dbo].[Proc_DBA_BlockingWarning]
@BlockingWarning INT = 100 --被阻塞的會話數大于@BlockingWarning就預警
AS
BEGIN
SET NOCOUNT ON
--1. 定義表變數,并將阻塞和被阻塞的資料放入表變數
DECLARE @t TABLE (
SPID SMALLINT,
DBName NVARCHAR(128),
Remark NCHAR(3),
[ProgramName] nchar(128),
[LoginName] nchar(128),
HostName nchar(128),
[Status] nchar(30),
BlockedBy SMALLINT,
LoginTime DATETIME,
QUERY nvarchar(max)
)
INSERT INTO @t (
SPID,
DBName,
Remark,
[ProgramName],
[LoginName],
HostName,
[Status],
BlockedBy,
LoginTime,
QUERY
)
SELECT
SPID=p.spid,
DBName = convert(VARCHAR(20),d.name),
Remark = CASE WHEN p.blocked>0 THEN '被阻塞' else '阻塞源' end,
ProgramName = program_name,
LoginName = convert(CHAR(20),l.name),
HostName = convert(CHAR(20),hostname),
Status = p.status,
BlockedBy = p.blocked,
LoginTime = login_time,
QUERY = TEXT
FROM MASTER.dbo.sysprocesses p
LEFT JOIN MASTER.dbo.sysdatabases d
ON p.dbid = d.dbid
LEFT JOIN MASTER.dbo.syslogins l
ON p.sid = l.sid
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE (p.blocked = 0
AND EXISTS (SELECT 1
FROM MASTER.dbo.sysprocesses p1
WHERE p1.blocked = p.spid))
OR (p.blocked>0)
--2. 如果被阻塞的數量大于設定引數,則
DECLARE @Warning INT
IF (SELECT COUNT(1) FROM @t WHERE BlockedBy>0)>=@BlockingWarning
BEGIN
SET @Warning = 1
END
ELSE
BEGIN
SET @Warning = 0
END
SELECT @Warning AS Warning,
SPID,
DBName,
Remark,
[ProgramName],
[LoginName],
HostName,
[Status],
BlockedBy,
LoginTime,
QUERY
FROM @t
SET NOCOUNT OFF
END
GO
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/281875.html
標籤:疑難問題
