SQL Server 간단 한 모드 에서 목록 기록 복구 방법 을 잘못 삭제 합 니 다(머 릿 말 검사 돌아 가기)

우선,저 는 강조 할 필요 가 있 습 니 다.이 주 지 는 쌓 인 표 의 삭제 기록 을 찾 는 원 리 를 밝 히 는 것 입 니 다.제 가 생각 하 는 부분 은 모든 사람의 모든 상황 에 적용 되 지 않 습 니 다.양해 해 주 십시오.많은 친구 들 은 데이터 베이스 가 간단 한 모델 에서 쌓 인 표 가 기록 을 잘못 삭제 하면 찾 을 수 없다 고 생각 합 니 다.로그 기록 이 없 기 때 문 입 니 다.사실은 그렇지 않 습 니 다.특정한 의미 에서 찾 을 수 있 습 니 다.쌓 인 표 가 기록 을 삭제 할 때 줄 의 오프셋 만 바 꾸 었 고 실제 데 이 터 는 물리 적 으로 삭제 되 지 않 았 기 때문에 이 점 을 이용 하여 데 이 터 를 복원 하 는 것 을 테스트 했 습 니 다.과연 성 공 했 습 니 다.그러나 연구 결과 가 나 오지 않 았 습 니 다.페이지 검 사 를 닫 지 않 으 면 오프셋 을 변경 하 는 것 외 에 데 이 터 를 삭제 할 때 머 릿 말 을 변경 해 야 합 니 다.이 점 은 아직 생각 할 시간 이 없 기 때문에 데 이 터 를 복구 할 때 머 릿 말 16 진법 의 대응 관 계 를 추측 할 수 있 고 관심 있 는 친 구 는 경험 을 공유 할 수 있 습 니 다.여기 서 머 릿 말 검사 오 류 를 제거 하기 위해 닫 은 후 테스트 쓸데없는 말 을 많이 하지 않 습 니 다.테스트 demo 는 다음 과 같 습 니 다.테스트 환경:SQL Server 2008 R2 데이터베이스:repltest 단순 모드 테스트 표:testdel 테스트 단계 1.테스트 표 만 들 기 testdel,테스트 데 이 터 를 삽입 합 니 다.
 
create table test_del( a int identity,b char(10))
go
insert into test_del select 'row 1';
insert into test_del select 'row 2';
insert into test_del select 'row 3';
insert into test_del select 'row 4';
insert into test_del select 'row 5';
go
2.테스트 데 이 터 를 보면 정상 입 니 다.
3.DBCC IND 명령 으로 데이터 페이지 id 를 찾 고 데이터 페이지 id:219 를 찾 습 니 다.이 데이터 페이지 는 test 를 저장 합 니 다.del 데이터
dbcc page 를 사용 하여 데이터 페이지 의 내용 과 줄 오프셋 dbcc page(repltest,1,219,1)go 출력 결과:DATA:Slot 0,Offset 0x 60,Length 21,DumpStyle BYTE Record Type=PRIMARYRECORD Record Attributes = NULL_BITMAP Record Size = 21 Memory Dump @0x00000000120CC060 0000000000000000: 10001200 01000000 726f7720 31202020 †........row 1 0000000000000010: 20200200 00†††††††††††††††††††††††††† ... Slot 1, Offset 0x75, Length 21, DumpStyle BYTE Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21 Memory Dump @0x00000000120CC075 0000000000000000: 10001200 02000000 726f7720 32202020 †........row 2 0000000000000010: 20200200 00†††††††††††††††††††††††††† ... Slot 2, Offset 0x8a, Length 21, DumpStyle BYTE Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21 Memory Dump @0x00000000120CC08A 0000000000000000: 10001200 03000000 726f7720 33202020 †........row 3 0000000000000010: 20200200 00†††††††††††††††††††††††††† ... Slot 3, Offset 0x9f, Length 21, DumpStyle BYTE Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21 Memory Dump @0x00000000120CC09F 0000000000000000: 10001200 04000000 726f7720 34202020 †........row 4 0000000000000010: 20200200 00†††††††††††††††††††††††††† ... Slot 4, Offset 0xb4, Length 21, DumpStyle BYTE Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 21 Memory Dump @0x00000000120CC0B4 0000000000000000: 10001200 05000000 726f7720 35202020 †........row 5 0000000000000010: 20200200 00†††††††††††††††††††††††††† ... OFFSET TABLE: Row - Offset 4 (0x4) - 180 (0xb4) 3 (0x3) - 159 (0x9f) 2 (0x2) - 138 (0x8a) 1 (0x1) - 117 (0x75)0(0x0)-96(0x 60)중 행 오프셋 제1 행위 96(0x 60),실제 기록 은 row 1,row 2:(0x 75),row 3:(0x8a),row 4:(0x9f),row 5:(0xb 4)4.세 번 째 줄 데이터 a=3,b=row 3 의 기록 삭제
 
