DB 장애는 절대 나면 안되지만 노후가 원인인 disk fault를 제외하고도 SW 혹은 OS 레벨적인 문제로 인해 데이터, 혹은 데이터 파일에 문제가 생기는 경우가 있다.
이때 MSSQL은 DB 응급모드로 전환 -> DB 검사 -> 데이터 복구 -> DB Online 상태로 변경을 통해서 해결하면 된다.
단 복구까지 서비스 중단은 피할 수 없다.
--먼저 ALTER DATABASE를 통해 DB를 응급모드로 전환한다
ALTER DATABASE 데이터베이스명 SET EMERGENCY
GO
DBCC CHECKDB('데이터베이스명')
GO
CHECKDB를 통해 대략 해결할 수 있는 문제인지 파악이 가능하다. 물론 하드웨어적인 문제면 해결이 불가능하다.
-- SINGLE_USER 모드로 전환한다. (절대 세션을 닫지 않도록 조심하자)
ALTER DATABASE DB명 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
-- DBCC CHECKDB 옵션
1. REPAIR_FAST : 빠른 회복으로 데이터의 손실이 없다.
2. REPAIR_REBUILD : REPAIR_FAST가 하는 모든 작업을 수행하며 인덱스 재생성 등 빌드를 다시 하며 시간이 꽤 소요된다. 역시 데이터 손실이 없다.
3. REPAIR_ALLOW_DATA_LOSS : REPAIR_REBUILD가 수행하는 모든 작업과 할당 및 행, 페이지 오류, 손상된 텍스트 개체 등을 조회하며 손상된 곳을 재할당하며 데이터 손실이 있을 수 있다. 최후의 수단이라고 볼 수 있다.
-- DB 복구
DBCC CHECKDB('데이터베이스 명', REPAIR_FAST)
DBCC CHECKDB('데이터베이스 명', REPAIR_REBUILD)
DBCC CHECKDB('데이터베이스 명', REPAIR_ALLOW_DATA_LOSS)
순서대로 REPAIR_FAST -> REPAIR_REBUILD -> REPAIR_ALLOW_DATA_LOSS 를 수행하면 되며 REPAIR_ALLOW_DATA_LOSS까지 가지 않는다면 가장 BEST REPAIR 시나리오가 될 것이다.
참고로 시간이 부족할 때, 그리고 확실히 특정 테이블이 문제인 것을 알고 있다면 데이터베이스 레벨에서 복구가 아닌 테이블 레벨에서의 복구인 DBCC CHECKTABLE를 통해 복구를 해도 된다.
-- 복구 완료 후 MULTI_USER 모드로 변경한다.
ALTER DATABASE DB명 SET MULTI_USER
GO
-- 응급 모드가 자동 해제되지 않는다면 온라인 모드로 변환해준다.
ALTER DATABASE 데이터베이스명 SET ONLINE;
'Programming > MSSQL' 카테고리의 다른 글
MSSQL 백업 내역 조회하는 쿼리 (0) | 2018.08.01 |
---|---|
샤딩 vs 파티셔닝 (Sharding vs Partitioning) (0) | 2018.07.25 |
MSSQL에서 탭, 엔터 제거하기(\t \n \r 제거) (0) | 2018.07.19 |
MSSQL 백업파일로 DB 복원하기 (0) | 2018.07.17 |
클러스터드 인덱스 DROP 후 RECREATE 하기 (0) | 2018.07.16 |