SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案

在这里插入图片描述

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,获得2024年博客之星荣誉证书,高级开发工程师,数学专业,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用,熟悉DICOM医学影像及DICOM协议,业余时间自学JavaScript,Vue,qt,python等,具备多种混合语言开发能力。撰写博客分享知识,致力于帮助编程爱好者共同进步。欢迎关注、交流及合作,提供技术支持与解决方案。
技术合作请加本人wx(注明来自csdn):xt20160813

SQL Server数据库操作超时问题解决方案文档

版本:1.2 | 适用环境:C# + SQL Server | 最后更新:2025年4月


一、问题概述

在长期运行的C#程序中,SQL Server数据库操作(如INSERT)频繁出现以下错误:

System.Data.SqlClient.SqlException (0x80131904): 执行超时已过期。完成操作之前已超时或服务器未响应。

此问题通常由性能瓶颈、资源争用或配置不当引发,需结合数据库、代码、架构三方面进行综合优化。

若您的程序在数据库操作时频繁报以下异常: *System.Data.SqlClient.SqlException (0x80131904): 执行超时已过期。完成操作之前已超时或服务器未响应。* 建议优先检查数据库表空间和日志是否已满,可根据下面日志空间已满的处理办法进行解决。


二、快速诊断流程

1. 初步检查(5分钟内完成)

检查项验证命令/方法健康标准
数据库文件空间SELECT * FROM sys.database_files剩余空间 > 20%
活动阻塞EXEC sp_who2BlockedBy = NULL
服务器资源任务管理器 → 性能页签CPU < 80%, 内存 < 90%
网络延迟ping <SQL Server IP>平均延迟 < 50ms

2. 深度诊断工具

2.1 执行计划分析
// 在C#代码中捕获实际执行计划
var cmd = new SqlCommand("INSERT ...");
var reader = cmd.ExecuteReader();
var plan = reader.GetSchemaTable();  // 获取执行计划元数据
2.2 等待类型统计
SELECT wait_type, waiting_tasks_count, wait_time_ms/1000 AS wait_sec
FROM sys.dm_os_wait_stats 
WHERE wait_type IN ('LCK_M_X', 'PAGEIOLATCH_SH', 'WRITELOG')
ORDER BY wait_time_ms DESC;

关键等待类型说明

  • LCK_M_X:排他锁争用
  • PAGEIOLATCH_SH:磁盘I/O瓶颈
  • WRITELOG:日志写入延迟

3. 检查数据库表空间和日志是否已满

在数据库执行如下sql进行查询:

SELECT name AS [FileName],type_desc AS [FileType],size * 8 / 1024.0 AS [TotalSize(MB)],  -- 文件总大小FILEPROPERTY(name, 'SpaceUsed') * 8 / 1024.0 AS [UsedSpace(MB)],  -- 已用空间(size - FILEPROPERTY(name, 'SpaceUsed')) * 8 / 1024.0 AS [FreeSpace(MB)],  -- 剩余空间growth * 8 / 1024.0 AS [AutoGrowthSize(MB)],  -- 自动增长量CASE is_percent_growth WHEN 1 THEN CONVERT(VARCHAR, growth) + '%' ELSE CONVERT(VARCHAR, growth * 8 / 1024) + ' MB' END AS [GrowthType]
FROM sys.database_files;

输出如下:
在这里插入图片描述
如上图所示,若FreeSpace(MB)为0或剩余过小,即空间已满或不足,就需要进行日志的清理或收缩。


三、核心解决方案

1. 代码级优化

1.1 批量操作(吞吐量提升5-10倍)
using (var bulkCopy = new SqlBulkCopy(connection)) 
{bulkCopy.BatchSize = 5000;       // 每批5000行bulkCopy.BulkCopyTimeout = 600;  // 10分钟超时bulkCopy.DestinationTableName = "Orders";// 列映射(避免类型转换开销)bulkCopy.ColumnMappings.Add("OrderID", "OrderID");bulkCopy.ColumnMappings.Add("Amount", "TotalAmount");// 数据准备var dataTable = new DataTable();// ...填充数据...bulkCopy.WriteToServer(dataTable);
}
1.2 异步操作(避免线程阻塞)
public async Task InsertDataAsync(Order order) 
{using (var conn = new SqlConnection(_connString)){await conn.OpenAsync();var cmd = new SqlCommand("INSERT INTO Orders...", conn);cmd.Parameters.AddWithValue("@OrderID", order.Id);await cmd.ExecuteNonQueryAsync();}
}

