SQL Server/SQL Server Tip

DBCC WRITEPAGE - DBCC 명령을 사용한 데이터 파괴하기

SungWookKang 2015. 7. 23. 09:45
반응형

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/

 

 

2014-02-14 / 강성욱 / http://sqlmvp.kr

 

반응형