증상
Microsoft SQL Server 2012 또는 SQL Server 2014를 사용 하 고 있다고 가정 합니다. RBS (원격 BLOB 저장소) 유지 관리자를 실행 하는 경우 RBS 유지 관리자 도구가 실패 하 고 다음 오류 메시지가 나타납니다.
유지 관리자 작업 시작 가비지 수집 시작 참조 검색을 시작 합니다. 이 데이터베이스에 대 한 참조 검사가 완료 되었습니다. 113 blob을 검색 했습니다. 0x000000000000000000000000 (exclusive) 범위의 0 개 blob을 0x00000000000000b600000002 (포함)로 삭제 했습니다. 이 작업은 종료 되었습니다. 1 개의 작업 단위 총을 처리 했습니다. 0 개의 작업 단위가 완료 되지 않았습니다. 삭제 전파를 시작 합니다. 지금은 작업을 사용할 수 없습니다. 다른 클라이언트, 프로세스나 스레드는 현재 다른 작업에 대해 작업 중일 수 있습니다. 오류가 발생 하 여 현재 작업 단위를 건너뜁니다. 자세한 내용은 RBS 유지 관리자 로그를 참조 하세요. [..] 이 작업은 종료 되었습니다. 처리 됨 102 총 작업 단위. 101 작업 단위가 완료 되지 않았습니다. 0 개 blob을 삭제 하는 데 필요 합니다. 0 blob을 삭제 했습니다. blob 저장소에서 0 개의 blob을 찾을 수 없습니다. 이 작업은 종료 되었습니다. 이 작업은 종료 되었습니다.
프로필러를 사용 하 여 문제를 추적 하는 경우 다음 오류 메시지가 나타납니다.
메시지 5만, 수준 16, 상태 0, 프로시저 rbs_sp_rethrow_error, 꺾은선형 38RBS 오류. 원본 오류: 숫자 535, 심각도 16, 상태 0, 프로시저 rbs_sp_count, 줄 52, 메시지: datediff 함수에서 오버플로가 발생 했습니다. 두 날짜/시간 인스턴스가 구분 되는 dateparts 수가 너무 큽니다. 보다 정확한 datepart를 사용 하 여 datediff를 사용해 봅니다.
원인
이 문제는 마지막 실행 이후 시간을 검사 하는 쿼리가 값을 밀리초로 변환할 때 오버플로될 수 있기 때문에 발생 합니다. 이로 인해 쿼리가 실패 하 고 작업이 데이터를 처리 하지 않고 종료 됩니다.
해결 방법
이 문제에 대 한 픽스는 RBS에 대 한 최신 기능 팩 다운로드에서 확인할 수 있습니다. 이미 기존 RBS가 설치 되어 있는 경우 "해결 방법" 섹션에 나와 있는 스크립트를 실행 하 여 문제를 일시적으로 해결 하는 것이 좋습니다.
MICROSOFT Sql server 2014 SP2 (서비스 팩 2) 기능 팩 다운로드 microsoft Sql Server 2012 서비스 팩 4(Sp4)의 기능 팩 다운로드
해결 방법
수정 프로그램이 설치 되지 않은 SQL Server 2012 또는 SQL Server 2014에 기존 RBS가 설치 되어 있는 경우 다음 해결 단계를 사용할 수 있습니다.
-
SSMS에서 3 단계의 스크립트를 연 다음 수정 프로그램을 적용 하려는 RBS 클라이언트 데이터베이스를 호스트 하는 SQL Server 인스턴스에 연결 합니다.
-
스크립트에서 "your_RBS_client_database" 문자열을 RBS 클라이언트 데이터베이스의 실제 이름으로 바꿉니다.
-
스크립트를 실행 하 여 수정 프로그램을 적용 합니다.use [your_RBS_client_database]go if object_id(N'mssqlrbs_resources.rbs_sp_count') is not null drop procedure mssqlrbs_resources.rbs_sp_countgo create procedure mssqlrbs_resources.rbs_sp_count ( @operation smallint, @object smallint = 0, @value bigint = null, @start_time datetime = null, @end_time datetime = null, @description sysname = N'', @message nvarchar(max) = null)asbegin declare @type tinyint, @secondsUsed bit, @seconds float declare @maxDays int = 10; if not exists ( select * from mssqlrbs_resources.rbs_internal_counters where operation = @operation and object = @object and description = @description ) raiserror (N'Internal error in RBS. Attempt to count invalid performance counter. Counter: <%d>.<%d>.<%s>.', 16, 101, @operation, @object, @description) select @type = type, @secondsUsed = seconds_used from mssqlrbs_resources.rbs_internal_counters where operation = @operation and object = @object and description = @description if @object != 0 begin if @value is null raiserror (N'Internal error in RBS. Value not specified for performance counter <%d>.<%d>.<%s>.', 16, 103, @operation, @object, @description) end if @secondsUsed = 1 begin if (@start_time is null) raiserror (N'Internal error in RBS. Start time not specified for performance counter <%d>.<%d>.<%s>.', 16, 102, @operation, @object, @description) set @end_time = isnull(@end_time, getutcdate()) if (@start_time > @end_time) raiserror (N'Internal error in RBS. Start time is after end time. Counter: <%d>.<%d>.<%s>.', 16, 104, @operation, @object, @description) if (datediff(day, @start_time, @end_time) >= @maxDays) begin set @seconds = convert(float, datediff(second, @start_time, @end_time)) end else begin set @seconds = convert(float, datediff(millisecond, @start_time, @end_time)) / 1000 end end update mssqlrbs_resources.rbs_internal_counters set count = count + 1, value = value + @value, squared_value = squared_value + square(@value), min_value = case when min_value is null then @value when (@value < min_value) then @value else min_value end, max_value = case when max_value is null then @value when (@value > max_value) then @value else max_value end, last_value = @value, seconds = seconds + @seconds, squared_seconds = squared_seconds + square(@seconds), min_seconds = case when min_seconds is null then @seconds when (@seconds < min_seconds) then @seconds else min_seconds end, max_seconds = case when max_seconds is null then @seconds when (@seconds > max_seconds) then @seconds else max_seconds end, last_seconds = @seconds, last_update_time = getutcdate(), last_message = @message where operation = @operation and object = @object and description = @description endgo
상태
Microsoft는 "적용 대상" 절에 나열한 제품에서 이 문제를 확인했습니다.