삭제 된 레코드를 다시 가져 오려면 어떻게합니까?


49

원격 SQL Server 2008 테이블에서 약 2,000,000 개의 레코드를 실수로 삭제했습니다. 서버에서 서버 측의 백업 파일에 대한 액세스 권한을 부여하지 않았습니다.

이 기록들을 되 찾을 방법이 있습니까?


18
마지막으로 백업을 테스트 한 시간은 언제입니까?
Joe

20
마지막으로 백업 복원을 테스트 한 시간은 언제입니까?
datagod

답변:


116

데이터베이스가 전체 복구 모드입니까?

  • 그렇다면 트랜잭션 로그 백업을 수행하고 있습니까?

    • 그렇다면 Quest LiteSpeed, Red Gate SQL Backup 또는 Idera SQLSafe와 같은 백업 유틸리티가 있습니까?
      • 그렇다면 이러한 유틸리티는 백업 파일 (전체 및 트랜잭션 로그 포함)에서 객체를 삭제 취소 할 수 있지만 사용 방법을 설명하는 것은 여기서 할 수있는 범위를 벗어납니다. 지침은 공급 업체에 문의하십시오.
      • 그렇지 않은 경우 전체 백업 및 트랜잭션 로그를 다른 이름의 데이터베이스로 복원하십시오. (기존 데이터베이스를 덮어 쓰지 마십시오.) 삭제하기 전에 객체의 최신 사본을 얻을 수 있지만 restore 명령의 stopat 부분을 사용하여 지정해야합니다. 명령 복원을 중지 할시기 삭제가 발생하기 전에 중지해야합니다.
    • 그렇지 않다면 Quest LiteSpeed ​​또는 Apex SQL Log와 같은 로그 리더 유틸리티의 사본을 받으십시오. 이 유틸리티는 데이터베이스 서버에 연결하고 로그 파일을 검사하며 트랜잭션 실행을 취소 할 수 있습니다. 데모 버전이 작동하는지 확실하지 않지만 유료 버전은 확실히 작동합니다.
  • 없는 경우 (전체 복구 모드가 아닌 경우) 마지막 전체 백업을 다른 이름의 데이터베이스로 복원하십시오. (이미 가지고있는 데이터베이스를 덮어 쓰지 마십시오.) 백업 시점에 온라인 상태였던 레코드를 복원 할 수 있지만 이후 모든 변경 사항을 잃게됩니다.


4
좋은 답변은 감사 또는 변경 내용 추적이있는 경우 일반적으로 하나의 테이블 만 영향을 받았을 때 해당 테이블에서 데이터를 다시 가져 오는 것이 가장 쉽다는 것입니다. 물론 위의 일부 또는 전부에 대한 답변이 아니라면 레코드를 최대한 복원 한 후 백업 프로세스를 수정하고 프로덕션 데이터에 액세스 할 수있는 사람을 수정하십시오.
HLGEM

단순 모드 인 경우 일부 페이지에는 여전히 행이 실제로 존재할 수 있습니다. 아마도 그들 중 일부는 (매우 높은 시간 및 / 또는 돈 비용으로) 복구 될 수 있습니다.
usr

참고로 ApexSQL 복구 시간 제한 외에도 평가 버전은 복구에 사용 가능한 총 행 중 10 개 행 중 1 개만 복구합니다 ( apexsql.com/faqs/faqs_recover.aspx )
Sameer

30

SQL Server는 삭제 된 각 레코드에 대한 로그를 유지합니다. fn_dblogSQL Server 기능을 통해 이러한 로그를 쿼리 할 수 ​​있습니다 .

SELECT [RowLog Contents 0] 
FROM   sys.fn_dblog(NULL, NULL) 
WHERE  
       AllocUnitName = 'dbo.TableName'        
   AND Context IN ( 'LCX_MARK_AS_GHOST', 'LCX_HEAP' )        
   AND Operation in ( 'LOP_DELETE_ROWS' )   
;

그러나이 로그는 16 진 형식이므로이 16 진 형식을 실제 데이터로 변환해야합니다.

아래 기사는 위에서 정의한 방식으로 삭제 된 레코드를 복구하는 데 도움이됩니다.

http://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/


3
이것은 꽤 멋지다. 이 조건은 어떤 조건에서 작동합니까 (또는 작동하지 않습니까)?
Nick Chammas

3
@NickChammas-활성 로그에있는 항목 만 복구 할 수 있으므로 간단한 복구 모델의 경우 체크 포인트가 발생하지 않아야합니다. 또한 현재 스냅 샷 격리가있는 데이터베이스에서는 제대로 작동하지 않는 것처럼 보이지만 쉽게 해결할 수 있습니다. @user1059637-코드에 기능을 추가하는 사람들에 대한 당신의 태도는 무엇입니까?
Martin Smith

@MartinSmith, 이제 스냅 샷 격리와도 완벽하게 작동합니다.
user1059637

22

안타깝게도 더 많은 정보가 없으면 도움을 드릴 수 없습니다. 그러나 귀하의 질문에 따르면 귀하의 데이터베이스에서 2 백만 개의 레코드가 삭제 된 것으로 나타났습니다. 데이터베이스에 전체 로깅이없고 특정 도구를 구입하지 않으면이 정보를 복구 할 수 없습니다.

자신의 생각과 레코드를 되돌릴 수 없다고 생각하는 이유를 설명하고 데이터베이스의 구성을 설명 할 수 있다면 좀 더 도움이 될 수 있습니다.

몇 가지 일반적인 조언 : 2 백만 개의 레코드를 삭제했다고 생각하면 아마 약간 당황했을 것입니다. 따라서 5 분 휴식을 취하고 진정한 다음 문제를 다시 방문해야합니다. 또한 합리적인 경우 (2am에 누군가를 깨우지 말고) 해결책을 찾고 있다면 상사에게 즉시 알려야합니다. 열렬히 회복하고 잠재적으로 문제를 악화시키고 세부 사항을 숨기는 것보다 일어난 일을 인정하는 것이 좋습니다. 상사가 어떤 식 으로든 도울 수 있다는 것을 알고 있으면 문제를 해결하는 데 도움이됩니다. 내가 말했듯이, 몇 가지 일반적인 조언.


10
5 분 휴식으로 좋은 생각입니다. 항상 작동합니다. 집중하는 데 도움이됩니다. :-) 거기에 있었다.
John aka hot2use
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.