본문 바로가기

운영/백업과 복원

손상된 데이터베이스 복구

728x90

테이블 단위로 최소한의 검사

DBCC CHECKTABLE ('스키마.테이블명') WITH PHYSICAL_ONLY; 

docs.microsoft.com/ko-kr/sql/t-sql/database-console-commands/dbcc-checktable-transact-sql?view=sql-server-ver15

 

DBCC CHECKTABLE (Transact-SQL) - SQL Server

DBCC CHECKTABLE(Transact-SQL)

docs.microsoft.com

REPAIR_ALLOW_DATA_LOSS 옵션

REPAIR_ALLOW_DATA_LOSS 옵션을 사용하여 LOSS가 발생하더라도 Repair를 진행한다. 이때 Nonclustered Index는 제거를 하고 진행해야 좀더 빠르게 진행이 가능하다. Nonclustered Index는 복구가 완료된 후 재 생성을 진행한다. DBCC CHECKTABLE ,REPAIR_ALLOW_DATA_LOSS는 싱글모드에서만 동작을 한다.

 

데이터베이스 단위로 모드를 전환할 수 있기 때문에 복구 절차를 잘 세워야 빠른 시간 안에 복구가 가능하다.

DBCC CHECKTABLE ('스키마.테이블명',REPAIR_ALLOW_DATA_LOSS)
USE master;
GO
ALTER DATABASE AdventureWorks2012
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE AdventureWorks2012
SET READ_ONLY;
GO
ALTER DATABASE AdventureWorks2012
SET MULTI_USER;
GO
DBCC execution completed. 
If DBCC printed error messages, contact your system administrator.
Msg 1505, Level 16, State 1, Line 4
The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name '스키마.테이블명' and the index name '인덱스명'. The duplicate key value is (XXXXXXXXXXXXXXXXXXXXXX).
DBCC results for '스키마.테이블명'.
Msg 8945, Level 16, State 1, Line 4
Table error: Object ID 112224396, index ID 1 will be rebuilt.
        Could not repair this error.
Msg 8936, Level 16, State 1, Line 4
Table error: Object ID 112224396, index ID 1, partition ID 72057609862119424, alloc unit ID 72057610070261760 (type In-row data). B-tree chain linkage mismatch. (20:112431056)->next = (6:23285346), but (6:23285346)->Prev = (24:33663870).
        The error has been repaired.

간혹, 위와 같이 UNIQUE INDEX에 중복값이 있는 경우가 있다. PK인데 중복값이 발생하여 정상적인 Repair가 진행되지 않는다. 

이럴 경우 select count로 조회하여 다시 확인해 보면,

SELECT COUNT(*) FROM 스키마.테이블명

아래와 같은 메시지가 발생하고 페이지가 손상된 것을 확인할 수 있다.

Msg 605, Level 21, State 3, Line 1
Attempt to fetch logical page (20:98670448) in database 5 failed. 
It belongs to allocation unit 72057605332271104 not to 72057611519459328.

이때는 PK 제약 조건을 제거하고 Duplicate key를 제거한 후 진행을 해야 한다. 이때 PK 제약 조건을 삭제하는 순간 Clustered Index도 제가가 되기 때문에 중복된 값을 제거하기 위해서는 Clustered Index를 재 생성해줘야 한다. 

테이블의 크기가 작은 경우는 문제가 되지 않지만, 테이블이 클 경우 중복된 값을 찾아 지우는 것도 만만치 않는 작업이 된다.

 

대략적인 복구 절차

728x90