MSSQLSERVER_2570

적용 대상:SQL Server

세부 사항

attribute
제품 이름 SQL Server
이벤트 ID 2570
이벤트 원본 MSSQLSERVER
구성 요소 SQLEngine
심볼 이름 DBCC_COLUMN_VALUE_OUT_OF_RANGE
메시지 텍스트 페이지 P_ID, 개체 ID O_ID 슬롯 S_ID, 인덱스 ID I_ID, 파티션 ID PN_ID, 할당 단위 ID A_ID(TYPE 형식) 열 COLUMN_NAME 값이 데이터 형식 "DATATYPE"의 범위를 벗어났습니다. 열을 법적 값으로 업데이트합니다.

설명

지정된 열에 포함된 열 값이 열 데이터 형식에 대해 가능한 값 범위를 벗어났습니다. 테이블 열에 잘못된 데이터가 있는 경우 잘못된 데이터에 대해 수행된 작업 유형에 따라 문제가 발생할 수 있습니다. 그러나 아무 문제도 나타나지 않을 수 있으며, 명령이나 DBCC CHECKTABLE 명령을 실행할 DBCC CHECKDB 때까지 잘못된 데이터가 검색되지 않을 수도 있습니다.

잘못된 데이터가 존재하기 때문에 발생할 수 있는 몇 가지 증상은 다음과 같습니다(하지만 제한되지 않음).

  • 영향을 받는 열에 대해 쿼리를 실행할 때 위반 또는 기타 예외에 액세스합니다.
  • 영향을 받는 열에 대해 실행된 쿼리에서 반환된 잘못된 결과입니다.
  • 영향을 받는 열에 대해 통계를 작성할 때 발생하는 오류 또는 문제입니다.
  • 다음과 같은 오류 메시지:

    Msg 9100, Level 23, State 2, Line <LineNum> 가능한 인덱스 손상이 감지되었습니다. DBCC CHECKDB를 실행합니다.

DATA_PURITY 검사

DBCC CHECKDB 또는 DBCC CHECKTABLE 명령을 실행하면 SQL Server는 데이터베이스에 있는 모든 테이블의 각 행에 있는 열 값의 "데이터 순도" 유효성 검사를 수행합니다. 이러한 검사는 열에 저장된 값이 유효한지 확인하기 위해 수행됩니다. 즉, 유효성 검사를 통해 값이 열의 데이터 형식과 연결된 도메인 범위를 벗어나지 않도록 합니다. 수행되는 유효성 검사의 특성은 열의 데이터 형식에 따라 달라집니다. 다음 완전하지 않은 목록은 몇 가지 예를 제공합니다.

열 데이터 형식 수행된 데이터 유효성 검사 유형
유니코드 문자 데이터 길이는 2의 배수여야 합니다.
날짜/시간 날짜 필드는 1753년 1월 1일부터 9999년 12월 31일 사이여야 합니다. 시간 필드는 "11:59:59.997PM" 이전이어야 합니다.
Real 및 Float SNAN, QNAN, NINF, ND, PD 및 PINF와 같은 잘못된 부동 소수점 값이 있는지 확인합니다.

모든 데이터 형식이 열 데이터의 유효성을 검사하지는 않습니다. 범위를 벗어난 저장 값이 있을 수 있는 값만 확인됩니다. 예를 들어 데이터 형식의 tinyint 유효 범위는 0에서 255 사이이며 단일 바이트(0에서 255 사이의 값만 저장할 수 있음)에 저장되므로 값을 확인할 필요가 없습니다.

참고 항목

이러한 검사는 기본적으로 사용하도록 설정되며 사용하지 않도록 설정할 수 없으므로 명령 또는 DBCC CHECKTABLE 명령을 실행할 DBCC CHECKDB 때 DATA_PURITY 옵션을 명시적으로 사용할 필요가 없습니다. 그러나 PHYSICAL_ONLY 옵션을 DBCC CHECKDB 사용하거나 DBCC CHECKTABLE사용하는 경우 데이터 순도 검사가 수행되지 않습니다.

DATA_PURITY 문제 보고서

옵션을 사용하도록 설정하여 또는 DBCC CHECKTABLEDATA_PURITY 데이터 순도 검사가 자동으로 실행되고 명령 DBCC 에서 검사 DBCC 한 테이블에 잘못된 데이터가 있는 경우 DBCC CHECKDB 출력에 데이터와 관련된 문제를 나타내는 다른 메시지가 포함됩니다. 다음 샘플 오류 메시지는 데이터 순도 문제를 나타냅니다.

DBCC results for "account_history". 
Msg 2570, Level 16, State 2, Line <LineNum> 
Page (1:1073), slot 33 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "account_name" value is out of range for data type "nvarchar". Update column to a legal value. 
 
