데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

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

No. Subject Author Date Views
1931 로그 파일이 많으면 왜 안 좋은가 jevida(강성욱) 2016.10.13 2051
1930 트랜잭션 백업 실패와 전체 백업 성공 그리고 대처 방안 jevida(강성욱) 2016.10.13 1542
1929 Fast recovery 와 로그 잠금 jevida(강성욱) 2016.10.13 2021
1928 고스트 클린업 jevida(강성욱) 2016.10.13 2247
1927 페이지 분할이 발생 하였을 때 롤백을 하면 어떻게 될까? jevida(강성욱) 2016.10.13 1646
» DBCC WRITEPAGE - DBCC 명령을 사용한 데이터 파괴하기 jevida(강성욱) 2016.10.13 1641
1925 SQL Server Backup Error 3023 jevida(강성욱) 2016.10.13 2254
1924 Delete 작업과 페이지 offset 변화 jevida(강성욱) 2016.10.13 1477
1923 트랜잭션 로그 및 LSN을 이용한 삭제된 데이터 복구 jevida(강성욱) 2016.10.13 5116
1922 PFX 형식의 인증서를 SQL Server에서 사용하기 jevida(강성욱) 2016.10.13 1150
1921 SQL Server NUMA 메모리 노드와 Operating System 접근 jevida(강성욱) 2016.10.13 1292
1920 SQL Server 에러 핸들링 비용 비교 jevida(강성욱) 2016.10.13 1302
1919 압축 백업 시 Checksum 옵션으로 손상 확인하기 jevida(강성욱) 2016.10.13 1634
1918 SQL Server 2012 Memory Manager 구성 jevida(강성욱) 2016.10.13 1263
1917 SQL Server Memory Manager 변화 jevida(강성욱) 2016.10.13 1483
1916 Ring_Buffer_Resource_Monitor jevida(강성욱) 2016.10.13 1000
1915 SQL Server 프로파일러 템플릿 만들기 jevida(강성욱) 2016.10.13 1337
1914 SQL Server 메모리 병목 현상 식별 jevida(강성욱) 2016.10.13 1783
1913 SQL Server 시작 옵션 사용 jevida(강성욱) 2016.10.13 1801
1912 Ring buffer를 활용한 External Memory Pressure 확인 jevida(강성욱) 2016.10.12 1280





XE Login