손상으로 인해 손상된 데이터베이스를 복구하려고했습니다 (I / O 실패로 인해 수정되었습니다). 데이터베이스 나 데이터베이스에 익숙하지 않습니다.
오래된 (~ 3 주) 전체 백업과 일련의 트랜잭션 로그가 제공되었지만 트랜잭션 로그가 누락되어 특정 날짜까지만 복구 할 수 있습니다. 2.5 주간의 데이터 누락이 있습니다 (이 데이터베이스에 지속적으로 추가되는 많은 데이터가 있습니다).
또한 손상된 데이터베이스의 사본을 받았습니다 (액세스 가능하지만 많은 페이지가 손상되거나 누락되었습니다).
나는 전형적인 DBCC CHECKDB
명령을 시도했다 repair_allow_data_loss
.
많은 사람들이 데이터베이스에오고 나서 (db는 1.5 테라 바이트 작은 괴물이며 내가하는 모든 작업은 느리고 시간이 걸립니다), 손상된 페이지에 대해 마지막으로 알려진 백업에서 온라인 페이지 복원을 시도했습니다.
그렇게하기 위해 출력 RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'
에서 많은 명령 을 작성하는 스크립트를 작성했습니다 DBCC CHECKDB
(일반적으로 정규 표현식과 고유) ... 지금까지는 좋았습니다 .1000 페이지 한도에 도달했다고 말한 시점까지 작동했습니다. restore 명령 당 파일 당 (이 db에는 8 개의 파일이 있습니다).
따라서 "온라인 복원 완료"를 요청하지만 그 방법을 잃어 버렸습니다 ... 꼬리 로그가 없거나 시작한 전체 백업보다 더 완벽한 것은 없습니다. 기본적으로 나머지 페이지를 계속 사용하기 위해 복원을 완료하는 방법을 모르겠습니다.
나는 시도 RESTORE DATABASE <foo> WITH RECOVERY
했지만 작동하지 않았다, 그것은 내가 가지고 있지 않은 로그를 요구한다.
아무도 내가 여기서 무엇을 회복하려고 노력할 수 있는지에 대한 팁이 있습니까? 또는 온라인 복원을 "완료"하여 더 많은 페이지를 계속 복구 할 수있는 방법은 무엇입니까? 오프라인 복원을 시도해도 (기본적으로 WITH NORECOVERY
모든 것을 추가 한 다음 마지막에 다시 가져 오려고 하면) 동일한 문제가 발생 합니까?
데이터베이스를 직접 작성하는 것은 기본적으로 취소 할 수 없습니다. 수백만 개의 행이있는 수백 개의 테이블이 있으며 그 중 어떤 것이 무엇인지에 대한 명확한 의미는 없습니다. 손상된 DB는 SELECT
약 백만 행 후에 쿼리에서 실패 하지만 어디에서 해결할 수 있는지 잘 모르겠습니다. 비 클러스터형 인덱스를 모두 다시 작성하려고했지만 행 데이터가있는 손상된 페이지가 있으므로 작동하지 않습니다.
일부 데이터 손실은 허용되지만 DB의 일관성은 최소한 달성하려고 시도해야합니다.
손상된 데이터베이스는 여전히 온라인 상태이며 클라이언트는이 데이터베이스에서 작업하고 있으므로 (새 데이터를 계속 가져옵니다) 실험실 벤치에서 수행하는 모든 프로세스는 나중에 프로덕션 데이터베이스에서 재현 할 수 있어야합니다 (중단 시간이 어려울 것입니다).
이것은 SQL Server 2014 Enterprise입니다
추신 : 나는 DBA가 아닙니다 ... 나는 프로그래머이지만 클라이언트는 "전문가"SQL 재해 복구 서비스를 시도했지만 포기했습니다. 그래서 그것을 보아서 내가 할 수 있는지 보았습니다. 무엇이든하세요.
업데이트 : 많은 테스트 후에 페이지 단위로 페이지를 복원하는 것이 번거 로움이 없었으므로 아이디어를 버렸습니다. 수동 복구 (손상된 테이블에서 누락 된 레코드를 수동으로 선택하고 마지막으로 성공한 백업에 삽입)를 위해 몇 가지 자동화 된 도구 (수백, 수백 개의 테이블이 있음)를 수행하려고합니다.