Error: 7884, Severity: 20, State: 1

原创 2014年11月21日 16:31:57


背景:

         程序异常中断“TCPProvider, error: 0 - An existing connection was forcibly closed by the remotehost.”,手工执行查询没有问题,不过执行时间要几十秒。Trace程序的执行,发现要数十分钟,经了解,原因在于程序使用了SqlDataReader读取数据,并且在读取的过程中进行了一系列数据处理,导致整个完成过程时间变得很长。由此怀疑是网络不稳定之类的因素导致处理过程中连接中断,协调之后改为DataTable做一次性数据加载,程序调整之后,出现故障的频繁大大降低,但无法完全杜绝。

         进一步检查,发现在SQLServer日志中,有如下错误:

Error: 7884, Severity:20, State: 1. (Params:). The error is printed in terse mode because there waserror during formatting. Tracing, ETW, notifications etc are skipped. 

         这个错误与sys.messages中的标准描述不一样,在网上搜索没有找到合适的解决方案。

排查:

把查询的表专门导到一台服务器做测试,最终发现与一个nvarchar(max)列有关,随后想起在不久前,因为Logreader出问题,把出问题的数据列从ntext改为nvarchar(max),于是专门测试这个修改,最终确定问题是这个修改导致。

text/ntext列可能会导致logreaderagent出问题,这个遇到多次了,但没有明确的重现故障的方法,所以不讨论这个)

故障重现:

使用下面的T-SQL创建测试表,数据,并修改ntext列为nvarchar(max)

-- ======================================================

-- 创建测试表

-- ======================================================

USE tempdb;

GO

IF OBJECT_ID(N'dbo.tb_test', 'U') IS NOT NULL

     DROPTABLE dbo.tb_test;

GO

CREATE TABLEdbo.tb_test(

     id intIDENTITY PRIMARYKEY,

     Code varchar(50),

     Datedatetime,

     Value ntext

);

GO

INSERT dbo.tb_test

SELECT TOP(10000)

     Code =RIGHT(10000000000 +ABS(CHECKSUM(NEWID())) % (1000 * 2 ), 20),

     Date= DATEADD(DAY, CHECKSUM(NEWID()) % 100 , GETDATE() ),

     Value =CONVERT(char(36), NEWID() )

FROM sys.all_columns A WITH(NOLOCK)

     ,sys.all_columns B WITH(NOLOCK)

;

GO

 

-- ======================================================

-- 修改 ntext 字段类型为 nvarchar(max)

-- ======================================================

ALTER TABLEdbo.tb_test ALTERCOLUMN Value nvarchar(max);

GO

 

编写程序,查询数据,并且在查询完成前更改数据,这里用 PowherShell 做测试

# 连接字符串

$ConnectionString = "Data Source=127.0.0.1;InitialCatalog=tempdb;Integrated Security=SSPI"

 

# 打开连接

$SqlCnnectionQuery = New-Object System.Data.SqlClient.SqlConnection -ArgumentList $ConnectionString

$SqlCnnectionQuery.Open()

 

# 查询数据

$SqlCommandQuery = New-Object System.Data.SQLClient.SQLCommand

$SqlCommandQuery.Connection = $SqlCnnectionQuery

$SqlCommandQuery.CommandText = "SELECT * FROM( SELECT value, row_id = ROW_NUMBER()OVER( PARTITION BY Code ORDER BY date DESC) FROM dbo.tb_test WITH(NOLOCK) )DATAWHERE row_id = 1"

$SqlReader = $SqlCommandQuery.ExecuteReader()

 

# 修改数据

$SqlCnnectionUpdate = New-Object System.Data.SqlClient.SqlConnection -ArgumentList $ConnectionString

$SqlCnnectionUpdate.Open()

$SqlCommandUpdate = New-Object System.Data.SQLClient.SQLCommand

$SqlCommandUpdate.Connection = $SqlCnnectionUpdate

$SqlCommandUpdate.CommandText = "UPDATE top(1000) dbo.tb_test SET Value =CONVERT(char(36), NEWID() ) WHERE id IN( SELECT TOP 1000 id FROM dbo.tb_testORDER BY id DESC )"

$UpdateRows = $SqlCommandUpdate.ExecuteNonQuery()

$SqlCnnectionUpdate.Close()

"Update $UpdateRows rows."

 

#读取查询数据

#读取过程中会出现错误

