본문 바로가기

IT/Database

[MSSQL]DB손상복구


업체에서 사용중 전원 OFF등에 의해 파일손상(CRC오류)됨, DB연결오류로 업무중단발생
다행히 LOG파일만 손상되어 복구가 가능하였고 MDF파일은 재사용가능했음(일부데이타누락)

일단 디스크복구를 돌려 재부팅후 CRC오류로 복사안돼는현상 제거

[아래는 로그파일만 손상됐을경우에 한함]

1) ‘주의대상’으로표시된데이터베이스에대해다음의쿼리문을수행하여 ‘응급복구’모드로설정합니다.

   ALTER DATABASE database_name SET EMERGENCY

2) SQL Server를중지합니다.
  데이터베이스파일이저장된폴더에서데이터베이스의트랜잭션로그파일(.ldf)의이름을변경합니다.
  SQL Server를재시작합니다.

3) SSMS로접속하여다음명령을수행합니다.

   ALTER DATABASEdatabase_nameREBUILD LOG ON (NAME=logical_log_name, FILENAME=\'C:\\Program Files\\Microsoft SQL Server\\MSSQL.1\\MSSQL\\Data\\physical_log_name.ldf\')


참조)
   logical_log_name : sp_helpdb database_name을수행하여 ldf파일의 name컬럼참조
   log_filename 항목에트랜잭션로그파일의  절대경로를지정합니다.

4) 다음의명령을수행하여데이터베이스의손상여부를확인합니다.

  DBCC CHECKDB(\'database_name\')

  상기의명령수행결과할당오류/일관성오류가발견되면다음의명령을수행하여오류를복구합니다.

   USE database_name

   GO

   ALTER DATABASE database_nameSET SINGLE_USER WITH ROLLBACK IMMEDIATE
   GO

   DBCC CHECKDB(\'database_name\', REPAIR_ALLOW_DATA_LOSS)
   GO

5) 모든오류가복구되면다음의명령을수행하여데이터베이스의상태를 ‘다중사용자’모드로변경합니다.

   ALTER DATABASE database_name SET MULTI_USER
 

주의)
1.  Checkpoint가 발생하지 않은 활성 트랜잭션은 아직 mdf에 기록되지 않은 상태이므로 Data 손실이 발생하게 됨.

2.  Mdf 파일이 손상된 경우에는 복구가 안될 수 있음.
( MS제품외에 LOG파일로 MDF복구를 지원하는 툴이 있는걸로 알고있음, 비쌈)