SQL Server扩充表字段长度,引发的意外KILLED/ROLLBACK
这一段时间,因为系统升级,新系统产生的数据长度,比原来的数据长度要长,所以说要扩充一下字段长度。
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 '' --指定process_id;

两种方法查询出来的都是KILLED/ROLLBACK,表示,现在数据在回滚。
③查询一下,数据的回滚状态。
KILL 75 WITH STATUSONLY;

查了一下,这个情况要等好久,有的等两三天的都有,最好的解决办法无非是重启。
----------------------------------------------------解决办法------------------------------------------------
网上找了好久,找了找到了一篇结决办法。
1.查询出处于阻塞的sql线程。
SET
TRANSACTION
ISOLATION
LEVEL
READ
UNCOMMITTED SELECT db_id(DB_NAME(er.[database_id])) [DBID] ,er.[session_id] AS [SessionID] ,er.[command] AS [CommandType] ,est.[text] [StatementText] ,er.[status] AS [Status] ,CONVERT(DECIMAL(5, 2), er.[percent_complete]) AS [Complete_Percent] ,CONVERT(DECIMAL(38, 2), er.[total_elapsed_time] / 60000.00) AS [ElapsedTime_m] ,CONVERT(DECIMAL(38, 2), er.[estimated_completion_time] / 60000.00) AS [EstimatedCompletionTime_m] ,er.[last_wait_type] [LastWait] ,er.[wait_resource] [CurrentWait] FROM
sys.dm_exec_requests
AS er INNER
JOIN
sys.dm_exec_sessions
AS es ON er.[session_id] = es.[session_id] CROSS
APPLY sys.dm_exec_sql_text(er.[sql_handle]) est WHERE er.[command] like
'Killed%'
附:查询出正在执行的语句
SELECT spid,
blocked,
DB_NAME(sp.dbid) AS DBName,
program_name,
waitresource,
lastwaittype,
sp.loginame,
sp.hostname,
a.[Text] AS [TextData],
SUBSTRING(A.text, sp.stmt_start / 2,
(CASE WHEN sp.stmt_end = -1 THEN DATALENGTH(A.text) ELSE sp.stmt_end
END - sp.stmt_start) / 2) AS [current_cmd]
FROM sys.sysprocesses AS sp OUTER APPLY sys.dm_exec_sql_text (sp.sql_handle) AS A
WHERE spid > 50
ORDER BY blocked DESC, DB_NAME(sp.dbid) ASC, a.[text];
2.查到spid是75,根据spid查询出来系统进程hostprocess为20540。
select spid, blocked,waittime,lastwaittype,dbid,last_batch,open_tran,hostprocess,cmd from sysprocesses where spid = 69

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状态情形浅析
3.百度 谷歌 新浪 执行 SQL 出现 Lock request time out period exceeded.
---------------------------------------------------------------------
历史消耗
SELECT TOP 20
total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数],
qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],
last_execution_time AS [最后一次执行时间],max_worker_time /1000 AS [最大执行时间(ms)],
SUBSTRING(qt.text,qs.statement_start_offset/2+1,
(CASE WHEN qs.statement_end_offset = -1
THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1)
AS [使用CPU的语法], qt.text [完整语法],
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
FROM sys.dm_exec_query_stats qs WITH(nolock)
CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE execution_count>1
ORDER BY total_worker_time DESC

SQL Server扩充表字段长度,引发的意外KILLED/ROLLBACK的更多相关文章
- 扩充表字段长度,引发的意外KILLED/ROLLBACK
这一段时间,因为系统升级,新系统产生的数据长度,比原来的数据长度要长,所以说要扩充一下字段长度. ) --修改字段长度sql 在执行的时候,有这样一个情况. 例如Student表的Name字段长度是n ...
- SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析[转]
本文将为您描述SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析,教程操作方法: 今天遇到一个很奇怪的情况,发现一个会话异常,这个会话只是在执行一个简单的存储过 ...
- SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析
今天遇到一个很奇怪的情况,发现一个会话异常,这个会话只是在执行一个简单的存储过程,里面使用了链接服务器(Linked Server)查询另外一台服务器数据(存储过程里面没有任何显性事务.UPDATE. ...
- 解决DB2事物日志满、扩充表字段长度和表空间的命令
解决DB2事物日志满.扩充表字段长度和表空间的命令 转:http://blog.sina.com.cn/s/blog_4c0137d10100bb5r.html 一.通常我们在使用db2导入数据或进行 ...
- SQL Server 隐式转换引发的躺枪死锁-程序员需知
在SQL Server的应用开发过程(尤其是二次开发)中可能由于开发人员对表的结构不够了解,造成开发过程中使用了不合理的方式造成数据库引擎未按预定执行,以致影响业务.这是非常值得注意的.这次为大家介绍 ...
- SQL Server 隐式转换引发的死锁
在SQL Server的应用开发过程(尤其是二次开发)中可能由于开发人员对表的结构不够了解,造成开发过程中使用了不合理的方式造成数据库引擎未按预定执行,以致影响业务.这是非常值得注意的.这次为大家介绍 ...
- SQL Server锁分区特性引发死锁解析
锁分区技术使得SQL Server可以更好地应对并发情形,但也有可能带来负面影响,这里通过实例为大家介绍,分析由于锁分区造成的死锁情形. 前段时间园友@JentleWang在我的博客锁分区提升并发,以 ...
- sql server 删除表字段和字段的约束
删除数据库表中的字段时,使用了 :alter table 表名 drop column 列名 服务器返回的错误为:Server: Msg 5074, Level 16, State 1, Line 1 ...
- SQL Server 联表字段合并查询
经常遇到统计报表中,子表记录合并为一个字段的情况.例如:省表中各省经济水平前五的城市统计. 有如下两表:dbo.省 和 dbo.市 (好吧,你可能会吐槽为什么用中文表名,其实我是为了方便查找替换) 这 ...
随机推荐
- 基于python的快速傅里叶变换FFT(二)
基于python的快速傅里叶变换FFT(二)本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换. 知识点 FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算法. ...
- EasyUI tabs指定要显示的tab
<div id="DivBox" class="easyui-tabs" style="width: 100%; height: 100%;& ...
- Http实现文件下载
HttpServlet实现下载文件,重要的设置header,否则浏览器无法解析为下载. Header示例: 1:response.setContentType("application/pd ...
- linux 报错Mysql.pid 文件不存在导致service Mysqld start 失败
Mysql.pid 文件不存在导致service Mysqld start 失败 1. 到提示报错的mysql.pid 不存在的目录下 使用 touch 命令创建mysql.pid文件. t ...
- Arduino IDE for ESP8266 项目(3)创建AP+STA
官网API:http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html STA (客户端)手机连接路由器 S1 *简 ...
- metamask源码学习-controller-transaction
()metamask-extension/app/scripts/controllers/transactions Transaction Controller is an aggregate of ...
- 【一】mongodb安装及配置
一.mongodb安装 1.下载并解压 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.0.tgz tar ...
- nat表使用
Net Address Translation 网络地址转换 IP地址 私网IP:nat技术将私网IP转换公网IP 公网IP: iptables nat表:三条链 主要用PREROUTING,POST ...
- NSTimer深入理解
NSTimer,即计时器,用于定时执行一些任务,一次或者多次. 系统Foundation框架提供的最常用方法如下,创建一个NSTimer,并将它放到当前runloop的default mode中. + ...
- 【Codeforces Round 1120】Technocup 2019 Final Round (Div. 1)
Codeforces Round 1120 这场比赛做了\(A\).\(C\)两题,排名\(73\). \(A\)题其实过的有点莫名其妙...就是我感觉好像能找到一个反例(现在发现我的算法是对的... ...