SQL Server 2005 이상 버전에서 DBCC 오류 2570 문제 해결

소개

이 문서는 SQL Server 오류 2570, 오류를 발생 시키는 요인 및이 문제를 해결 하는 방법을 설명 합니다.

자세한 내용

DATA_PURITY 검사

SQL Server 2005의 새 옵션인 DATA_PURITY, 있어야 및 DBCC CHECKDB 명령에 추가 되었습니다. 이 옵션을 선택에 관해 DBCC CHECKTABLE 또는 DBCC CHECKDB 명령을 실행 하면 명령이 데이터베이스에서 테이블의 모든 행의 모든 열 값에 "데이터 무결성" 유효성 검사를 수행 합니다. 열에 저장 된 값이 유효한 지 확인 하 여 이러한 새 검사를 수행 하는 (즉, 값은 도메인에 대 한 범위 밖으로 연결 된 해당 열의 데이터 형식). 수행할 유효성 검사의 특성 열의 데이터 형식에 따라 달라 집니다. 몇 가지 예제를 제공 하는 다음과 같은 부분:
열 데이터 형식데이터 유효성 검사 수행
유니코드 문자데이터 길이 2의 배수 여야 합니다.
날짜/시간일 필드는 1753 년 1 월 월 1 일 및 12 월 31 일 사이 여야 합니다 9999. 시간 필드에 '11:59:59:999 오후' 보다 이전 이어야 합니다.
실제 핑 및 플 로트SNAN, QNAN, NINF, ND, PD, PINF와 같은 잘못 된 부동 소수점 값의 존재 여부를 확인 합니다.
모든 데이터 형식은 열 데이터의 유효성을 검사 합니다. 항목만 체크 것이 범위를 벗어났습니다 저장된 된 값을 가질 수 있습니다. 예를 들어, tinyint 데이터 형식 유효한 범위 0-255 있고 (0에서 255 까지의 값만 저장할 수 있습니다)는 싱글바이트로 저장, 하므로 검사 값이 필요 합니다.

모든 데이터베이스에 대해 데이터 무결성 유효성 검사 자동으로 활성화 되지 않습니다. 검사는 여러 가지 요인에 따라 활성화 됩니다.
  • SQL Server 2005 이상 버전에서 만든 데이터베이스의 경우이 검사는 기본적으로 사용 하 고 관해 DBCC CHECKTABLE 또는 DBCC CHECKDB 명령을 실행 하는 경우 DATA_PURITY 옵션을 사용 하 여 관련 이므로 비활성화할 수 없습니다.
  • 같은 SQL Server 2000, SQL Server 7.0 및 SQL Server 2005로 업그레이드 된 버전의 SQL Server 이전 버전에서 만든 데이터베이스를 이러한 검사는 기본적으로 사용 되지 않습니다. 이러한 검사를 수행 하도록 하기 위해, 관해 DBCC CHECKTABLE 또는 DBCC CHECKDB 명령에서 DATA_PURITY 옵션을 지정 해야 합니다. 이 두 가지 발생할 수 있습니다.
    • DBCC 명령을 끝나서 보고 데이터베이스가 모든 데이터 무결성 검사를 포함 하 여 정리 합니다. 이 팩트 데이터베이스 헤더에 기록 됩니다. 모든 후속 관해 DBCC CHECKTABLE 또는 DBCC CHECKDB 명령 실행이이 정보를 확인할 수 및 자동으로 SQL Server 2005에서 만든 데이터베이스에 대해 발생 하는 상황에 따라 데이터 무결성 검사를 수행 합니다. 즉, 데이터베이스를 "클린" 것으로 알려진 일단 데이터 무결성 검사는 항상 수행 됩니다.
    • DBCC 명령을 데이터 불일치에 대 한 문제를 보고 되지만. 이런 경우 불일치를 제거 하려면 데이터베이스를 정리 해야 할 및 다음 DBCC 명령을 다시 실행 하려고 합니다. 보고 데이터베이스가 정리 될 때까지 DBCC 명령에 대 한 DATA_PURITY 옵션을 지정 해야 합니다.
  • PHYSICAL_ONLY 옵션 관해 DBCC CHECKTABLE 또는 DBCC CHECKDB 명령을 실행 하는 경우를 지정 하는 경우에 데이터 무결성 검사 수행 되지 않습니다.

증상

유효 하지 않거나 범위를 벗어난 데이터 다음과 같은 이유로 이전 버전에서 SQL Server 데이터베이스에 저장 된 수 있습니다.
  • 잘못 된 데이터 원본에서 bcp 유틸리티 같은 대량 삽입 방법을 사용 하는 동안 존재 했습니다.
  • 잘못 된 데이터는 SQL Server 대 한 RPC 이벤트 호출을 통해 전달 되었습니다.
  • 다른 가능한 원인 실제 데이터 손상을 왼쪽 열 값 잘못 된 상태에 있습니다.