delete test_del where a = 3
go
a=3b=row 3 의 기록 이 삭제 되 었 음 을 설명 합 니 다.5.데이터 페이지 의 줄 오프셋 dbcc page 다시 보기(repltest,1,219,1)goRow-Offset 4(0x4)-180(0xb 4)3(0x3)-159(0x9f)2(0x2)-0(0x0)1(0x1)-117(0x 75)0(0x0)-96(0x 60)3 줄 의 줄 오프셋 이 0 으로 변 경 된 것 을 발견 하고 dbcc page(repltest,1,219,2) goDATA: .. 00000000120CC060: 10001200 01000000 726f7720 31202020 †........row 1 00000000120CC070: 20200200 00100012 00020000 00726f77 † ...........row 00000000120CC080: 20322020 20202002 00001000 12000300 † 2 ......... 00000000120CC090: 0000726f 77203320 20202020 02000010 †..row 3 .... 00000000120CC0A0: 00120004 00000072 6f772034 202020.....................................................................................그러면 세 번 째 줄 의 오프셋 0 x0 을 원래 의 0 x8a 로 수정 하면 기록 을 회복 할 수 있 을 것 이 라 고 추측 합 니까?winHex 도 구 를 이용 하여 mdf 파일 을 엽 니 다.219 페이지,8*220=1802240 바이트 이기 때문에 219 줄 의 오프셋 은 1802239 곳 이 어야 합 니 다.나머지 작업 은 간단 합 니 다.6.데이터 베 이 스 를 닫 는 데이터 페이지 I/O 보호 체 제 를 설정 합 니 다.즉,page 를 설정 합 니 다.verify 데이터베이스 옵션 은 none 이 고 repltest 데이터 베 이 스 를 오프라인 으로 설정 하고 winhex 를 이용 하여 repl 을 찾 습 니 다.test.mdf 파일 의 1802240 끝 에 16 진 코드
 
alter database repl_test set page_verify none
go
use master
alter database repl_test set offline
go
를 repltest 데이터 베 이 스 는 오프라인 으로 설정 되 어 있 으 며,winhex 도구 로 219 페이지 의 끝 부분(220 페이지 의 실제 위치)을 찾 습 니 다.
역시 세 번 째 줄 의 줄 오프셋 은 00 입 니 다.그러면 저 는 8A 00 으로 바 꾸 어 저장 하고 데이터 베 이 스 를 online 으로 설정 합 니 다.
기록 이 회복 에 성공 했다.진행 하지 않 으 면

alter database repl_test set page_verify none
go
시 계 를 읽 을 때 페이지 검사 오류 가 발생 합 니 다.그렇다면 기록 을 어떻게 찾 으 면 DBCC checkdb 가 안전하게 통과 할 수 있 을 까?1.멍청 한 방법 으로 기록 을 되 찾 은 후 원래 의 시 계 를 삭제 하고 페이지 를 손상 시 키 면 잃 어 버 리 고 다시 시 계 를 작성 하여 데 이 터 를 가 져 오 면 됩 니 다.2.눈썹 검 사 를 수정 하 는데 아 쉽게 도 동생 이 재능 이 없어 서 눈썹 구조 에 대응 하 는 물리 16 진법 관 계 를 연구 하지 못 했다.수정 전 머 릿 말 만 캡 처 하고 수정 후 캡 처 에 따라 머 릿 말 을 복원 하 는 것 은 수 정 된 부분 을 말씀 드릴 수 없습니다.경험 이 있 거나 관심 있 는 친구 가 저 와 공유 해 주 셨 으 면 좋 겠 습 니 다.감사합니다.쌓 여 있 는 줄 을 삭제 하고 페이지 를 풀 려 면 다음 방법 중 하 나 를 사용 할 수 있 습 니 다.DELETE 구문 에 TABLOCK 알림 을 지정 합 니 다.TABLOCK 알림 을 사용 하면 줄 자물쇠 나 페이지 자물쇠 가 아 닌 테이블 의 공유 자 물 쇠 를 삭제 할 수 있 습 니 다.이것 은 페이지 를 풀 수 있 습 니 다.표 에서 모든 줄 을 삭제 하려 면 TRUNCATE TABLE 을 사용 하 십시오.줄 을 삭제 하기 전에 더미 에 집합 색인 을 만 드 십시오.줄 을 삭제 하면 집합 색인 을 삭제 할 수 있 습 니 다.이전 방법 에 비해 이 방법 은 시간 이 많이 걸 리 고 더 많은 임시 자원 을 사용 합 니 다.남 은 페이지 공간 을 방출 하면 기록 을 다시 복원 할 수 없 을 가능성 이 높 습 니 다.또한 데이터베이스 전체 모드+로그 백업 이 얼마나 중요 한 지 설명 할 수 있 습 니 다.잡다 한 절 차 를 많이 줄 일 수 있 습 니 다.문필 이 좋 지 않 습 니 다.어디서 보 았 는 지 모호 하 다 면 메 시 지 를 남 겨 주세요.

좋은 웹페이지 즐겨찾기