복원 할 수 없음 (오류 3456)


9

이해하기 쉽지 않은 상황이 있으며 다른 사람들이 제안을 할 수 있는지이 포럼에서 물어볼 것이라고 생각했습니다.

Windows Server 2008R2 Enterprise에서 SQL Server 2008 R2 Standard SP3을 실행하고 있습니다.

데이터베이스에는 약간의 유지 관리가 필요했으며 다른 서버에서 복원해야했습니다. COPY_ONLY와 4 개의 tlog 백업 세트로 완료된 전체 DB 백업이 있습니다.

  1. 시작하기 전에 tlogbackup1을 작성하십시오.
  2. 에서 변경 FULLBULK_LOGGED복구 모델
  3. 새 파일 그룹 추가
  4. newfilegroup에 파일 추가
  5. newfilegroup을 기본값으로 설정
  6. 새 파일 그룹에서 테이블로 선택
  7. 원본 테이블 삭제
  8. 원본 파일 삭제
  9. 원본 파일 그룹 삭제
  10. 원래 테이블과 일치하도록 새 테이블의 이름을 변경하십시오.
  11. 원본 파일 그룹과 일치하도록 newfilegroup의 파일 이름 변경
  12. 원본 파일 이름과 일치하도록 카탈로그에서 파일 이름 변경
  13. 원본 파일 이름과 일치하도록 OS 수준에서 파일 이름 변경
  14. 기본 파일 그룹을 원본으로 설정
  15. DB를 온라인으로 가져 오기
  16. 에서 변경 BULK_LOGGEDFULL복구 모델
  17. 모든 단계가 완료되면 tlogbackup2를 작성하십시오.

복원 서버의 드라이브 문자 변경으로 인해 모든 백업의 복원에는 WITH MOVE를 사용해야합니다.

복구 단계 :

RESTORE database SomeDB FROM DISK = 'D:\REPRO\SomeDB.bak'   
WITH 
MOVE 'SystemData' TO 'D:\SQLDATA\SomeDB.mdf'
,MOVE 'SystemDataPDS' TO 'D:\SqlData\SomeDB.ndf'
,MOVE 'SystemData_log' TO 'D:\SQLLogs\SomeDB.LDF'
,NORECOVERY
,stats = 1

RESTORE LOG SomeDB FROM DISK = 'D:\REPRO\tlogbackup1.trn'   
WITH 
MOVE 'SystemData' TO 'D:\SQLDATA\SomeDB.mdf'
,MOVE 'SystemDataPDS' TO 'D:\SqlData\SomeDB.ndf'
,MOVE 'SystemData_log' TO 'D:\SQLLogs\SomeDB.LDF'
,NORECOVERY
,stats = 1

RESTORE LOG SomeDB FROM DISK = 'D:\REPRO\tlogbackup2.trn'   
WITH 
MOVE 'SystemData' TO 'D:\SQLDATA\SomeDB.mdf'
,MOVE 'SystemDataPDS' TO 'D:\SqlData\SomeDB.ndf'
,MOVE 'SystemData_log' TO 'D:\SQLLogs\SomeDB.LDF'
,NORECOVERY
,stats = 1

최종 로그 복원이 100 %에 도달 한 후 오류 3456과 함께 실패합니다.

파일 1의 'SystemData'파일 'SomeDB'데이터베이스에 대해 368 페이지를 처리했습니다.

파일 1의 'SystemDataPDS'파일 'SomeDB'데이터베이스에 대한 7656520 페이지를 처리했습니다.

파일 1의 'SystemData_log'파일 'SomeDB'데이터베이스에 대한 172430 페이지를 처리했습니다.

메시지 3456, 수준 16, 상태 1, 줄 1
트랜잭션 ID (0 : 1016710921), 페이지 (4 : 8088), 데이터베이스 'SomeDB'(데이터베이스 ID 6)에 대한 로그 레코드 (210388 : 123648 : 232)를 다시 실행할 수 없습니다. . 페이지 : LSN = (0 : 0 : 1), 유형 = 11. 로그 : OpCode = 4, 컨텍스트 11, PrevPageLSN : (210388 : 122007 : 1). 데이터베이스 백업에서 복원하거나 데이터베이스를 복구하십시오. 메시지 3013, 수준 16, 상태 1, 줄 1 복원 로그가 비정상적으로 종료됩니다.

전체 DB 백업이 정상인지 확인하기 위해 run을 복원했으며 CHECKDB오류가 없었습니다.

모든 의견을 환영합니다.

미리 감사드립니다.

네드 수달


1
왜 깨지지 않은 로그 체인을 가지고 있다고 생각하는지 자세히 설명해 주시겠습니까? 데이터베이스를 BULK_LOGGED 모드로 전환하고 스키마를 망치기 시작한 순간, 로그 체인이 끊어지지 않은 것에 대한 모든 베팅은 해제되었습니다.
Thomas Kejser 2019

답장 주셔서 감사합니다, 토마스 내 게시물의 제목이 잘못되었음을 알았습니다. 특정 시점 복구는 필요하지 않지만 4 번째 tlog 백업 종료시 전체 복원이 필요합니다. 따라서 BULK_LOGGED를 설정해도 아무런 문제가 발생하지 않아야합니다. 내가 수행 한 작업으로 인해 두 번째 tlog 백업이 실패한 원인을 알 수 없습니다. 모든 명령이 SQL Server에서 지원되었으며 더 작은 데이터베이스에서 동일한 단계 (같은 데이터는 아니지만)를 정확히 실행했습니다. 문제없이 두 번째 로그 백업을 복원합니다.
NedOtter

