DBCC WRITEPAGE
- DBCC 명령을 사용한 데이터 파괴하기
- Version : SQL Server 2005, 2008, 2008R2, 2012
SQL Server에서 문서화 되지 않은 기능 DBCC WRITEPAGE 기능에 대해서 알아 본다. 이 명령을 사용한 문제는 전적으로 자신에게 있으니 사용시 주의하길 바란다.
DBCC WRITEPAGE는 시스템 관리자 권한이 있을 경우 데이터베이스의 있는 모든 페이지의 바이트를 변경 할 수 있다.
DBCC WRITEPAGE는 작업에 대해 트랜잭션을 기록하지 않는다. 이는 곧 롤백이 불가능하다는 것으로 해석 할 수 있다. 또한 시스템 관리자 권한이 있는 모든 사람이 사용할 수 있으므로 막을 수 있는 방법이 없다.
실습을 통해서 DBCC WRITEPAGE 사용방법에 대해서 알아보자. 다음 스크립트를 실행하여 사용법을 확인 한다.
DBCC TRACEON (2588); GO
DBCC HELP ('WRITEPAGE'); GO |
파라메터는 다음과 같다.
- 'dbname' | dbid : self-explanatory
- fileid : file ID containing the page to change
- pageid : zero-based page number within that file
- offset : zero-based offset in bytes from the start of the page
- length : number of bytes to change, from 1 to 8
- data : the new data to insert (in hex, in the form '0xAABBCC' – example three-byte string)
- directORbufferpool : whether to bypass the buffer pool or not (0/1)
마지막 directORbufferpool 에서 1의 값을 사용할 경우 다음과 같이 동작한다.
- Checkpoints the database and flushes all its pages out of the buffer pool
- Unhooks SQL Server's FCB (File Control Block) from the data file
- Creates its own FCB for the file
- Does a direct read of the page into DBCC's memory
- Modifies the page directly
- Writes the page directly to disk, bypassing the buffer pool and any page protection generation (i.e. not recalculating the page checksum)
- Fixes up the FCBs again
실습용 데이터베이스와 테이블을 생성하고 인덱스 할당 정보를 확인 한다. (페이지 번호는 사용자마다 다를 수 있다.)
CREATE DATABASE [CorruptDB]; GO
USE [CorruptDB]; GO
CREATE TABLE [Test] ( [c1] INT IDENTITY, [c2] CHAR (8000) DEFAULT 'a'); GO
INSERT INTO [Test] DEFAULT VALUES; GO
DBCC IND (N'CorruptDB', N'Test', -1); GO |
데이터 페이지 (1:118)을 손상 시켜보도록 한다.
ALTER DATABASE [CorruptDB] SET SINGLE_USER; GO
DBCC WRITEPAGE (N'CorruptDB', 1, 118, 4000, 1, 0x45, 1); GO |
테이블을 조회하면 체크섬 오류와 함께 논리적은 I/O 오류를 반환한다.
SELECT * FROM [Test]; GO |
메시지 824, 수준 24, 상태 2, 줄 1 SQL Server에서 일관성 기반의 논리적인 I/O 오류가 검색되었습니다: 체크섬이 잘못되었습니다(예상: 0x43328b7b, 실제: 0x4332ee7b).. 파일 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\CorruptDB.mdf'의 오프셋 0x000000000ec000에서 데이터베이스 ID 7에 있는 페이지 (1:118)의 읽기 중 이 오류가 발생했습니다. 자세한 내용은 SQL Server 오류 로그 또는 시스템 이벤트 로그의 추가 메시지에서 확인할 수 있습니다. 이는 데이터베이스 무결성을 위협하는 심각한 오류 상태이며 즉시 수정해야 합니다. 전체 데이터베이스 일관성 검사(DBCC CHECKDB)를 완료하십시오. 이 오류는 다양한 요인으로 인해 발생할 수 있습니다. 자세한 내용은 SQL Server 온라인 설명서를 참조하십시오. |
에러 로그를 보면 다음과 같이 기록되어 있다.
EXEC xp_readerrorlog; GO |
[참고자료]
DBCC WRITEPAGE: an introduction : http://www.sqlskills.com/blogs/paul/dbcc-writepage/
강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp