디스크 장애에 의해 SQL Server 데이터베이스 파일이 손상되는 시나리오에 대해서 생각해 봤습니다. 만약 이러한 손상이 발생한다면 데이터 파일 손상(mdf, ndf)과 트랜잭션 로그 파일 손상(ldf)으로 나눌 수 있겠죠? 복구 절차에 대해서 아래와 같이 정리하였습니다.
1. 데이터 파일이 손상된 경우 복구 절차
장애 발생으로 인해 이미 데이터베이스 액세스가 실패되는 상황이라면 현재의 트랜잭션 로그를 백업 받을 수 없으므로 마지막 전체(Full) 또는 트랜잭션 로그를 백업 받은 시점까지 복원 가능합니다. (단, 데이터베이스 복구 모델이 ‘Full’ 로 설정되어 있어야 합니다)
가. 데이터베이스 오프라인 상태로 만들기
ALTER DATABASE [LAIGODB] SET OFFLINE
나. 데이터베이스 분리
sp_detach_db [LAIGODB]
다. 손상된 파일 이름 변경
탐색기를 사용하여 기존 MDF,NDF,LDF 파일의 이름을 변경하거나 다른 폴더로 이동합니다.
라. 백업 세트를 사용하여 데이터베이스 복구 (마지막 트랜잭션 로그 백업 시점까지 복원 가능)
RESTORE DATABASE [LAIGODB] FROM DISK = 'os_file_name' WITH NORECOVERY
// Full Backup이후 복구 시점까지의 트랜잭션 로그 복원
RESTORE LOG [LAIGODB] FROM DISK = ‘os_file_name‘ WITH NORECOVERY
...
RESTORE LOG [LAIGODB] FROM DISK = ‘os_file_name’ WITH RECOVERY
// Full Backup이후 복구 시점까지의 트랜잭션 로그 복원
RESTORE LOG [LAIGODB] FROM DISK = ‘os_file_name‘ WITH NORECOVERY
...
RESTORE LOG [LAIGODB] FROM DISK = ‘os_file_name’ WITH RECOVERY
2. 트랜잭션 로그 파일이 손상된 경우 복구 절차
가. 트랜잭션 로그 파일 생성
ALTER DATABASE [LAIGODB] REBUILD LOG ON (NAME=logical_file_name, FILENAME= 'os_file_name')
나. 액세스 제한을 멀티 유저로 변경
ALTER DTABASE [LAIGODB] SET MULTI_USER
복원이 완료되면 일관성 검사 및 로그 설정 등의 작업이 추가적으로 이뤄져야겠습니다.
아,.... 이런 일은 발생하지 않아야 할 텐데 말이죠.....;;;
[참고자료]
데이터베이스 시점 복원 방법
http://laigo.kr/61
작성자 : Lai Go / 작성일자 : 2011.03.16