RECOVERY PENDING
- The database will be in this state if SQL Server knows that recovery needs to be run on the database but something is preventing recovery from starting. This is different from SUSPECT because there's nothing to say that recovery is going to fail - it just hasn't started yet.
- An example of this is when the database wasn't cleanly shut down (i.e. there was at least one uncommitted transaction active at the time the database was shut down) and the log file has been deleted
RECOVERY PENDING 상태는 트랜잭션 로그 파일의 변형이나 손상으로 발생 한다고 합니다. 이런 일이 어제 발생하고 말았네요. 선거를 무사히 마치고 출근을 위해 잘려고 하는데 미국 본사에 급하게 연락와 DB 상태 확인해보니 RECOVERY PENDING 상태 였습니다. 것도 2개의 DB 가 ^^
시스템 환경
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600 Enterprise Edition (64-bit)
해결 방법
1. 트랜잭션 로그 리빌드 (기존 Log 파일을 다른 이름으로 변경하거나 복사 해놓았아야 합니다.)
ALTER DATABASE COFE REBUILD LOG ON (NAME=COFE_Log, FILENAME='D:\SQLDATA\COFE_log.ldf')
Warning: The log for database 'COFE' has been rebuilt. Transactional consistency has been lost. The RESTORE chain was broken, and the server no longer has context on the previous log files, so you will need to know what they were. You should run DBCC CHECKDB to validate physical consistency. The database has been put in dbo-only mode. When you are ready to make the database available for use, you will need to reset database options and delete any extra log files.
경고: 데이터베이스 'COFE'의 로그가 다시 작성되었습니다. 트랜잭션에 일관성이 없습니다. RESTORE 체인이 끊어져 서버에 이전 로그 파일에 대한 컨텍스트가 더 이상 없으므로 해당 로그 파일이 어떤 파일인지 알아야 합니다. DBCC CHECKDB를 실행하여 물리적 일관성을 확인해야 합니다. 데이터베이스가 dbo 전용 모드로 전환되었습니다. 데이터베이스를 사용할 수 있는 준비가 되면 데이터베이스 옵션을 다시 설정하고 모든 추가 로그 파일을 삭제하십시오.
트랜잭션 로그 리빌드 후 Restricted User 로 변경 된 것을 볼수 있다.
2. 데이터베이스 CHECKDB 를 통한 일관성 오류 검사
DBCC CHECKDB('COFE')
3. Mode 변경
ALTER DATABASE COFE SET MULTI_USER
2번에서 일관성 오류가 난다면 문제의 Object_ID 나 에러 발생 난 곳에 테이블 명을 알수 있을 것이다.
SELECT OBJECT_NAME(12313214)
테이블 확인 후
DBCC checktable(table)
checktable 을 통해 에러를 재확인 한다.
데이터베이스 유저 모드를 싱글로 변경 하고
ALTER DATABASE COFE SET SINGLE_USER
go
DBCC checktable(table, repair_rebuild)
go
후에도 계속 에러나 난다면 아래를 실행을 고려해야 합니다.
DBCC checktable(table, repair_allow_data_loss)
go
DBCC checktable 의 옵션에 REPAIR_FAST ,REPAIR_REBUILD ,REPAIR_ALLOW_DATA_LOSS
3가지 있습니다.
REPAIR_FAST or REPAIR_REBUILD 먼저 해보고 REPAIR_ALLOW_DATA_LOSS 로 하십시오.
그리고 REPAIR_ALLOW_DATA_LOSS 는 데이터 손실이 일어 날수 있음을 인지하고 계셔야 합니다.