차등 백업을 복원하면 DEFUNCT 로그 파일이 생성됩니까?


11

여기 내 문제가 있습니다. 전체 복원을 통해 데이터베이스를 새 서버로 옮긴 다음 빠른 차등 백업 / 복원으로 컷 오버하려고합니다. 문제없이 전체 복원을 수행 할 수 있지만 차등 백업을 복원 할 때 다음 경고가 표시됩니다.

메시지 3127, 수준 16, 상태 1, 줄 1 복원 된 데이터베이스 'DatabaseName'의 'Database_Log2'파일이 데이터베이스가 단순 복구 모델을 사용하고 있으며 파일에 읽기 / 쓰기 액세스 권한이 있기 때문에 사용하지 않는 상태로 남아 있습니다. 따라서 단편 복원으로 읽기 전용 파일 만 복구 할 수 있습니다.

데이터베이스가 복원되어 온라인으로 간주되지만 다음 오류와 함께이 DEFUNCT 파일로 인해 백업 작업이 실패합니다.

메시지 3636, 수준 16, 상태 2, 줄 1 데이터베이스 ID 10 파일 ID 6에 대한 'BackupMetadata'메타 데이터를 처리하는 동안 오류가 발생했습니다. 메시지 3046, 수준 16, 상태 2, 줄 1 불일치 한 메타 데이터가 발생했습니다. 가능한 백업 조작은 WITH CONTINUE_AFTER_ERROR 또는 NO_TRUNCATE 옵션을 사용하는 테일 로그 백업입니다. 메시지 3013, 수준 16, 상태 1, 줄 1 BACKUP DATABASE가 비정상적으로 종료됩니다.

전체 및 차등에서 RESTORE FILELISTONLY를 수행하면 소스 데이터베이스의 sys.database_files에서 보는 것과 일치하는 동일한 출력을 제공합니다. 서버는 Developer Edition에서 SQL2012 SP1입니다.

전체 백업을 수행 한 후 즉시 차등을 수행하고 이러한 파일을 동일한 서버의 다른 데이터베이스에 복원하고 정확히 동일한 문제를 볼 수 있으므로 차등을 만드는 방법에 문제가 있습니다. WITH RECOVERY로 전체 백업을 복원해도 아무런 문제가 없습니다. 이 파일이이 데이터베이스에 존재했는지는 모르겠지만이 파일이 존재하여 오래 전에 삭제되었을 수도 있습니다. 복원 된 데이터베이스에서 sys.database_files를 쿼리하면 DEFUNCT 파일에 drop_lsn 값이 있으며이를 확인하는 것 같습니다. 현재 소스 데이터베이스에는 하나의 파일 그룹 (PRIMARY), 4 개의 데이터 파일 및 하나의 로그 파일 만 있습니다.

어떤 아이디어?


백업 및 복원에 사용중인 내용을 알려주시겠습니까?
Jon Seigel

평범한 것은 없습니다. 디스크 DatabaseName 데이터베이스 복원 = 'D : \ Full.bak'NORECOVERY 나서 디스크 DatabaseName 데이터베이스 복원 REPLACE WITH = 'D : \ Diff.bak'RECOVERY WITH
FilamentUnities

답변:


5

SQL 2012 SP1 Developer Edition에서 테스트 한이 단계를 재현하는 단계는 다음과 같습니다. 요약하면, 모델 데이터베이스가 단순 복구 상태 인 동안 추가 로그 파일이 존재하는 동안 전체 백업이 수행 된 상태에서 SQL 2012에서 작성된 데이터베이스는 추가 로그 파일이 다음과 같은 경우 사용 가능한 차등 백업을 작성할 수 없습니다. 삭제되었습니다.

ALTER DATABASE [model] SET RECOVERY SIMPLE
GO
CREATE DATABASE [DefunctTest]
GO
ALTER DATABASE [DefunctTest] ADD LOG FILE ( NAME = N'DefunctTest_log2', FILENAME = N'D:\DefunctTest_log2.ldf' , SIZE = 25600KB , FILEGROWTH = 10%)
GO
BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestPostLogFile.bak' WITH INIT
GO
ALTER DATABASE [DefunctTest]  REMOVE FILE [DefunctTest_log2]
GO

BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestFull.bak' WITH INIT
GO
BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestDiff.bak' WITH DIFFERENTIAL, INIT
GO
--Show that the backups only have the one log file.
RESTORE FILELISTONLY FROM DISK = 'D:\DefunctTestFull.bak'
RESTORE FILELISTONLY FROM DISK = 'D:\DefunctTestDiff.bak'
GO
RESTORE DATABASE [DefunctTest2] FROM DISK = 'D:\DefunctTestFull.bak' WITH 
MOVE 'DefunctTest' TO 'D:\DefunctTest2.mdf',
MOVE 'DefunctTest_log' TO 'D:\DefunctTest2_log.ldf', REPLACE, NORECOVERY
GO
--This restore will have the error.
RESTORE DATABASE [DefunctTest2] FROM DISK = 'D:\DefunctTestDiff.bak' WITH RECOVERY
GO

USE [DefunctTest2]
SELECT * FROM sys.database_files
GO

이 버그에 대한 Connect 항목을 여기에 제출했습니다 . 이 기능이없는 파일을 제거 할 수있는 유일한 방법은 데이터베이스를 분리하고 ATTACH_REBUILD_LOG로 다시 연결하는 것입니다.

UPDATE : 내 생식 스크립트에이 시나리오를 생성하는 버그가이 KB에 의해 고정 된 것으로 보인다 https://support.microsoft.com/en-us/kb/2830400 . 의견에서 SQL2012 / 2014에 대한 추가 수정 사항을 사용할 수있는 것처럼 보이며 시나리오는 매우 유사합니다. https://support.microsoft.com/en-us/kb/3009576


사람들이 재현 할 수 있도록 연결 주석에 스크립트를 포함시킵니다.
케네스 피셔

1
나는 11.0.3412 (CU9에 대한 SP1) 2012 Enterprise Edition을 SQL Server에서 스크립트를 실행하는 오류를 얻을하지 않습니다

세부 사항 단추를 클릭하면 repro 스크립트가 연결 항목에 있습니다.
FilamentUnities

1
Shawn, CU의 수정 사항을 살펴본 결과 아마도이 동작이 수정 된 것 같습니다. support.microsoft.com/kb/2830400
FilamentUnities

2
나는 지난 주에이 전투에 참여했고이 스레드는 그것을 정리하는 데 도움이됩니다. 감사합니다. 수정 사항은 SQL 2012 SP2 CU3에있는 것 같습니다 : support.microsoft.com/en-us/kb/3009576
Richard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.