2. 数据库优化

2.1 索引策略
-- 创建筛选索引(减少索引维护开销)
CREATE NONCLUSTERED INDEX IX_Orders_Recent
ON Orders (OrderDate)
INCLUDE (CustomerID, TotalAmount)
WHERE OrderDate > DATEADD(YEAR, -1, GETDATE());-- 索引碎片重整(每周维护)
ALTER INDEX ALL ON Orders REBUILD WITH (ONLINE = ON);
2.2 分区方案(适用于TB级表)
-- 按时间分区(每年一个文件组)
CREATE PARTITION FUNCTION pf_OrderDate (DATETIME)
AS RANGE RIGHT FOR VALUES ('20200101', '20210101', '20220101');-- 分区切换归档
ALTER TABLE Orders SWITCH PARTITION 3 TO ArchivedOrders PARTITION 1;

3. 配置调整

3.1 连接池优化(app.config)
<system.data><sqlClientSettings><pooling maxPoolSize="200" minPoolSize="20" connectionLifetime="300" connectionReset="true"/></sqlClientSettings>
</system.data>
3.2 超时动态配置
// 根据操作类型设置差异超时
public class TimeoutConfig 
{public int InsertTimeout { get; set; } = 180;  // 3分钟public int QueryTimeout { get; set; } = 30;    // 30秒
}

四、高级场景处理

1. 日志文件暴增应急

-- 三步释放日志空间
ALTER DATABASE CurrentDB SET RECOVERY SIMPLE;
DBCC SHRINKFILE (N'CurrentDB_Log', 1024);  -- 收缩到1GB
ALTER DATABASE CurrentDB SET RECOVERY FULL;

2. 锁争用解决方案

-- 启用行版本隔离(消除读锁)
ALTER DATABASE CurrentDB SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE CurrentDB SET READ_COMMITTED_SNAPSHOT ON;

3.日志空间已满的处理办法

3.1 第一种解决方案:

在数据库上点击右键 → 选择 属性 → 选择 文件,然后增加数据库日志文件的文件大小。

在这里插入图片描述

3.2 第二种解决方案

手动收缩日志文件。在数据库上点击右键 → 选择 属性 → 选择 选项,把模式改为简单
在这里插入图片描述

在这里插入图片描述

收缩完了,要把模式改回完整,这样数据库才好继续记录日志
在这里插入图片描述


五、长期维护体系

1. 自动化监控

# 每日健康检查脚本
$checks = @{"SpaceUsage"  = "EXEC sp_spaceused""OpenTrans"   = "DBCC OPENTRAN""IndexHealth" = "SELECT * FROM sys.dm_db_index_physical_stats"
}$results = foreach ($key in $checks.Keys) {Invoke-SqlCmd -Query $checks[$key] -ServerInstance "YourServer"
}
$results | Export-Csv -Path "D:\DBA\HealthCheck_$(Get-Date -Format yyyyMMdd).csv"

2. 智能预警规则

指标阈值响应动作
平均查询时长> 5秒触发执行计划分析
死锁次数/小时> 3启动锁监控会话
日志增长速率> 1GB/小时发送紧急邮件通知

六、验证与回退

  1. 压力测试

    ostress.exe -S"YourServer" -d"YourDB" -Q"EXEC InsertTestProc" -n50 -r1000 -q
    
  2. 回退方案

    • 立即回退:重启应用服务,启用备用连接池
    • 数据回滚:从temporal table恢复数据
    SELECT * FROM Orders 
    FOR SYSTEM_TIME BETWEEN '2023-01-01' AND '2023-01-02';
    

附录

  • SQL Server官方调优指南
  • .NET数据库访问最佳实践

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/12.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++数据排序( 附源码 )

一.冒泡排序 原理:自左向右依次遍历,若相邻两数顺序错误,则交换两数. 这样,每一轮结束后,最大/最小的数就会到最后. Code: #include <iostream> #include <cstdio> using namespace std; const int N1e51; int n,a[N],in; void PrintArray(int a[],int n){for…

