2007~2011/SQL Server2009.08.17 16:47
SQL Server 2000 suspect 발생 후 데이터베이스가 Detach 되었습니다. 데이터 파일(mdf)을 사용하여 attach(연결)을 시도하였으나 테이블 오류 발생으로 인해 연결이 되지 않는 상황입니다. 데이터베이스 백업본이 없는 아주 불행한 상황이라면 아래 방법을 시도해 볼 수 있지만 경우에 따라 데이터 손실은 감안해야 합니다. 


[환경]
SQL Server 2000 SP4 EE (8.00.2187)


[현상]
LAIGO 데이터베이스에서 SUSPECT(주의대상) 가 발생하였고 일시 중지를 선택한 뒤 SQL Server 를 재시작 하였는데 EM에서 해당 데이터베이스 목록이 사라졌습니다. 데이터베이스 SUSPECT 후 데이터베이스 파일(MDF)을 사용하여 데이터베이스 연결을 시도하였으나 테이블 오류로 연결이 실패하였습니다.

EXEC sp_attach_db @dbname = N'LAIGO', @filename1 = N'D:\Data\LAIGO_Data.mdf' 

서버: 메시지 8941, 수준 22, 상태 102, 줄 1
테이블 오류: 개체 ID 2146822710, 인덱스 ID 6, (1:3292407) 페이지. 테스트(offset + len < PAGESIZE)하지 못했습니다. 5 슬롯, 0x4e4 오프셋이 유효하지 않습니다.
'LAIGO'(7) 데이터베이스에서 10개의 트랜잭션이 롤포워드되었습니다.

연결 끊김


[해결방법]
같은 이름의 새로운 데이터베이스 생성한 뒤 기존의 MDF 파일로 REPLACE 하고 LOG FILE 을 REBUILD 합니다. 

-- Application 또는 사용자가 접속하지 않도록 로그인 계정을 우선 차단합니다.

-- error log 를 점검합니다. 
Sp_readerrorlog 

-- 데이터, 로그 이름 및 파일 위치 확인 
DBCC CHECKPrimaryFile(N'D:\Data\LAIGO_DATA.MDF',3)

status      fileid name             filename                                                                          
----------------------------------------------------------------------------------------------------------
32770       1      laigo_Data       D:\Data\laigo_Data.MDF                    
32834       2      laigo_Log        D:\Data\laigo_Log.LDF                       


-- 같은 이름의 데이터베이스를 생성하기 위해 laigo_Data.MDF, laigo_Log.LDF 파일을 임의의 이름으로 변경합니다. 

-- MDF Replace 를 위한 깡통 데이터베이스 생성 
CREATE DATABASE LAIGO

ON PRIMARY (
                      NAME='LAIGO_DATA', FILENAME = 'D:\Data\LAIGO_DATA.MDF')

LOG ON (
                      NAME='LAIGO_LOG', FILENAME = 'D:\Data\LAIGO_LOG.LDF')
GO


-- SQL 서비스 중지 후 새로 생성된 D:\Data\LAIGO_DATA.MDF 파일을 삭제하고 기존의 MDF 로 REPLACE 합니다. 
-- SQL 서비스를 시작합니다. 

-- 시스템 카탈로그 업데이트 허용 설정
SP_CONFIGURE 'ALLOW UPDATES', 1
RECONFIGURE WITH OVERRIDE 


-- LAIGO 데이터베이스 응급 모드로 전환 
UPDATE SYSDATABASES SET STATUS = STATUS | 32768 WHERE DBID=5


-- 아래와 같이 LOG FILE REBUILD 를 수행하면 LAIGO 데이터베이스는 응급모드에서 'DBO 사용만' 허용되도록 변경됩니다.
DBCC REBUILD_LOG('LAIGO','D:\Data\LAIGO_LOG.LDF')


-- 데이터베이스 개체 할당과 구조적 무결성을 점검합니다. 
USE LAIGO
GO
DBCC CHECKDB 

-- 상황에 따라 옵션을 부여할 수 있습니다. (관련 문서 참조)
DBCC CHECKDB (LAIGO, 'REPAIR_ALLOW_DATA_LOSS') 


-- 오류 복구가 완료되었다면 사용자 접근을 허용합니다.
ALTER DATABASE LAIGO SET MULTI_USER


-- 시스템 카탈로그를 수정할 수 없도록 변경합니다. 
SP_CONFIGURE 'ALLOW UPDATES', 0
RECONFIGURE WITH OVERRIDE



[참고자료]
SQL Server 2000 Database Suspect (주의대상) 복구

SQL Server 2005 Database suspect (주의대상) 복구


작성자 : Lai Go / 작성일자 : 2009.08.17
Posted by Lai Go