오류가 손상된 것 같습니다. 내부 오류입니다. 모든 백업 파일의 무결성을 확인할 수 있습니까? 체크섬이 있습니까?
usr

CHECKDB를 실행하여 전체 db 백업에 0 오류가 있는지 확인했습니다. CHECKSUM이 사용되었는지 확인해야합니다.
NedOtter

1
백업에 체크섬이 활성화되어 있으면 복원에도 체크섬을 사용해야합니다. 페이지 유형 11은 PFS 페이지이므로 수정할 수 없으며 전체 복원 만 수행 할 수 있습니다. 또한 복사 전용 백업이 수행 된 시점을 말하지 않습니다. 타임 라인에서 그 백업은 어디에 있었습니까?
Robert L Davis

답변:


9

오류 3456이 발생하는 이유를 이해하려면 조금 뒤로 물러서서 SQL Server가 이러한 복구 코너를 처리하는 방법을 이해해야합니다.

SQL Server가 작업을 다시 실행하고 해당 다시 실행이 페이지 수정 인 경우 빠른 검사를 수행합니다. 페이지 헤더에는 결국 PageLSN페이지가 기록 된 마지막 LSN을 나타내는 s가 표시됩니다. 이와 같이 생각하면 페이지는 마지막으로 수정 한 LSN을 추적합니다. 이것은입니다 PageLSN.

기록 된 페이지 수정 작업이있을 때마다 해당 로그 레코드에 몇 개의 LSN이 포함됩니다. 즉, 로그 레코드의 LSN (생각 ... 현재 LSN )을 표시 한 다음 이전 페이지 LSN ( PrevPageLSN앞으로 진행)을 갖습니다 . 따라서 페이지를 수정할 때 로그 레코드에 저장되는 데이터 중 하나는 페이지를 수정 하기 전에 페이지가 마지막 LSN 으로 표시하는 것 입니다.

이걸 생각 해봐 .. 차에 대한 작업이 필요하다. Mechanic John은 자동차에서 작동하며 엔진 베이에는 약간의 태그가 있으며 Mechanic John은 "John이이 자동차에서 마지막으로 작업했습니다"라고 씁니다. 다음에 차를 다른 상점으로 가져 가면 Mechanic Mark가 엔진 베이를보고 Mechanic John이이 차에서 마지막으로 작업 한 것을 확인합니다. 데이터 시트에이 정보를 씁니다. SQL Server에서도 마찬가지입니다.

다소 혼란 스러울 수 있으므로 순차적 인 페이지 수정, 그리고 그 관계 PageLSNPrevPageLSN관련 하여 아래 이미지를 살펴보십시오 .

여기에 이미지 설명을 입력하십시오

페이지의 작업 (복원, 복구, HA 등) 을 다시 실행 해야 할 때이 모든 것이 작동 하기 때문에 루프백 해 봅시다 . SQL Server가 페이지 작업을 다시 실행해야하는 경우 PageLSN페이지 PrevPageLSN의 로그 레코드에 포함 된 페이지가 일치 하는지 확인하기 위해 상태 검사를 수행 합니다. 동일하지 않으면 오류 3456이 발생합니다.

합니까 PageLSN는 동일 PrevPageLSN를 ? 아니??? 오류 3456 중지 및 발생 ...

다음과 같은 방법으로 오류 메시지를 분석해 보겠습니다.

트랜잭션 ID (0 : 1016710921)의 페이지 (4 : 8088), 데이터베이스 'SomeDB'(데이터베이스 ID 6)에 대한 로그 레코드 (210388 : 123648 : 232)를 다시 실행할 수 없습니다. 페이지 : LSN = (0 : 0 : 1) , 유형 = 11. 로그 : OpCode = 4, 컨텍스트 11, PrevPageLSN : (210388 : 122007 : 1) . 데이터베이스 백업에서 복원하거나 데이터베이스를 복구하십시오. 메시지 3013, 수준 16, 상태 1, 줄 1 복원 로그가 비정상적으로 종료됩니다.

불평등으로 인해 오류가 발생하는 두 가지 데이터를 굵게 표시했습니다. 우리 PageLSN0 : 0 : 1 (이것은 페이지의 헤더에 있음)이고 우리 PrevPageLSN210388 : 122007 : 1입니다 (이것은 다시 시도하려는 로그 레코드의 데이터에서 발견되었습니다). 이것들은 분명히 같지 않으므로 err3456입니다.

따라서이 이벤트 의 이유 를 찾으려면 여기에 차이가있는 이유를 찾으십시오. 4 : 8088 페이지의 수명주기를 추적하고 연결 해제 위치를 확인해야합니다. 불행히도 추가 정보 나 실제 문제 해결 없이는이 복구 작업의 배경 지식과 오류의 원인 외에 다른 방법으로는 할 수 없습니다.


나는 그것이 오래되었지만 여전히 좋은 것을 알고 있습니다. 철저한 설명에 감사드립니다!
RThomas 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.