테이블의 열에 잘못 된 데이터가 있으면 잘못 된 데이터에 대해 수행 되는 작업 유형에 따라 문제가 발생할 수 있습니다. 그러나 아무런 문제가 나타납니다 하 고 SQL Server 2005 및 이후 버전에서는 관해 DBCC CHECKTABLE 또는 DBCC CHECKDB 명령을 실행할 때까지 잘못 된 데이터가 발견 되지 것입니다 수도 이기도 합니다.

때문에 유효 하지 않은 데이터 액세스가 발생할 수 있습니다 현상 중 일부를 포함 (하지만 제한 되지 않습니다).
  • 액세스 위반 또는 다른 유형의 영향을 받는 열에 대해 쿼리를 실행 하는 동안 예외.
  • 영향을 받는 열에 대해 실행 된 쿼리에서 반환 된 잘못 된 결과입니다.
  • 오류 또는 영향을 받는 열에 대해 통계가 되는 경우의 문제.
  • 다음과 같은 오류 메시지:
    Msg 9100, 수준 23, 상태 2, 줄 1 가능한 인덱스 손상이 발견 되었습니다. DBCC CHECKDB를 실행 합니다.

DATA_PURITY 문제 보고서

DBCC CHECKDB 또는 DATA_PURITY 옵션을 사용 (또는 검사가 자동으로 실행 되어 데이터 순도) 명령어와 유효 하지 않은 있어야 실행할 때 DBCC 명령을 사용 하 여 선택한 테이블에 데이터가 있는, DBCC 출력 데이터를 사용 하 여 문제를 나타내는 추가 메시지를 포함 합니다. 데이터 무결성 문제를 나타내는 몇 가지 샘플 오류 메시지는 다음과 같습니다.
"Account_history"에 대 한 DBCC 결과입니다.
메시지 2570, 수준 16, 상태 2, 줄 1
페이지 (1:1073), 슬롯 33에 개체 ID 1977058079, 인덱스 ID 0, 파티션 ID 129568478265344, 할당 단위 ID 129568478265344 (형식 "에서 행 데이터")를 만듭니다. 열 "account_name_japan" 값 "nvarchar" 데이터 형식의 범위를 벗어났습니다. 열을 유효한 값으로 업데이트 합니다.

메시지 2570, 수준 16, 상태 2, 줄 1
페이지 (1:1156), 슬롯 120에 개체 ID 1977058079, 인덱스 ID 0, 파티션 ID 129568478265344, 할당 단위 ID 129568478265344 (형식 "에서 행 데이터")를 만듭니다. 열 "account_name_japan" 값 "nvarchar" 데이터 형식의 범위를 벗어났습니다. 열을 유효한 값으로 업데이트 합니다.
1080 페이지 개체 "account_history"에 153137 행이 있습니다.
CHECKDB는 테이블 "account_history" (개체 ID 1977058079) 0 할당 오류 및 일관성 오류 338 발견.
CHECKDB 데이터베이스 'BadUnicodeData' 0 할당 오류와 338 일관성 오류를 발견.
DBCC 실행이 완료 되었습니다. Dbcc에서 오류 메시지를 시스템 관리자에 게 문의 합니다.
'Table1'의 DBCC 결과입니다.
메시지 2570, 수준 16, 상태 3, 줄 1
(1:154) 페이지, 슬롯 0에 개체 ID 2073058421, 인덱스 ID 0, 파티션 ID 72057594038321152, 할당 합니다 단위 ID 72057594042318848 (형식 "에서 행 데이터")를 만듭니다. 열 "col2" 값 "실제" 데이터 형식의 범위를 벗어났습니다. 열을 유효한 값으로 업데이트 합니다.
"Table1" 개체에 대 한 면에 두 페이지에 4 행이 있습니다.
CHECKDB 0 할당 오류와 (개체 ID 2073058421) 'table1' 테이블에 1 일관성 오류를 찾았습니다.
CHECKDB 데이터베이스 'realdata' 0 할당 오류와 1 일관성 오류를 발견. DBCC 실행이 완료 되었습니다. Dbcc에서 오류 메시지를 시스템 관리자에 게 문의 합니다.
'Table2'의 DBCC 결과입니다.
메시지 2570, 수준 16, 상태 3, 줄 1
(1:155) 페이지, 개체 ID 2105058535 0 슬롯, 인덱스 ID 0, 파티션 ID 72057594038452224, 할당 합니다 단위 ID 72057594042449920 (형식 "에서 행 데이터"). 열 "col2" 값 "10 진수" 데이터 형식의 범위를 벗어났습니다. 열을 유효한 값으로 업데이트 합니다.
4 행 "table2" 개체에 대 한 1 페이지에 있습니다.
CHECKDB 0 할당 오류와 (개체 ID 2105058535) 'table2' 표에 1 일관성 오류를 찾았습니다.
CHECKDB 데이터베이스 'realdata' 0 할당 오류와 1 일관성 오류를 발견. DBCC 실행이 완료 되었습니다. Dbcc에서 오류 메시지를 시스템 관리자에 게 문의 합니다.
'표 3'에 대 한 DBCC 결과입니다.
메시지 2570, 수준 16, 상태 3, 줄 1
(1:157) 페이지, 슬롯 0에 개체 ID 2121058592, 인덱스 ID 0, 파티션 ID 72057594038517760, 할당 합니다 단위 ID 72057594042515456 (형식 "에서 행 데이터")를 만듭니다. 열 "col2" 값 "datetime" 데이터 형식의 범위를 벗어났습니다. 열을 유효한 값으로 업데이트 합니다.
개체 "표 3"의 1 페이지에 3 행이 있습니다.
CHECKDB 0 할당 오류와 (개체 ID 2121058592) 테이블 '표 3'에서 1 일관성 오류를 찾았습니다.
CHECKDB 데이터베이스 'realdata' 0 할당 오류와 1 일관성 오류를 발견. DBCC 실행이 완료 되었습니다. Dbcc에서 오류 메시지를 시스템 관리자에 게 문의 합니다.
2570 오류는 잘못 된 열 값이 포함 된 모든 행에 대해 생성 됩니다.