MTK-GMS版本国内WIFI受限问题

MTK-GMS版本国内WIFI受限问题解决 文章目录 问题参考资料解决方案方案一 修改配置坑点 方案二 直接修改属性 问题 最近负责ROOM 产品&#xff0c;出现WIFI受限显示&#xff0c;但是网络是通畅的。 GMS 版本&#xff0c;在国外或者国内翻墙网络不会出现WIFI受限显示问题&#…

34、web前端开发之JavaScript(三)

十. DOM操作详解 1、DOM简介 文档对象模型&#xff08;DOM&#xff0c;Document Object Model&#xff09;是JavaScript与网页内容交互的接口。它将HTML文档表示为一种树状结构&#xff08;DOM树&#xff09;&#xff0c;其中每个节点代表文档的一部分&#xff08;例如元素、…

【HCIA】静态综合实验练习笔记

实验拓扑图如下&#xff1a; 实验配置思路如下&#xff1a; 1、网段划分、配置IP地址 2、配置DHCP&#xff0c;使客户端获得ip地址 3、配置静态明细路由&#xff0c;内网全网通 4、配置空接口防环 5、配置优先级&#xff0c;实现选路最佳 6、配置缺省路由&#xff0c;实现公网通…

maven引入项目内本地包方法

最近在写java实现excel转pdf功能&#xff1b; 网上有个包很好用&#xff0c;免费&#xff1a;spire.xls.free-5.3.0.jar。 但是maven打包项目时报错&#xff0c;找不到这个包。 jar包位置如下&#xff1a; 在项目/src/jar/spire.xls.free-5.3.0.jar。 解决方法&#xff1a…

ansible-playbook 写arm版达梦7数据库的一键安装脚本

达梦官方提供镜像目前是dm8_x86 版本&#xff0c;因为众所周知的国产化方面的需求&#xff0c;需要在kylin v10机器上部署一个DM数据库以及其他使用数据库的服务&#xff0c;为了更便捷的交付需要把安装步骤都写入到ansible 脚本里&#xff0c;这里就单说下DM 的部署 DM7 数据库…

网络:华为数通HCIA学习:静态路由基础

文章目录 前言静态路由基础静态路由应用场景 静态路由配置静态路由在串行网络的配置静态路由在以太网中的配置 负载分担配置验证 路由备份&#xff08;浮动静态路由&#xff09;配置验证 缺省路由配置验证 总结 华为HCIA 基础实验&#xff0d;静态路由 & eNSP静态路由 基础…

无人机等非合作目标公开数据集2025.4.3

一.无人机遥感数据概述 1.1 定义与特点 在遥感技术的不断发展中&#xff0c;无人机遥感数据作为一种新兴的数据源&#xff0c;正逐渐崭露头角。它是通过无人驾驶飞行器&#xff08;UAV&#xff09;搭载各种传感器获取的地理空间信息&#xff0c;具有 覆盖范围大、综合精度高、…

详细介绍一下C++中的extern关键字

在C中&#xff0c;extern 是一个用于声明变量或函数具有外部链接性的关键字&#xff0c;它告诉编译器该符号的定义存在于其他文件&#xff08;或作用域&#xff09;中&#xff0c;当前文件仅需引用它。extern 常用于多文件编程和跨模块协作&#xff0c;以下是其详细说明&#x…

英语口语 -- 常用 1368 词汇

英语口语 -- 常用 1368 词汇 介绍常用单词List1 &#xff08;96 个&#xff09;时间类气候类自然类植物类动物类昆虫类其他生物地点类 List2 &#xff08;95 个&#xff09;机构类声音类食品类餐饮类蔬菜类水果类食材类饮料类营养类疾病类房屋类家具类服装类首饰类化妆品类 Lis…

中级:Git面试题全攻略

一、引言 在现代软件开发中&#xff0c;Git作为分布式版本控制系统&#xff0c;被广泛应用于代码管理与团队协作。面试官通过Git相关问题&#xff0c;考察候选人对版本控制的基本概念、操作流程以及解决实际问题的能力。本文将深入解读Git的基本操作、分支管理、冲突解决等常见…