Sql Server
## 场景:上班后各地区门店反馈系统卡顿
## 排查:
- 发现是数据库等待数过多
- 排查晚上的作业,提示是数据库完整性检查导致了作业失败
- 检查维护计划-数据库备份,发现数据库备份并未产生日志,说明数据库备份并未能完成
- 综合以上初步判定是因为死锁导致等待数过多
## 解决:
- 查看当前正在运行的进程
- kill掉total_elapsed_time过长的是进程
下面是一些参考:
当 SQL Server 执行备份(如 `BACKUP DATABASE`)并进行完整性检查(例如使用 `WITH CHECKSUM` 或数据库本身启用了完整性检查)时,如果作业或命令**卡住不动**,可以按照以下步骤尝试取消或解决问题:
---
## 一、确认备份任务确实卡住
1. **查看当前正在运行的进程**
打开 **SQL Server Management Studio (SSMS)**,执行以下 T-SQL 查看当前活动会话:
```sql
SELECT
session_id,
status,
command,
start_time,
cpu_time,
total_elapsed_time,
wait_type,
wait_time,
wait_resource,
text AS [SQL文本]
FROM
sys.dm_exec_requests r
CROSS APPLY
sys.dm_exec_sql_text(r.sql_handle) t
WHERE
r.command IN ('BACKUP DATABASE', 'BACKUP LOG')
OR r.status = 'suspended'
ORDER BY
total_elapsed_time DESC;
```
- 重点关注 `command` 为 `BACKUP DATABASE` 或 `BACKUP LOG` 的会话。
- 查看 `total_elapsed_time`(已执行时间,单位毫秒),如果已经运行很久(比如超过预期时间的几倍),且状态为 `suspended` 或长时间无进展,很可能卡住了。
2. **查看阻塞情况(如果有)**
如果该备份任务被其他会话阻塞,也可以查看 `blocking_session_id`,找到阻塞源。
---
## 二、取消卡住的备份任务
如果确认备份任务已经卡住,无法正常完成,可以**手动终止该会话**:
### 方法 1:通过 SSMS 图形界面
1. 在 SSMS 的「对象资源管理器」中,展开「活动监视器」(Activity Monitor):
- 右键点击你的 SQL Server 实例 → 选择「活动监视器」
2. 在「进程」页签中,查找:
- `Command` 为 `BACKUP DATABASE` 或 `BACKUP LOG`
- 状态可能显示为「挂起(suspended)」、「正在运行(running)」但长时间无变化
3. 右键点击该进程,选择「终止进程」(Kill Process)
---
### 方法 2:通过 T-SQL 终止会话(推荐)
找到卡住的会话 ID(比如 `session_id = 56`),然后执行:
```sql
KILL 56; -- 将 56 替换为实际的 session_id
```
⚠️ **注意:**
- 终止备份会话后,当前的备份操作会被**中断,备份文件可能不完整**,**不能用于恢复**。
- 如果备份目标是重要生产库,建议在非高峰期操作,并提前通知相关人员。
---
## 三、预防与优化建议
### 1. 避免在业务高峰期做大备份 + 完整性检查
- 大数据库的 `BACKUP DATABASE ... WITH CHECKSUM` 或配合 DBCC CHECKDB 可能耗时极长,容易受 IO、CPU、锁等影响卡住。
- 如果是为了检查数据完整性,建议**将备份和完整性检查分开执行**:
- 先做常规备份;
- 再另外找合适时间执行 `DBCC CHECKDB('数据库名')` 检查数据一致性。
### 2. 监控备份性能
- 检查磁盘 IO、SQL Server 日志、备份目标磁盘是否慢(比如网络盘、慢速存储)。
- 使用 `WITH COMPRESSION` 可减小备份大小,提高速度(但会增加 CPU 负载)。
### 3. 使用日志记录与超时机制(自动化任务中)
如果是通过 SQL Agent 作业执行备份,可以为作业设置**超时时间**,或通过脚本捕捉长时间无响应的任务进行报警或自动终止。
---
## 四、如果备份已经卡死很久,但 KILL 也无效?
极少数情况下,`KILL` 命令可能因为死锁、内部资源占用、SQL Server 自身状态问题无法立即生效。此时可以:
1. **稍等几分钟再试 KILL**;
2. 如果仍无效,考虑重启 **SQL Server 服务**(作为最后手段):
- 通过「服务管理器」找到 `SQL Server (MSSQLSERVER)` 服务 → 重启
- ⚠️ 重启会导致所有连接中断,未提交事务回滚,可能短暂影响业务,请选在维护窗口操作。
---
## 总结:如何取消卡住的 SQL Server 备份任务
| 步骤 | 操作内容 |
|------|----------|
| 1 | 确认备份任务是否真的卡住(查看 `sys.dm_exec_requests`,观察命令、时间、状态) |
| 2 | 找到对应的 `session_id` |
| 3 | 使用 `KILL ` 命令终止该会话(或在 SSMS 活动监视器中手动终止) |
| 4 | 备份被中断后,生成的备份文件可能不完整,不可用于恢复,需重新备份 |
| 5 | 为避免再次卡住,建议将大备份与 DBCC 检查分开执行,优化备份策略与存储 IO |
---