DBCC의 기본 개념과 사용 목적
DBCC(Data Base Console Command)는 SQL Server에서 데이터베이스의 내부 상태를 진단하고 조작하기 위한 시스템 명령어 집합이다. 이 명령어들은 주로 개발자나 유지보수 엔지니어가 데이터베이스의 물리적 구조, 페이지 구성, 인덱스 배치 등을 분석할 때 사용된다. 특히 공식 문서에 포함되지 않은 비공개 명령어들도 존재하며, 이들 역시 특정 추적 플래그를 활성화하면 사용 가능하다.
명령어 수와 접근 방법
공식적으로 제공되는 DBCC 명령어는 약 30여 개이며, 실질적으로는 공개된 것 외에도 수십 개의 내부 명령어가 존재한다. 이를 모두 외우기보다는, DBCC HELP('명령어명')를 통해 현재 환경에서 지원하는 파라미터와 사용 예시를 확인하는 것이 효율적이다. 또한 Microsoft Books Online은 가장 신뢰할 수 있는 참고 자료이며, 주요 명령어의 기능과 제한 사항을 상세히 설명한다.
주요 명령어 실습: 트레이싱 및 페이지 정보 조회
1. DBCC TRACEON: 추적 플래그 설정
데이터베이스 내부 동작을 모니터링하거나 비공개 명령어를 사용하기 위해 다음과 같은 플래그를 활성화한다:
DBCC TRACEON(2588): 비공개 명령어의 매개변수를 출력 가능하게 함.DBCC TRACEON(3604):DBCC PAGE등의 결과를 클라이언트에 직접 출력하도록 함 (기본적으로 에러 로그에 기록됨).
2. DBCC IND: 데이터 페이지 구조 분석
테이블 또는 인덱스의 데이터 페이지 배치를 확인하는 데 사용된다. 주요 파라미터는 다음과 같다:
dbname | dbid: 데이터베이스 이름 또는 ID.object_name | object_id: 테이블 또는 뷰 이름 또는 객체 식별자.display_type: 반환할 정보 유형 (예: -2, -1, 0, 1 등).
각 값의 의미는 다음과 같다:
- -2: 모든 IAM 페이지 (행 내부, 행 오버플로, LOB 데이터용) 반환.
- -1: 모든 데이터 페이지와 IAM 페이지 반환.
- 0: 행 내부 데이터용 페이지만 반환.
- 1: 집합 인덱스 데이터 페이지 및 관련 IAM 페이지 반환.
- 2 이상: 해당 번호의 비집합 인덱스 데이터 페이지 반환.
3. DBCC PAGE: 페이지 내용 직접 분석
특정 데이터 페이지의 전체 내용을 해독하여, 실제 저장된 데이터 구조를 확인할 수 있다. 파라미터는 다음과 같다:
dbname | dbid: 대상 데이터베이스.filenum: 파일 번호.pagenum: 페이지 번호.display_type: 출력 형식 (0~3).
출력 옵션의 차이는 다음과 같다:
- 0: 페이지 헤더 정보만 가독성 있게 출력.
- 1: 헤더 + 슬롯별 데이터의 16진수 표현.
- 2: 전체 페이지 헤더 및 데이터 영역의 16진수 덤프 (비어 있는 공간 포함).
- 3: 헤더 + 각 컬럼의 가독성 있는 내용 출력 (행 오버플로 데이터까지 표시, 그러나 대용량 컬럼은 위치만 표시).
실제 적용 사례: 데이터 페이지 구조 탐색
1. 손상된 페이지 확인
다음 쿼리를 통해 데이터베이스 내에서 의심되는 페이지를 확인할 수 있다:
SELECT
DB_NAME(database_id),
[file_id],
page_id,
CASE event_type
WHEN 1 THEN '823/824/Torn Page'
WHEN 2 THEN 'Bad Checksum'
WHEN 3 THEN 'Torn Page'
WHEN 4 THEN 'Restored'
WHEN 5 THEN 'Repaired (DBCC)'
WHEN 7 THEN 'Deallocated (DBCC)'
END AS error_type,
error_count,
last_update_date
FROM msdb..suspect_pages;
2. 관리 페이지 식별
SQL Server는 특정 페이지를 관리 용도로 사용한다. 다음은 주요 관리 페이지의 식별 방식이다:
- PFS (Page Free Space): 매 8,088페이지마다 발생 (페이지 번호 % 8088 = 0).
- GAM (Global Allocation Map): 매 511,232페이지마다 발생 (페이지 번호 % 511232 = 0).
- SGAM (Shared GAM): 매 511,232페이지마다 발생 ((페이지 번호 – 1) % 511232 = 0).
또는 다음 스크립트로 판단 가능:
DECLARE @PageID INT = 8088;
SELECT
CASE
WHEN @PageID = 1 OR @PageID % 8088 = 0 THEN 'PFS Page'
WHEN @PageID = 2 OR @PageID % 511232 = 0 THEN 'GAM Page'
WHEN @PageID = 3 OR (@PageID - 1) % 511232 = 0 THEN 'SGAM Page'
ELSE 'Not a system management page'
END AS page_type;
3. 실제 데이터 페이지 분석 예시
다음은 특정 페이지의 내용을 분석하는 과정:
DBCC TRACEON(3604);
DBCC PAGE('testdb', 1, 309, 3);
결과에서는 페이지 헤더, 슬롯 정보, 각 컬럼의 실제 값, 그리고 행 오버플로 또는 대용량 컬럼의 저장 위치까지 세밀하게 확인할 수 있다. 예를 들어, namea 컬럼이 6000바이트 이상이라면, 페이지 내부에 저장되지 않고 다른 페이지에 저장되며, [BLOB Inline Root] 형태로 링크가 표시된다.
고급 활용: 비공개 명령어의 한계와 주의사항
특정 DBCC PAGE 옵션(예: 1, 3)이 실패하는 경우는 일반적으로 해당 페이지가 유효하지 않거나, 삭제된 테이블의 잔존 페이지일 수 있다. 이 경우, 페이지가 재사용되었지만 데이터가 남아 있지 않아 구조 해석이 불가능해진다. 이러한 현상은 마이크로소프트가 일부 명령어를 공개하지 않는 이유 중 하나이기도 하다.
따라서 이 명령어들은 생산 환경에서의 정기적 사용보다는 문제 해결 시점에서의 긴급 진단 도구로 활용되어야 한다.