SQL Server 간단 한 모드 에서 목록 기록 복구 방법 을 잘못 삭제 합 니 다(머 릿 말 검사 돌아 가기)
6010 단어 단순 모드 에서로 케 이 션 레코드회복 하 다.
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 을 사용 하 십시오.줄 을 삭제 하기 전에 더미 에 집합 색인 을 만 드 십시오.줄 을 삭제 하면 집합 색인 을 삭제 할 수 있 습 니 다.이전 방법 에 비해 이 방법 은 시간 이 많이 걸 리 고 더 많은 임시 자원 을 사용 합 니 다.남 은 페이지 공간 을 방출 하면 기록 을 다시 복원 할 수 없 을 가능성 이 높 습 니 다.또한 데이터베이스 전체 모드+로그 백업 이 얼마나 중요 한 지 설명 할 수 있 습 니 다.잡다 한 절 차 를 많이 줄 일 수 있 습 니 다.문필 이 좋 지 않 습 니 다.어디서 보 았 는 지 모호 하 다 면 메 시 지 를 남 겨 주세요.