#   (SQL 2008 R2 SP2) TCP Provider, error: 0 - Anexisting connection was forcibly closed by the remote host.

#   (SQL 2008 R2 SP3) TCP Provider, error: 0 - The specifiednetwork name is no longer available.

At line:1 char:22

"Read query data...."

$ReadRows=0

While($SqlReader.Read()) {$ReadRows+=1}

"Read $ReadRows rows."

 

# 关闭连接

$SqlReader.Close()

$SqlCnnectionQuery.Close()

 

故障处理:

对于修改了数据类型的列,将数据重新更新就可以解决 问题(UPDATE SET 修改的列=修改的列)

这个问题测试了 SQL Server2008 2014,都存在问题。其中 SQL Server 2008 R2 SP3中测试,SQL Server日志中的错误信息有所不同,是:

Error: 7886, Severity: 20, State: 2.

A read operation on a large object failedwhile sending data to the client. A common cause for this is if the applicationis running in READ UNCOMMITTED isolation level. This connection will beterminated.

SqlServer try catch 捕获不到的一些错误及解决方法

IF (OBJECT_ID('AA','U') IS NOT NULL) DROP TABLE AA CREATE TABLE AA(ID INT) SELECT * FROM AA --注:数据...
  • kk185800961
  • kk185800961
  • 2014年10月13日 13:30
  • 13925

Dlna音乐播放器

最近做DLNA音乐播放的功能,由于相关资料相对较少,官网上的英文文档又比较难理解,导致实现这一功能花费了大量时间。今天把我的Demo分享给大家。 效果图如下: 1,本Demo实现了DMR设备的...
  • u010134293
  • u010134293
  • 2015年11月04日 21:43
  • 1008

CocoaPods的SSL报错解决办法

最近把CocoaPods升级到0.38之后导入高德地图的SDK. pod install终端一直提示这个错误: Failed to send stats: SSL_connect returned...
  • kareily
  • kareily
  • 2015年10月08日 10:25
  • 2104

Kafka#3:分布式设计

因为采用了pull模式,从本质上来看,Kafka可以说是提供了分布式存储服务的,存储的是消息日志文件,发布消息是写操作,订阅消息是读操作。接下来就结合前面MQ的视角,看下Kafka的分布式存储机制。...
  • kisimple
  • kisimple
  • 2015年01月15日 20:16
  • 2875

hibernate查询方式【1】:对象导航查询,OID查询,hql查询,

hibernate查询方式
  • diaosinixiheixiu
  • diaosinixiheixiu
  • 2017年12月26日 20:36
  • 75

实战Memcached缓存系统

1. What is Memcached? Memcached是一个免费开源、高性能、分布式的内存对象缓存系统。Memcached是在内存中,为特定数据(字符串或对象)构建key-value的小...
  • jiubugeinifo
  • jiubugeinifo
  • 2013年10月30日 13:22
  • 1307

ZooKeeper客户端事件串行化处理

为了提升系统的性能,进一步提高系统的吞吐能力,最近公司很多系统都在进行异步化改造。在异步化改造的过程中,肯定会比以前碰到更多的多线程问题,上周就碰到ZooKeeper客户端异步化过程中的一个死锁问题,...
  • hjxhjh
  • hjxhjh
  • 2013年07月20日 01:46
  • 4240

OpenWrt 开发版本主trunk MT7620N 无线驱动bug

环境: OpenWrt Development Trunk:  svn co svn://svn.openwrt.org/openwrt/trunk/ BUG: 1. 无线无法建立连接. 2. 无线...
  • qianguozheng
  • qianguozheng
  • 2014年08月19日 19:23
  • 6692

MATLAB/SIMULINK测量端问题

出现以下错误:Derivative of state ‘1’ in block ‘model1/PLL (3ph)/Model/Variable Frequency Mean value/Model/...
  • ambizxzh
  • ambizxzh
  • 2017年06月22日 17:46
  • 583

移动应用的时空连续性

概述: 本文针对用户对手机、平板等移动环境下应用的时空连续性需求,以及移动平台(android和 ios)自身的特点,提出一种移动应用的设计策略,来弥补目前移动应用设计的不足。希望达到的目标是当...
  • ljz2009y
  • ljz2009y
  • 2013年03月01日 14:25
  • 729
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Error: 7884, Severity: 20, State: 1
举报原因:
原因补充:

(最多只允许输入30个字)