2010-01-11 8 views
2

잘못된 데이터로 테이블을 업데이트 한 SQL 2008의 테이블에서 업데이트 문을 만들었습니다.테이블에서 이전 데이터를 복구하는 방법

DB에 대한 백업이 없습니다.

업데이트 된 중요한 날짜입니다.

어쨌든 내가 테이블에서 이전 데이터를 복구 할 수 있습니까?

감사

SNA

+6

이것은 당신을위한 교훈입니다. 항상 광범위한 내용을 변경하기 전에 업데이트 문을 테스트하고 항상 백업을 가져옵니다. – Welbog

+0

@Welbog : 아마도 광범위한 변화가 아니기 때문일 것입니다.) –

+1

@David Hedlund : 수업 1 단계를 참조하십시오. 항상 업데이트 문을 테스트하십시오. – Welbog

답변

6

기본적으로 어떠한 상업용 로그 리더를 사용하고 미세한 치아 빗으로 통과하려고하지 않으려면. 데이터베이스의 백업은 '업데이트 이력서, 타운 마켓'시나리오 일 수는 없지만 가혹한 일은해서는 안됩니다.

+9

where 절을 잊어 버리거나 모든 사람의 * 이력서를 업데이트 할 수 있습니다 : O –

6

Andrew는 기본적으로이를 호출했습니다. 단지 필자가 필사적으로 생각할 수있는 몇 가지 아이디어를 추가하고자합니다.

  1. 보고서 또는 출력물이 있습니까? 아마도 거기에서 데이터를 재구성 할 수 있습니다.
  2. 이 데이터를 웹 응용 프로그램을 통해 입력 했습니까? 그렇다면 앱이 어떻게 구성되었는지에 따라 웹 서버 로그에서 원본 데이터를 찾을 수있는 기회가 있습니다.
  3. 이 애플리케이션이 다른 애플리케이션과 상호 작용 (데이터 전달)합니까? 그들은 데이터의 버퍼링 된 복사본을 가질 수 있습니다 ...
  4. 데이터는 다른 기존 데이터에서 파생 될 수 있습니까? 원본 날짜를 재구성 할 수있는 감사 로그 테이블 또는이 날짜를 기반으로하는 스키마의 다른 날짜가 있습니까?

편집 :

일부 댓글은 즉 언급하는 것은/당신의 업데이트가 테스트를 실행하기 전에 문을 삭제하는 것이 좋습니다. 이것이 습관이되기 위해서는 쉬운 방법이 있다면 도움이됩니다. 나는 보통 이런 식으로 내 DELETE 문을 작성합니다

--delete --select * 
from [User] 
where UserID=27 

, 당신의 쿼리를 테스트 이후 select에서 모든 것을 강조하기 위해 선택을 실행합니다. 필터 기준에 만족하면 삭제를 실행하려면 delete부터 모든 항목을 강조 표시하십시오. delete 앞에있는 두 개의 대시는 쿼리가 실수로 실행되면 잘못된 구문으로 인해 충돌이 발생합니다.

UPDATE 문과 비슷한 구문을 사용할 수 있지만 상당히 깨끗하지는 않습니다. 항상

+0

+1에있는 - comment 태그 사용. 이것은 내 dna에 내장되어 있습니다. – NotMe

0

하나가 개별 테이블/행을 복원 할 수

특히 레드 게이트의 개체 수준과 마음의 평화를 복원 거기, 사용하지 않을 것 경우에도 주요 UPDATE 문 전에 백업을 지금 백업 파일

을 부여

행운을 빌어, 다른 곳에서 이전 사본 (DEV/QA)을 찾는 것이 좋습니다 ...

0

UPDATE 문에서 롤백을 수행 할 수 있습니까?

+1

트랜잭션 내에 있었고 커밋하지 않은 경우에만. – Andrew

+0

즉, 그는 그렇게하지 않았을까요? 나는 이것이 분필 - 그것 - 최대 경험 항목입니다 같아요. 내가 이야기했던 대부분의 DB 남자들은 항상 txn에서 모든 관리/유지 보수 작업을 마무리했습니다. –

+0

아마도 "Andrew"의 또 다른 유효한 지점은 항상 트랜잭션으로 업데이트를 시작하고이를 확인하고 커밋합니다. – Guru

1

모든 답변 주셔서 감사합니다.

실제로 문제는 우연히 --- 업데이트 구문에서 where 조건을 선택하지 못했습니다 .--- 휴식!

빠른 5 분 작업이었습니다. 하나의 고객 데이터를 테스트하기 위해 날짜를 변경하는 것처럼 - 백업을 생각하지 않았습니다.

물론 당신은 사실입니다. 이것은 수업입니다.

이제 앞으로 "내 업데이트 문을 하나의 트랜잭션으로 작성"할 것입니다. 또는 "내 업데이트 문을 테스트하십시오"

다시 한번 감사드립니다. 유일한 답은 "아니오"이므로 질문을 무시하고 시간을 보내셔도됩니다.

감사

SNA

+0

+1. 실수를 인정하고 공과를 배우기 위해서. 또한 여기 DB는 몇 가지 제약이 있습니다. 오라클의 경우 FLASHBACK 옵션을 사용할 수 있습니다. – Guru

2

SQL 서버는 모든 transation.So 백업없이뿐만 아니라 로그에서 수정 된 데이터를 복구 할 수 있습니다에 대한 기록 유지합니다.

Select [PAGE ID],[Slot ID],[AllocUnitId],[Transaction ID] 
,[RowLog Contents 0], [RowLog Contents 1],[RowLog Contents 3],[RowLog Contents 4] 
,[Log Record] 
FROM sys.fn_dblog(NULL, NULL) 
WHERE 
AllocUnitId IN 
(Select [Allocation_unit_id] from sys.allocation_units allocunits 
INNER JOIN sys.partitions partitions ON (allocunits.type IN (1, 3) 
AND partitions.hobt_id = allocunits.container_id) OR (allocunits.type = 2 
AND partitions.partition_id = allocunits.container_id) 
Where object_id=object_ID('' + 'dbo.student' + '')) 
AND Operation in ('LOP_MODIFY_ROW','LOP_MODIFY_COLUMNS') 
And [Context] IN ('LCX_HEAP','LCX_CLUSTERED') 

다음은 단계별로 설명하는 artcile입니다. http://raresql.com/2012/02/01/how-to-recover-modified-records-from-sql-server-part-1/

이므 란

0

늦은 하나 바라건대 유용한 ...

데이터베이스가 모든 트랜잭션이 트랜잭션 로그에 기록하고 검색 할 수있는 전체 복구 모드에있는 경우. 문제는 이것이 트랜잭션 로그의 주요 목적이 아니기 때문에 기본적으로 지원되지 않는다는 것입니다.

옵션은 다음과 같습니다

  • 상업 도구 등 Apex Log (더 비싼, 더 많은 옵션) 또는 Quest Toad
  • 에 시도 (저렴 덜 옵션이 목적 주요 초점은 SQL 서버 관리에 대한) user1059637처럼 지적하십시오. 이 방법의 문제점은 트랜잭션 로그 백업을 읽을 수없고 지루하다는 점입니다.

    귀하의 데이터가 시간과 비용면에서 귀하에게 얼마나 가치가 있는지를 설명합니다.

관련 문제