[MySQL 연구 노트 (17)] 실행 취소 로그 세부 정보

이 기사는 공식 계정 [Developing Pigeon]에서 게재되었습니다! 팔로우에 오신 것을 환영합니다! ! !


이전 규칙-자매 타운 하우스 :

하나. 실행 취소 로그

(I. 개요

       트랜잭션이 실행 중에 갑자기 중단되면 트랜잭션의 원 자성을 보장하기 위해 원래 상태로 롤백해야합니다. 레코드가 변경 될 때마다 일부 정보를 기록해야합니다. 롤백을 위해 기록되는 내용 실행 취소 로그, 즉 실행 취소 로그라고합니다.

(2) 거래 ID

1. 거래 ID 할당

       트랜잭션이 실행 중에 테이블에 대한 추가, 삭제 및 수정을 수행하면 InnoDB는 고유 한 트랜잭션 ID를 테이블에 할당합니다. 읽기 전용 트랜잭션의 경우 사용자가 만든 임시 테이블에 대해 처음으로 추가, 삭제, 수정 작업을 수행 할 때만 트랜잭션 ID가 할당되고, 읽기-쓰기 트랜잭션의 경우 추가를 수행 할 때만 해당 트랜잭션 ID가 할당됩니다. 처음으로 테이블에 대한, 삭제 및 수정 트랜잭션 ID가 할당되었을 때. 때로는 읽기-쓰기 트랜잭션을 열었지만 트랜잭션이 쿼리 문으로 가득 차 있지만 트랜잭션 ID가 할당되지 않는 경우가 있습니다.

2. 거래 ID 생성

       서버는 트랜잭션 ID로 메모리에 전역 변수를 유지합니다. 하나가 할당되면 1 씩 증가합니다.이 변수의 값이 256의 배수 일 때마다 값은 페이지가있는 페이지 중 하나로 새로 고쳐집니다. 시스템 공간 테이블의 번호 5. Max_Trx ID라는 속성에 있습니다. InnoDB 클러스터형 인덱스 레코드의 행 형식에는 클러스터형 인덱스 레코드를 변경하는 문의 트랜잭션 ID를 기록하는 trx_id 숨겨진 열이 있습니다.

(3) 실행 취소 로그 형식

       일반적으로 레코드가 변경 될 때마다 실행 취소 로그에 해당하지만 일부 업데이트에는 두 개의 실행 취소 로그도 있습니다. 트랜잭션은 실행 프로세스 동안 많은 실행 취소 로그를 생성합니다. 숫자는 0부터 시작하여 undo_no로 기록됩니다. .


1. INSERT 작업에 해당하는 실행 취소 로그

       삽입 작업, 최종 결과는이 레코드를 인덱스 페이지에 넣는 것입니다.이 작업을 롤백하려면이 레코드를 삭제하십시오. 즉, 실행 취소 로그를 쓸 때이 레코드의 기본 키 정보를 기록하십시오. 예 , 기본 키에 포함 된 열 수에 관계없이 저장 공간 크기와 각 관련 열의 실제 값을 기록합니다. 레코드를 삽입한다는 것은 클러스터형 인덱스와 보조 인덱스 모두에 레코드를 삽입하는 것을 의미하지만, 기본 키를 기반으로 보조 인덱스의 레코드를 찾을 수 있으므로 실행 취소 로그 작성은 클러스터형 인덱스에만 해당됩니다.

       클러스터형 인덱스 레코드에는 레코드에 해당하는 실행 취소 로그에 대한 포인터 인 숨겨진 열 roll_pointer도 있습니다.


2. DELETE 작업에 해당하는 실행 취소 로그

       페이지에 삽입 된 레코드는 일반 레코드 연결 목록이라고하는 레코드 헤더 정보의 next_record 속성을 기반으로 단일 연결 목록을 형성하고 삭제 된 레코드도 next_record를 기반으로 가비지 연결 목록을 형성한다는 것을 알고 있습니다. 연결 목록의 저장 공간을 재사용 할 수 있습니다. 페이지 헤더에는 가비지 목록의 헤드 노드를 가리키는 PAGE_FREE 속성이 있습니다.

       DELETE 작업을 사용하여 레코드를 삭제하면 일반 레코드 연결 목록의 마지막 레코드가 삭제됩니다.이 삭제 프로세스는 두 단계로 나뉩니다.

       (1) 레코드의 delted_flag 플래그를 1로 설정합니다.이 단계를 삭제 표시라고하며, 이때 레코드는 일반 레코드 연결 목록이나 가비지 연결 목록에없고 중간 단계에 있습니다.

       (2) delete 문이있는 트랜잭션이 커밋되면 특수 스레드가 해당 레코드를 가비지 목록에 추가하는 단계를 purge라고합니다. 그 후에는이 기록이 삭제 된 것으로 간주하여 점유 된 저장 공간을 재사용 할 수 있습니다. 첫 번째 삽입 방법은 가비지 목록에 추가하는 데 사용됩니다.

       트랜잭션이 커밋되었으므로 트랜잭션을 롤백 할 필요가 없으며 DELETE 작업의 롤백을 위해 삭제 표시 프로세스의 롤백 만 고려하면됩니다. 레코드에서 삭제 표시 작업을 수행하기 전에 레코드의 trx_id 및 roll_pointer의 이전 값을 해당 실행 취소 로그의 trx_id 및 roll_pointer에 기록해야 레코드가 마지막으로 수정 된 시간을 찾을 수 있습니다. 이 실행 취소 로그 실행 취소 로그입니다. roll_pointer 포인터의 연결에 의해 형성된 실행 취소 연결 목록을 버전 체인이라고합니다.


3. UPDATE 작업에 해당하는 실행 취소 로그

       UPDATE 작업을 수행 할 때 InnoDB에는 기본 키를 업데이트하지 않고 기본 키를 업데이트하는 두 가지 처리 방법이 있습니다.


(1) 기본 키를 업데이트하지 마십시오.

       업데이트 된 열이 차지하는 변경되지 않고 변경되는 저장 공간으로 더 세분화 될 수 있습니다. 업데이트 된 열이 변경되지 않으면 제자리에서 업데이트 할 수 있습니다. 즉, 원본 레코드를 기반으로 해당 열의 값을 직접 수정할 수 있습니다. 업데이트 된 열의 공간이 변경되면 다음에서 레코드를 삭제해야합니다. 클러스터형 인덱스를 먼저 생성 한 다음 새 값을 기반으로 생성합니다. 새 레코드가 페이지에 삽입됩니다. 여기서 삭제 작업은 가비지 목록을 직접 추가하여 통계 정보를 수정하는 것으로, 새로 생성 된 레코드가 차지하는 저장 공간이 기존 레코드의 공간을 초과하지 않으면 기존 공간을 직접 재사용 할 수 있습니다.


(2) 기본 키 업데이트

       기본 키 업데이트 작업의 경우 클러스터 된 인덱스에서이 레코드의 위치가 변경됨을 의미합니다. 먼저 이전 레코드를 삭제합니다. 삭제 표시 작업 만하는 이유는 다른 트랜잭션도 동시에이 레코드에 액세스 할 수 있기 때문입니다. 기록, 가비지리스트에 추가 된 다른 거래를 직접 삭제하면 접속이 불가능합니다. 업데이트 된 값을 기반으로 새 레코드를 만들고 클러스터형 인덱스 페이지에 삽입합니다. 이 경우 두 개의 실행 취소 로그가 생성됩니다. 하나는 삭제 표시 작업용이고 다른 하나는 삽입 작업용입니다.


(4) 일반적인 연결 목록 구조

       실행 취소 로그를 작성하는 과정에서 여러 연결 목록이 사용되며 많은 연결 목록이 동일한 구조를 갖습니다. 특정 테이블 스페이스에서 페이지의 페이지 번호와 페이지 내의 오프셋으로 노드의 위치를 ​​찾을 수 있습니다. 링크 된 목록 노드에는 일반적으로 앞뒤 노드를 가리키는 페이지 번호와 오프셋이 포함되며 12 바이트를 차지합니다. 링크 된 목록의 기본 노드에는 헤드 노드, 끝 노드 및 연결된 목록의 길이 (16 바이트)가 포함됩니다. .


(5) 실행 취소 로그 유형

       기본적으로 INSERT 문에 의해 생성 된 실행 취소 로그 또는 UPDATE 문에서 기본 키를 업데이트하는 문 (Insert undo log라고 함), 다른 하나는 DELETE, UPDATE 문 (업데이트 실행 취소)에 의해 생성되는 두 가지 범주로 나뉩니다. 로그. 한 페이지에는 한 가지 유형의 실행 취소 로그 만 저장할 수 있으며 다른 유형의 실행 취소 로그는 함께 혼합 할 수 없습니다.


(6) 페이지 연결 목록 실행 취소

       트랜잭션에는 많은 문이 포함됩니다. 하나의 레코드는 여러 레코드를 수정할 수 있습니다. 각 수정은 1-2 개의 실행 취소 로그를 기록해야합니다. 이러한 로그는 한 페이지에 맞지 않을 수 있으며 여러 페이지에 배치해야합니다.이를 위해서는 이러한 실행 취소 페이지가 서로 다른 페이지에 연결되어야합니다. 연결 목록. 트랜잭션 실행 중에는 여러 유형의 명령문이 존재하며, 이는 다른 유형의 실행 취소 로그를 생성하며 이는 다른 페이지에만 배치 될 수 있습니다. 따라서 트랜잭션 실행에는 두 개의 링크 된 실행 취소 페이지 목록이 필요합니다. , 하나는 실행 취소 연결 목록 삽입이고, 하나는 실행 취소 연결 목록 업데이트입니다. 동시에 InnoDB는 일반 테이블의 실행 취소 로그와 임시 테이블을 구분해야하므로 트랜잭션에는 실행 취소 로그가 노드로 포함 된 최대 4 개의 연결 목록이 있습니다. 이러한 연결 목록은 요청시 할당되며 필요할 때만 생성됩니다.

추천

출처blog.csdn.net/Mrwxxxx/article/details/114002091