나는 같은 문제가 있고 그것을 해결했다고 생각하지만 그것을 확인하기 위해 완전히 테스트 할 수는 없었습니다.
문제는 로그 파일에있는 VLF 수와 관련이 있으며 크기는 아닙니다. 로그 파일이 크면 자동 증가 이벤트를 통해 유기적으로 증가했으며 의도적으로 계획된 성장이 아니었을 수 있습니다. 이 경우 로그 파일 내에 수천 개의 VLF가있을 수 있습니다.
여기에 내가 사용한 VLF 수를 확인하는 쿼리가 있습니다 .
Create Table #stage(
FileID int
, FileSize bigint
, StartOffset bigint
, FSeqNo bigint
, [Status] bigint
, Parity bigint
, CreateLSN numeric(38));
Create Table #results(
Database_Name sysname
, VLF_count int
);
Exec sp_msforeachdb N'Use ?;
Insert Into #stage
Exec sp_executeSQL N''DBCC LogInfo(?)'';
Insert Into #results
Select DB_Name(), Count(*)
From #stage;
Truncate Table #stage;'
Select *
From #results
Order By VLF_count Desc;
Drop Table #stage;
Drop Table #results;
VLF에 대한 자세한 설명은이 링크를 참조하십시오 .
문제는 VLF가 너무 많아서 SQL 서버가 상태를 평가 한 다음 데이터베이스를 복구하는 데 오랜 시간이 걸린다는 것입니다. 로그 파일을 가능한 가장 작은 크기, 종종 로그 파일에서 생성 된 첫 번째 VLF의 크기로 축소하면 즉시 의도적으로 다시 커져서 올바른 수의 VLF를 생성 할 수 있습니다. 16).
이것이 완료되면 데이터베이스 복구 속도가 훨씬 빠르다는 것을 알 수 있습니다.
자체 VLF 문제를 해결 한 후 프로덕션 인스턴스의 장애 조치를 테스트 할 기회가 없었으므로 이것이 문제의 근본 원인인지 확인할 수 있으면 매우 궁금합니다. 실험적으로 나는 스테이징 환경에서 복원하는 데 걸리는 시간이 이렇게 희망적으로 크게 줄어드는 것을 보았습니다.