Error:7884,Severity:20,State:1
背景: 程序异常中断TCPProvider, error: 0 - An existing connection was forcibly closed by the remotehost.,手工执行查询没有问题,不过执行时间要几十秒。Trace程序的执行,发现要数十分钟,经了解,原因在于程序使用了SqlDataReader读取数据,并且在
背景:
程序异常中断“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.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP는 오랫동안 사용되어 온 인기 있는 웹 개발 언어입니다. PHP에 통합된 PDO(PHP 데이터 개체) 클래스는 웹 애플리케이션 개발 중에 데이터베이스와 상호 작용하는 일반적인 방법입니다. 그러나 일부 PHP 개발자가 자주 직면하는 문제는 PDO 클래스를 사용하여 데이터베이스와 상호 작용할 때 다음과 같은 오류가 발생한다는 것입니다. PHPFatalerror:CalltoundefinemethodPDO::prep

C++ 코드의 "error:incompletetypeisnotallowed" 문제를 해결하십시오. C++ 프로그래밍 프로세스 중에 흔히 발생하는 오류 중 하나는 "error:incompletetypeisnotallowed"입니다. 이 오류는 일반적으로 불완전한 유형에서 작업할 때 발생합니다. 이 문서에서는 이 오류의 원인을 설명하고 몇 가지 해결 방법을 제공합니다. 첫째로, 나는

Vue 애플리케이션에서 axios를 사용하는 것은 매우 일반적입니다. axios는 브라우저와 Node.js에서 사용할 수 있는 Promise 기반 HTTP 클라이언트입니다. 개발 과정에서 "Uncaught(inpromise)Error: Requestfailedwithstatuscode500"이라는 오류 메시지가 나타나는 경우가 있는데, 개발자 입장에서는 이 오류 메시지를 이해하고 해결하기 어려울 수 있습니다. 이 기사에서는 이에 대해 알아볼 것입니다.

부팅할 수 없는 "0271: 실시간 시계 오류"에 대한 해결 방법: 1. F1을 누르고 나타나는 인터페이스에서 옵션 표시줄을 세 번째 항목 "날짜/시간"으로 이동합니다. 2. 시스템 시간을 현재 시간으로 수동으로 변경합니다. 3. F10을 누르고 팝업 대화 상자에서 예를 선택합니다. 4. 정상적으로 부팅하려면 노트북을 다시 엽니다.

Onenote는 Microsoft에서 제공하는 최고의 메모 작성 도구 중 하나입니다. Outlook 및 MSTeams와 결합된 Onenote는 업무 및 개인의 창의적 생산성을 향상시키는 강력한 조합이 될 수 있습니다. 우리는 다른 형식으로 메모를 해야 하는데, 이는 단지 내용을 적는 것 이상일 수 있습니다. 때때로 우리는 일상 업무에서 다양한 소스의 이미지를 복사하고 일부 편집을 수행해야 합니다. 변경 사항을 적용하는 방법을 알고 있으면 Onenote에 붙여넣은 이미지를 효과적으로 활용할 수 있습니다. 원노트 사용 시, 원노트에 이미지를 붙여넣어 작업을 하기가 쉽지 않은 문제를 겪으신 적 있으신가요? 이 문서에서는 Onenote에서 이미지를 효과적으로 사용하는 방법을 살펴보겠습니다. 우리는 할 수 있다

C++ 코드의 "error:expectedinitializerbefore'datatype'" 문제를 해결하세요. C++ 프로그래밍에서 코드를 작성할 때 가끔 컴파일 오류가 발생하는 경우가 있습니다. 일반적인 오류 중 하나는 "error:expectedinitializerbefore'datatype'"입니다. 이 오류는 일반적으로 변수 선언이나 함수 정의에서 발생하며 프로그램이 올바르게 컴파일되지 않거나

PHPWarning:fopen():failedtoopenstream:Nosuchfileordirectory 해결 방법 PHP 개발을 사용하는 과정에서 "PHPWarning:fopen():failedtoopenstream:Nosuchfileordirectory"와 같은 파일 작업 문제가 종종 발생합니다.

PHP를 사용하여 웹 애플리케이션을 작성할 때 MySQL 데이터베이스를 사용하여 데이터를 저장하는 경우가 많습니다. PHP는 MySQLi라는 MySQL 데이터베이스와 상호 작용하는 방법을 제공합니다. 그러나 때때로 MySQLi를 사용할 때 아래와 같은 오류 메시지가 표시될 수 있습니다. PHPFatalerror:Calltoundefoundfunctionmysqli_connect() 이 오류 메시지는 PHP가 내 항목을 찾을 수 없음을 의미합니다.