Msg 2570, Level 16, State 2, Line <LineNum> 
Page (1:1156), slot 120 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "account_name" value is out of range for data type "nvarchar". Update column to a legal value.
There are 153137 rows in 1080 pages for object "account_history". 
CHECKDB found 0 allocation errors and 338 consistency errors in table "account_history" (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 338 consistency errors in database '<DatabaseName>'. 
DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table1'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:154), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "real". Update column to a legal value. 
There are 4 rows in 2 pages for object "table1". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table1' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table2'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:155), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "decimal". Update column to a legal value. 
There are 4 rows in 1 pages for object "table2". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table2' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table3'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:157), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "datetime". Update column to a legal value. 
There are 3 rows in 1 pages for object "table3". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table3' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

For every row that contains an invalid column value, a 2570 error is generated. 

원인

잘못된 데이터 또는 범위를 벗어난 데이터는 다음과 같은 이유로 SQL Server 데이터베이스에 저장되었을 수 있습니다.

  • RPC(원격 프로시저 호출) 이벤트를 통해 SQL Server에 잘못된 데이터가 삽입되었습니다.
  • 물리적 데이터 손상의 다른 잠재적 원인으로 인해 열 값이 잘못되었습니다.

데이터 순도 문제 해결

2570 오류는 복구 옵션을 사용하여 DBCC 복구할 수 없습니다. 그 이유는 DBCC 잘못된 열 값을 바꾸는 데 사용해야 하는 값을 확인할 수 없기 때문입니다. 따라서 열 값을 수동으로 업데이트해야 합니다. 수동 업데이트를 수행하려면 문제가 있는 행을 찾아야 합니다. 다음 방법 중 하나를 사용하여 행을 찾습니다.

  • 잘못된 값이 포함된 테이블에 대해 쿼리를 실행하여 잘못된 값이 포함된 행을 찾습니다.
  • 오류 2570의 정보를 사용하여 잘못된 값이 있는 행을 식별합니다.

두 방법 모두 다음 섹션에 자세히 설명되어 있으며 잘못된 데이터가 있는 행을 찾는 예제를 제공합니다.

올바른 행을 찾으면 기존 잘못된 데이터를 대체하는 데 사용할 새 값에 대한 결정을 내려야 합니다. 이 결정은 애플리케이션에 적용할 수 있는 값의 범위와 특정 데이터 행의 논리적 의미에 따라 매우 신중하게 결정해야 합니다. 다음과 같은 선택 사항이 있습니다.

  • 값이 무엇인지 알고 있는 경우 해당 특정 값으로 설정합니다.
  • 허용되는 기본값으로 설정합니다.
  • 열 값을 .로 NULL설정합니다.
  • 열의 데이터 형식에 대한 최대값 또는 최소값으로 열 값을 설정합니다.
  • 특정 행이 열에 유효한 값 없이는 유용하지 않다고 생각되면 해당 행을 모두 삭제합니다.

T-SQL 쿼리를 사용하여 잘못된 값이 있는 행 찾기

잘못된 값이 있는 행을 찾기 위해 실행해야 하는 쿼리 유형은 문제를 보고하는 열의 데이터 형식에 따라 달라집니다. 2570 오류 메시지를 보면 이 문제에 도움이 될 수 있는 두 가지 중요한 정보를 확인할 수 있습니다. 다음 예제에서는 열 account_name 값이 데이터 형식 nvarchar의 범위를 벗어났습니다. 관련된 열의 데이터 형식과 문제가 있는 열을 쉽게 식별할 수 있습니다. 따라서 데이터 형식과 관련된 열을 알고 나면 쿼리를 작성하여 해당 열에 대한 잘못된 값이 포함된 행을 찾고 추가 업데이트 또는 삭제를 위해 해당 행을 식별하는 데 필요한 열(절의 조건자)을 WHERE 선택할 수 있습니다.

유니코드 데이터 형식
SELECT col1, DATALENGTH(account_name) AS Length, account_name  
FROM account_history 
WHERE DATALENGTH(account_name) % 2 != 0
Float 데이터 형식

실제 기본 키 열, 2570 오류의 열 col2table1 출력에서 테이블 CHECKDB 로 변경 col1 하여 다음 코드 조각을 실행합니다.

SELECT col1, col2 FROM table1 
WHERE col2<>0.0 AND (col2 < 2.23E-308 OR col2 > 1.79E+308) AND (col2 < -1.79E+308 OR col2 > -2.23E-308)
실제 데이터 형식

실제 기본 키 열, 2570 오류의 열 col2table1 출력에서 테이블 CHECKDB 로 변경 col1 하여 다음 코드 조각을 실행합니다.

