溪客(编程代码) 溪客(编程代码)

  • 今天是2026年01月19日 Monday
  • 首页
  • 知识
  • 网址
  • AI助手

Sql Server

首页 / 知识 / Sql Server
  • 基础
    • 开始使用
    • 查询-优化
    • 系统语言
    • 临时表
    • 存储过程-参数
    • 分页
    • cross apply和outer apply
    • 去除空格
  • 日期
    • 查询-日期
    • 函数-DateName
    • 函数-DatePart
    • 函数-Convert-日期
  • 工具
    • 搜索存储过程或作业关键字
    • 获取存储过程执行次数
    • 获取连接的客户端IP等信息
    • 搜索某个表所有字段
  • 自定义函数
    • SplitString
    • 计算距离
    • GetPinYin
  • 经验
    • 存储过程-c#-执行慢
    • 抛出异常RAISERROR
    • RECOMPILE
    • 转换数据类型失败
    • 死锁导致的数据库卡顿
## 场景:上班后各地区门店反馈系统卡顿 ## 排查: - 发现是数据库等待数过多 - 排查晚上的作业,提示是数据库完整性检查导致了作业失败 - 检查维护计划-数据库备份,发现数据库备份并未产生日志,说明数据库备份并未能完成 - 综合以上初步判定是因为死锁导致等待数过多 ## 解决: - 查看当前正在运行的进程 - 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 | ---
© 2022 - 溪客(编程代码) - 粤ICP备10217501号 Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)