14.2.12 InnoDB 멀티 버전
InnoDB
는 멀티 버전 스토리지 엔진 입니다. 병렬 실행 및 롤백 등의 트랜잭션 기능을 지원하기 위해 변경된 행의 이전 버전에 대한 정보가 유지됩니다. 이 정보는 테이블 스페이스에 롤백 세그먼트 라는 데이터 구조 (Oracle에서는 유사한 데이터 구조의 뒤에) 저장됩니다. InnoDB
는 트랜잭션 롤백에 필요한 취소 작업을 수행하기 위해 롤백 세그먼트의 정보가 사용됩니다. 또한이 정보는 일관성 읽기 위해 행의 초기 버전을 구축하는 데에도 사용됩니다.
멀티 버전 인테리어 설명
InnoDB
는 내부적으로 데이터베이스에 저장된 각 행에 3 개의 필드를 추가합니다. 6 바이트의 DB_TRX_ID
필드는 행을 삽입하거나 업데이트 한 마지막 트랜잭션에 대한 트랜잭션 식별자를 지시합니다. 또한 은행의 특별 비트가 삭제 된 것으로 표시하도록 설정되어있는 경우, 삭제는 내부적으로 갱신으로 처리됩니다. 각 행에는 롤 포인터라는 7 바이트의 DB_ROLL_PTR
필드도 포함되어 있습니다. 롤 포인터는 롤백 세그먼트에 기록 된 Undo 로그 레코드를 보여줍니다. 행이 갱신 된 경우 Undo 로그 레코드에 업데이트되기 전에 행의 내용을 재구성하는 데 필요한 정보가 포함되어 있습니다. 6 바이트의 DB_ROW_ID
필드에 새 행이 삽입되면 단조롭게 증가하는 행 ID가 포함되어 있습니다. InnoDB
에 의해 자동 생성 된 클러스터 된 인덱스는 행 ID 값이 포함됩니다. 그렇지 않으면 인덱스에 DB_ROW_ID
컬럼이 포함되는 것은 아닙니다.
롤백 세그먼트의 Undo 로그는 삽입 및 업데이트 Undo 로그에 분할됩니다. 삽입 Undo 로그는 트랜잭션 롤백에서만 필요하므로 트랜잭션 커밋 즉시 폐기합니다. 업데이트 Undo 로그도 일관성 독해 사용되지만, InnoDB
에 의해 스냅 샷이 할당 된 트랜잭션이 존재하지 않게 된 후에 만 제거 할 수 있습니다. 업데이트 Undo 로그의 스냅 샷 정보는 데이터베이스 행의 이전 버전을 구축 할 때 일관성 독해에 필요한 수 있습니다.
롤백 세그먼트를 관리하기위한 지침
트랜잭션 (일관성 독해만을 발행하는 트랜잭션을 포함)을 정기적으로 커밋하십시오. 그렇지 않으면, InnoDB
는 업데이트 Undo 로그에서 데이터를 파기 할 수 없기 때문에 롤백 세그먼트가 너무 커져서 테이블 공간이 가득 될 가능성이 있습니다.
일반적으로 롤백 세그먼트의 Undo 로그 레코드의 물리적 크기는 해당 삽입 된 행이나 갱신 된 행보다 작습니다. 이 정보를 사용하면 롤백 세그먼트에 필요한 공간을 계산할 수 있습니다.
InnoDB
멀티 버전 체계에서는 SQL 문에서 행을 삭제해도 해당 행은 즉시 데이터베이스에서 물리적으로 제거되지 않습니다. InnoDB
는 삭제에 기록 된 업데이트 Undo 로그 레코드가 삭제 된 경우에만 해당 행 및 인덱스 레코드를 물리적으로 제거합니다. 이러한 제거 작업은 퍼지 라고 매우 빠릅니다. 일반적으로 제거가 이루어지지 않았다 SQL 문과 같은 시간 순서로 실행됩니다.
테이블에서 작은 배치의 행을 거의 같은 속도로 삽입 및 제거하면 모든 "데드"행으로 인해 퍼지 스레드가 지연 시작하고 계속 증가 할 수 있습니다. 이렇게하면 모든면에서 디스크가 억제되어 매우 느립니다. 이런 경우는 새로운 행 작업을 억제하고 innodb_max_purge_lag
시스템 변수를 조정하여 더 많은 자원을 제거 스레드에 할당합니다. 자세한 내용은 섹션 14.12 "InnoDB 부팅 옵션 및 시스템 변수" 를 참조하십시오.