데이터 무결성 문제를 해결합니다.

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

수동 업데이트를 수행 하는 데 문제가 있는 행을 찾을 해야 합니다. 두 가지 방법으로이 작업을 수행할 수 있습니다.
  • 잘못 된 값이 들어 있는 행을 찾으려면 잘못 된 값이 포함 된 테이블에 대해 쿼리를 실행 합니다.
  • 2570 오류에서 정보를 사용 하 여 잘못 된 값이 있는 행을 식별 하기 위해.
논의할 것이 두 가지이 방법을 아래에 자세히 잘못 된 데이터가 있는 행을 찾으려면 예제를 사용 하 여.

올바른 행 찾았으면 기존 잘못 된 데이터를 대체 하는 새 값을 결정 해야 합니다. 이 결정 응용 프로그램에서 사용할 수 있는 값의 범위에 따라 매우 신중 하 게 이루어져야 하는 논리적 데이터 해당 특정 행에 대 한 이유 뿐만 아니라. 사용자가 선택할 수 있습니다.
  • 것은 어떤 값을 알면 해당 값을 설정 합니다.
  • 적절 한 기본값을 설정 합니다.
  • 열 값을 NULL로 설정 합니다.
  • 열 값 열에 해당 데이터 형식에 대 한 최대 또는 최소 값을 설정 합니다.
  • 특정 행의 열에 대 한 올바른 값이 없는 모든 사용 임을 생각 하면 모두 해당 행을 삭제할 수 있습니다.

T-SQL 쿼리를 사용 하 여 잘못 된 값으로 행 찾기

잘못 된 값이 있는 행을 찾으려면 실행 해야 할 쿼리 유형을 문제를 보고 하는 열의 데이터 형식에 따라 달라 집니다. 2570 오류 메시지를 보면 중요 한 두 가지가 도움이 되는 정보를 확인할 수 있습니다. 다음 예제에서는 열 "account_name_japan" 값이 "nvarchar"입니다. 데이터 형식에 대 한 범위를 벗어났습니다. 문제 뿐만 아니라 관련 된 열의 데이터 형식을 가진 열 쉽게 식별할 수 있습니다. 따라서 데이터 형식을 알고 관련 된 열, 해당 열에 대해 잘못 된 값이 들어 있는 행을 찾으려면 쿼리를 만들 수 있습니다 되 면 열을 선택 하면 추가로 업데이트 또는 삭제에 대 한 행 (WHERE 절의 조건부)로 식별 하 필요 합니다.

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


Float 데이터 형식:
-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from the CHECKDB output
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)

Real 데이터 형식:
-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from -- the CHECKDB output
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

Decimal 및 Numeric 데이터 형식:
SELECT col1 FROM table2WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999

전체 자릿수와 소수 자릿수는 decimal 또는 numeric 열의 정의에 따라 값을 조정 해야 하는 점을 염두에 두십시오. 위의 예제에서는 열은 decimal(15,5) c o l 2로 정의 되었습니다.

