전체 복구 모드 데이터베이스가있는 SQLServer2008R2 이상을 가정 해 봅시다.
나는 항상 생각했다 :
-
트랜잭션이 커밋되면 (COMMIT) 트랜잭션이 RAM의 트랜잭션 로그에 기록됩니다.
-
CHECKPOINT가 발생하면 (일부 시간 및 / 또는 일부 트랜잭션 및 기타 기준 후) 마지막 CHECKPOINT와 현재 간의 트랜잭션이 디스크에 기록됩니다.
-
백업 로그가 발생하면 데이터가 MDF 파일에 기록됩니다.
제가 맞습니까? 내 동료 중 일부는 내가 틀렸다고 말하고 BOL에서도 정답을 찾기가 어렵습니다.
감사!
답변
불행히도 COMMIT 작동 방식과 관련하여 지금까지 답변에 많은 오류가 있으므로 다른 오류를 추가하겠습니다. 참조 밥 Dorr의 SQL 서버 I / O 프리젠 테이션 자세한 내용은 : 이용 방법 및 SQL Server 2000의 I / O 기본 . 작동 방식은 다음과 같습니다.
-
완전히 기록 된 모든 데이터 쓰기 (변경)는 정확히 다음 순서로 수행됩니다 ( SQL Server가 쿼리를 실행하는 방법 이해 : 데이터 쓰기 ) :
- 데이터 페이지는 독점적으로 래치됩니다
- 변경 사항을 설명하는 로그 레코드가 메모리에 로그에 추가됩니다. 새 로그 레코드는 새 LSN을 생성합니다 (LSN 이란 : 로그 시퀀스 번호 참조) .
- 데이터 페이지가 수정됩니다 (페이지의 데이터 레코드 및 last_update_lsn). 이제 수정되었습니다 ( ‘더러운’) 페이지.
- 데이터 페이지 래치가 해제됩니다
- 업데이트의 결과로 아무것도 디스크에 직접 쓰여지지 않습니다
-
COMMIT는 다음을 수행합니다.
- COMMIT를 설명하는 새 로그 레코드를 메모리의 로그에 추가합니다.
- 위에서 생성 된 것을 포함하여 디스크로 플러시되지 않은 모든 로그 레코드가 플러시됩니다 (디스크에 기록됨)
- 스레드 블록은 OS가 위의 쓰기를 지속 가능 (IO 완료)으로보고 할 때까지 대기합니다.
- COMMIT 문 (또는 내재 된 커미트가있는 DML 문) 완료
-
CHECKPOINT는 다음을 수행합니다 (간체 화됨). 체크 포인트 작동 방법 및 기록 대상을 참조하십시오 .
- 메모리의 모든 더티 페이지가 디스크에 기록됩니다
- 더티 페이지마다 디스크에 쓰기를 시작하기 전에 해당 페이지의 last_update_lsn 인 LSN을 포함하여 로그를 플러시 (디스크에 기록)합니다. 모든 LSN 플러시는 모든 이전 LSN도 플러시됨을 의미하므로 가장 더러운 페이지의 경우 자체 last_update가 이미 플러시되었을 가능성이 있기 때문에 이것은 더 이상 작동하지 않습니다.
- 검사 점을 설명하는 로그 레코드가 로그에 기록되고 플러시됩니다.
- 데이터베이스 부팅 페이지는 위에서 생성 된 레코드의 LSN으로 업데이트됩니다.
- 메모리의 모든 더티 페이지가 디스크에 기록됩니다
최소한으로 기록 된 작업의 경우 쓰기가 다르게 작동합니다 (최소로 기록 할 수있는 작업 참조) . 대략적으로 기록 된 작업은 다음과 같이 작동합니다 (간체).
- 최소한으로 기록 된 작업의 일부로 페이지에 행을 삽입하기 전에 페이지가 최소한으로 기록 된 작업에 참여한다는 사실을 설명하는 로그 레코드가 생성되어 로그에 추가됩니다 (메모리)
- 많은 인서트가 기록되고 있으므로 최소 로그 페이지가 업데이트되고 있습니다. 아무것도 기록되지 않으며, nothign은 디스크에 기록됩니다.
- 최소 로깅 작업이 커밋되면 커밋하기 전에 해당 트랜잭션에서 최소 로깅 작업에 참여한 모든 페이지가 디스크에 기록되고 있어야합니다. 이 쓰기가 완료된 후에는 COMMIT 로그 레코드를 로그 (메모리에)에 추가 할 수 있으며 새로 추가 된 커밋 로그 레코드를 포함하여 로그를 디스크에 플러시 (쓰기)합니다.
답변
트랜잭션이 커밋되면 (COMMIT) 트랜잭션이 RAM의 트랜잭션 로그에 기록됩니다.
쿼리에서 요청한대로 페이지 나 데이터를 변경하기 전에 트랜잭션이 트랜잭션 로그에 기록됩니다. 이를 미리 쓰기 로깅 (WAL)이라고합니다. 페이지가 메모리에서 업데이트되는 동안 SQL Server가 중단되면 WAL은 DB 엔진이 트랜잭션 로그를 읽고 트랜잭션을 롤백 할 수 있도록합니다. RDBMS의 ACID 특성입니다.
CHECKPOINT가 발생하면 (일부 시간 및 / 또는 일부 트랜잭션 및 기타 기준 후) 마지막 CHECKPOINT와 현재 간의 트랜잭션이 디스크에 기록됩니다.
검사 점은 더티 페이지를 버퍼에서 디스크로 플러시합니다. tempdb의 경우 조금 다르게 동작 합니다 . 더티 페이지는 디스크에서 읽은 후 변경된 페이지입니다. 이 검사 점 프로세스는 트랜잭션이 커밋 된 시점까지 트랜잭션 로그에 표시를 만듭니다. 장애 발생 후 복구는 해당 표시까지의 모든 트랜잭션이 커밋되었음을 알 수 있습니다. TSQL 명령으로 체크 포인트를 수동으로 발행 할 수 있습니다.
백업 로그가 발생하면 데이터가 MDF 파일에 기록됩니다.
아니요, 백업 로그가 발생하면 SQL Server는 트랜잭션 로그 정보를 데이터베이스 로그 파일에서 백업을 작성중인 디스크로 복사합니다. 백업 작업은 디스크에서 데이터를 읽고 디스크에 데이터를 씁니다.
아래 링크를 읽고 싶습니다
Mark가 지적한 SQL Server의 로깅 및 복구 이해
SQL Server 2008 내부 및 문제 해결 설명서
답변
아래는 당신을 위해 명확하게 할 것입니다 :
트랜잭션이 커밋되면 (COMMIT) 트랜잭션이 RAM의 트랜잭션 로그에 기록됩니다.
- COMMIT (또는 BEGIN)는 복구 모델과 관련이 없습니다. 트랜잭션 레벨에 있습니다. 트랜잭션은 완전히 완료되거나 실패해야합니다 ( ACID 특성 기억 ). 따라서 본질적으로 COMMIT는 성공적인 트랜잭션의 끝 (암시 적 또는 명시 적)을 표시합니다. COMMIT 문은 모든 트랜잭션 수정 사항이 데이터베이스의 영구 부분임을 보증합니다.
- 변경을 수행하기 위해 SQL Server는 WAL (Write-Ahead Logging) 을 사용하며, 여기서 데이터를 수정하기 전에 먼저 변경 내용을 로그에 설명합니다.
CHECKPOINT가 발생하면 (일부 시간 및 / 또는 일부 트랜잭션 및 기타 기준 후) 마지막 CHECKPOINT와 현재 간의 트랜잭션이 디스크에 기록됩니다.
- 검사 점은 항상 마지막 검사 점 이후로 변경된 모든 페이지 (더티 페이지라고 함)를 작성합니다. 페이지를 변경 한 트랜잭션이 커밋되었는지 여부는 중요하지 않습니다. 페이지는 디스크에 관계없이 디스크에 기록됩니다. 데이터 페이지가 검사 점의 일부로 디스크에 기록되지 않는 tempdb는 예외입니다.
백업 로그가 발생하면 데이터가 MDF 파일에 기록됩니다.
인용하다 :