SELECT col1, col2 FROM testReal  
WHERE col2<>0.0 AND (col2 < CONVERT(real,1.18E-38) OR col2 > CONVERT(real,3.40E+38)) AND (col2 < CONVERT(real,-3.40E+38) OR col2 > CONVERT(real,-1.18E-38))  
ORDER BY col1; -- checks for real out of range 
10진수 및 숫자 데이터 형식
SELECT col1 FROM table2 
WHERE col2 > 9999999999.99999  
OR col1 < -9999999999.99999

또는 numeric 열을 정의 decimal 한 정밀도 및 배율에 따라 값을 조정해야 합니다. 위의 예제에서 열은 .로 col2 decimal(15,5)정의됩니다.

날짜/시간 데이터 형식

열에 잘못된 값이 포함된 행을 식별하려면 두 개의 다른 쿼리를 datetime 실행해야 합니다.

SELECT col1 FROM table3 
WHERE col2 < '1/1/1753 12:00:00 AM' OR col2 > '12/31/9999 11:59:59 PM' 

SELECT col1 FROM table3 WHERE 
((DATEPART(ms,col2)+ (1000*DATEPART(s,col2)) + (1000*60*DATEPART(mi,col2)) + (1000*60*60*DATEPART(hh,col2)))/(1000*0.00333))  > 25919999

실제 위치를 사용하여 잘못된 값이 있는 행 찾기

T-SQL 메서드를 사용하여 잘못된 값이 있는 행을 찾을 수 없는 경우 이 메서드사용할 수 있습니다. 2570 오류 메시지에서 잘못된 값을 포함하는 행의 실제 위치가 인쇄됩니다. 예를 들어 다음 메시지를 확인합니다.

Page (1:157), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "datetime". Update column to a legal value. 

이 메시지에서 알 수 있습니다 Page (1:157), slot 0. 행을 식별하는 데 필요한 정보입니다. is FileId1, is PageInFile157및 is SlotId0입니다.

이 정보가 있으면 다음 명령을 실행해야 합니다.

DBCC TRACEON (3604)
DBCC PAGE (realdata , 1 , 157 , 3)

참고 항목

이 명령은 페이지의 전체 콘텐츠를 인쇄합니다. 명령에 대한 DBCC PAGE 매개 변수는 다음과 같습니다.

  • Database name: 데이터베이스의 이름입니다.
  • File number: 데이터베이스 파일의 파일 번호입니다.
  • Page number: 검사할 페이지의 수입니다.
  • Print option: 출력 세부 정보의 수준을 결정하는 선택적 매개 변수입니다.

이 명령을 실행하면 다음 형식과 유사한 정보가 포함된 출력이 표시됩니다.

Slot 0  Offset 0x60 Length 19
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x44D1C060
00000000: 10001000 01000000 ffffffff ffffffff †................
00000010: 0200fc†††††††††††††††††††††††††††††††...
Slot 0 Column 0  Offset 0x4 Length 4  col1 = 1
Slot 0 Column 1  Offset 0x8 Length 8  col2 = Dec 31 1899 19:04PM
Slot 1 Offset 0x73 Length 19
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x44D1C073
00000000: 10001000 02000000 0ba96301 f8970000 †..........c.....
00000010: 0200fc†††††††††††††††††††††††††††††††...
Slot 1 Column 0 Offset 0x4 Length 4 col1 = 2
Slot 1 Column 1 Offset 0x8 Length 8 col2 = Jul 8 2006 9:34PM
Slot 2 Offset 0x86 Length 19
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x44D1C086
00000000: 10001000 03000000 0ba96301 f8970000 †..........c.....
00000010: 0200fc†††††††††††††††††††††††††††††††... 
Slot 2 Column 0 Offset 0x4 Length 4 col1 = 3
Slot 2 Column 1 Offset 0x8 Length 8 col2 = Jul 8 2006 9:34PM

이 출력에서는 관심 있는 행의 열 값을 명확하게 볼 수 있습니다. 이 경우 페이지에 저장된 slot 0 행이 필요합니다. 오류 메시지에서 문제가 있는 메시지임을 알 col2 수 있습니다. 따라서 해당 값을 col1Slot 0 사용하여 update 문 또는 delete 문의 절에서 WHERE 조건자로 사용할 수 있습니다.

경고

첫 번째 방법(즉, T-SQL 쿼리를 사용하여 필요한 정보를 찾는 방법)을 사용하는 것이 좋습니다. 이 명령은 최후의 DBCC PAGE 수단으로만 사용합니다. 프로덕션 환경에서 이 명령을 사용할 때는 주의해야 합니다. 테스트 서버에서 프로덕션 데이터베이스를 복원하고, 필요한 모든 정보를 사용한 DBCC PAGE다음, 프로덕션 서버에서 업데이트를 수행하는 것이 좋습니다. 언제나처럼 문제가 발생할 경우 백업을 준비해야 하며 데이터베이스의 이전 복사본으로 되돌려야 합니다.

참고 항목