날짜 시간 데이터 형식:
날짜 시간 열에 대 한 잘못 된 값이 들어 있는 행을 식별 하는 두 개의 다른 쿼리를 실행 해야 합니다.
SELECT col1 FROM table3WHERE 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 오류 메시지에서 잘못 된 값이 들어 있는 행의 실제 위치가 인쇄 됩니다. 예를 들어, 다음과 같은 메시지를 살펴봅니다.
(1:157) 페이지, 슬롯 0에 개체 ID 2121058592, 인덱스 ID 0, 파티션 ID 72057594038517760, 할당 합니다 단위 ID 72057594042515456 (형식 "에서 행 데이터")를 만듭니다. 열 "col2" 값 "datetime" 데이터 형식의 범위를 벗어났습니다. 열을 유효한 값으로 업데이트 합니다.
이 메시지는 정보를 확인할 수 있습니다: 페이지 (1:157), 슬롯 0. 행을 식별 하는 데 필요한 정보입니다. 해당 필드는 1에서 PageInFile 157, 되며 SlotId가 0. 이 정보를 만든 후 다음과 같은 명령을 실행 해야 합니다.
DBCC TRACEON ( 3604 )DBCC PAGE ( realdata , 1 , 157 , 3 )

이 명령은 한 페이지의 전체 내용을 인쇄 합니다. DBCC PAGE 명령에 매개 변수는 다음과 같습니다.
  • 데이터베이스 이름
  • 필드
  • PageInFile
  • 인쇄 옵션
이 명령을 실행 하면 후 다음과 같은 형식으로 유사한 정보가 들어 있는 출력을 알 수 있습니다.
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
이 출력에서 관심 행에 대 한 열 값을 명확 하 게 볼 수 있습니다. 이 경우 행 페이지 0 슬롯에 저장 해야 합니다. 오류 메시지에서 해당 col2 문제 라는 것을 알 수 있습니다. 따라서 슬롯 0 col1 값을 가져와 및 update 문의 WHERE 절의 조건자로 사용 하거나 삭제할 수 문.

경고 첫 번째 방법 (즉, 필요한 정보를 찾을 수 사용 T SQL 쿼리)를 사용 하는 것이 좋습니다. 마지막 수단 으로만 DBCC PAGE 명령을 사용 합니다. 주의 중요할 프로덕션 환경에서이 명령을 사용 하는 동안. 테스트 서버에서 프로덕션 데이터베이스 복원 다음 DBCC PAGE 사용 하 여 필요한 정보를 모두 가져오고 다음 프로덕션 서버에 업데이트를 수행 하는 것이 좋습니다. 항상 문제가 발생 하 고 데이터베이스의 이전 복사본을 복원 해야 하는 경우에 백업을 준비 유지 해야 합니다.

참조

DBCC checkdb에 대 한 자세한 내용은 다음 Microsoft Developer Network (MSDN) 웹 사이트에서 "DBCC CHECKDB (Transact SQL)" 항목을 참조.SQL Server 2000의 알려진된 문제에 대 한 자세한 내용은 Microsoft 기술 자료의 다음 문서 번호를 클릭 합니다.
900335 수정: 실제 데이터 형식 또는 FLOAT 데이터 형식의 인덱스에 포함 하 고이 데이터 형식은 NaN 값이 포함 되어 SQL Server 2000의 자동 데이터베이스 복구 작업이 성공 하지 못할 수

RPC 이벤트에 대 한 자세한 내용은 다음 MSDN 웹 사이트에서 "저장 프로시저 (OLE DB) 호출" 항목을 참조 하십시오.다른 데이터 형식에 대 한 자세한 내용은 다음 MSDN 웹 사이트에서 "저장 프로시저 (OLE DB) 호출" 항목을 참조.부동 소수점 값 규칙에 대 한 자세한 내용은 다음 Intel 웹 사이트를 방문 하십시오.Microsoft는 기술 지원을 받는 데 도움을 받을 수 있도록 다른 공급 업체의 연락처 정보를 제공합니다. 이 연락처 정보는 예고 없이 변경될 수 있습니다. Microsoft는 이 타사 연락처 정보의 정확성을 보증하지 않습니다.
속성

문서 ID: 923247 - 마지막 검토: 2017. 2. 7. - 수정: 1

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server 2005 Express Edition with Advanced Services, Microsoft SQL Server 2005 Express Edition with Advanced Services, Microsoft SQL Server 2005 Express Edition with Advanced Services, Microsoft SQL Server 2005 Express Edition with Advanced Services, Microsoft SQL Server 2005 Workgroup Edition, Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems, Microsoft SQL Server 2005 Enterprise X64 Edition, Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems, Microsoft SQL Server 2005 Standard X64 Edition, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 R2 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Express, Microsoft SQL Server 2008 Express with Advanced Services, Microsoft SQL Server 2008 Workgroup, Microsoft SQL Server 2008 Standard Edition for Small Business

피드백