这一段时间,因为系统升级,新系统产生的数据长度,比原来的数据长度要长,所以说要扩充一下字段长度.
alter table TableName alter column ColumnName varchar(50)--修改字段长度sql
在执行的时候,有这样一个情况.
例如 Student 表的 Name 字段长度是 nvarchar(50),
假如想变成 nvarchar(100),这种情况,立刻能执行成功.
假如想变成 nvarchar(20),这种情况,会执行很久.
有一些表没啥问题,但是有一个表数据量较大,差不多有 1 亿多,执行时间太长,还把所有数据表给锁住了(如下图).不过这种情况数据还能用语句查询.
①我就查询出这个语句的 spid.之后 kill 掉.
SELECT session_id, r.status, r.start_time, r.command, s.text, r.wait_time, r.cpu_time,
r.total_elapsed_time, r.reads, r.writes, r.logical_reads, r.transaction_isolation_level
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s
WHERE R.STATUS='running'
kill 75
②但是连续 kill 了好几遍,依然没啥效果,还是提示锁住.所有就继续看下 spid 为 75 的状态.
方法 1:
select spid, blocked,waittime,lastwaittype,dbid,last_batch,open_tran,hostprocess,cmd from sysprocesses where spid = 75
方法 2:
USE master;
GO
EXEC sp_who '75' --指定process_id;两种方法查询出来的都是 KILLED/ROLLBACK, 表示,现在数据在回滚.
③查询一下,数据的回滚状态.
KILL 75 WITH STATUSONLY;
查了一下,这个情况要等好久,有的等两三天的都有,最好的解决办法无非是重启.
---------------------------------------------------- 解决办法 ------------------------------------------------
网上找了好久,找了找到了一篇结决办法.
1. 查询出处于阻塞的 sql 线程.
View Code
2. 查到 spid 是 75,根据 spid 查询出来系统进程 hostprocess 为 20540.
View Code
3. 在执行这条语句的机器上,用 cmd 命令查询出来.
tasklist|findstr 进程号
如:tasklist|findstr 75
4.cmd 中根据进程名称杀死进程
taskkill /f /t /im 进程名称
如:taskkill /f /t /im /svchost.exe
如果不行,只有等,或者重启了.
参考文章:1. SQL Server 会话 KILL 不掉,一直处于 KILLED /ROLLBACK 状态情形浅析
2. 数据库某个进程一直处在 KILLED/ROLLBACK
3. 百度 谷歌 新浪 执行 SQL 出现 Lock request time out period exceeded.
来源: https://www.cnblogs.com/sdadx/p/8269241.html