InnoDB 기록 목록 길이가 크게 늘어남
날짜
부터 행 변경에 대한 기록 목록이 db-instance
의 길이
까지 크게 늘어났습니다. 이 증가는 쿼리 및 데이터베이스 종료 성능에 영향을 줍니다.
지원되는 엔진 버전
이 인사이트 정보는 Aurora MySQL의 모든 버전에서 지원됩니다.
컨텍스트
InnoDB 트랜잭션 시스템은 다중 버전 동시성 제어(MVCC)를 유지합니다. 행이 수정되면 수정 중인 데이터의 수정 전 버전이 실행 취소 로그에 실행 취소 레코드로 저장됩니다. 모든 실행 취소 레코드에는 이전 실행 취소 레코드에 대한 참조가 있어 연결된 목록을 형성합니다.
InnoDB 기록 목록은 커밋된 트랜잭션에 대한 실행 취소 로그의 전체 목록입니다. MySQL 트랜잭션에 더 이상 기록이 필요하지 않은 경우 기록 목록을 사용하여 레코드 및 로그 페이지를 제거합니다. 기록 목록 길이는 기록 목록에 수정 사항이 포함된 실행 취소 로그의 총 수입니다. 각 로그에는 하나 이상의 수정이 포함되어 있습니다. InnoDB 기록 목록 길이가 너무 길어지면 이전 행 버전이 많다는 것을 의미하며 쿼리 및 데이터베이스 종료 속도가 느려집니다.
이 문제의 잠재적 원인
긴 기록 목록의 일반적인 원인은 다음과 같습니다.
-
장기 실행 트랜잭션(읽기 또는 쓰기)
-
무거운 쓰기 로드
작업
인사이트의 원인에 따라 다른 조치를 취할 것을 권장합니다.
주제
InnoDB 기록 목록이 줄어들 때까지 데이터베이스 종료와 관련된 작업을 시작하지 않음
InnoDB 기록 목록이 길면 데이터베이스 종료 속도가 느려지므로 데이터베이스 종료와 관련된 작업을 시작하기 전에 목록 크기를 줄이세요. 이러한 작업에는 메이저 버전 데이터베이스 업그레이드가 포함됩니다.
장기 실행 트랜잭션 확인 및 종료
information_schema.innodb_trx
쿼리를 통해 장기 실행 트랜잭션을 찾을 수 있습니다.
참고
또한 읽기 전용 복제본에서 장기 실행 트랜잭션을 찾아보는 것도 잊지 마세요.
장기 실행 트랜잭션을 확인하는 방법
-
SQL 클라이언트에서 다음 쿼리를 실행합니다.
SELECT a.trx_id, a.trx_state, a.trx_started, TIMESTAMPDIFF(SECOND,a.trx_started, now()) as "Seconds Transaction Has Been Open", a.trx_rows_modified, b.USER, b.host, b.db, b.command, b.time, b.state FROM information_schema.innodb_trx a, information_schema.processlist b WHERE a.trx_mysql_thread_id=b.id AND TIMESTAMPDIFF(SECOND,a.trx_started, now()) > 10 ORDER BY trx_started
-
COMMIT
또는ROLLBACK
명령을 사용하여 각 장기 실행 트랜잭션을 종료합니다.
성능 개선 도우미를 사용하여 상위 호스트와 상위 사용자를 확인합니다.
많은 수의 수정된 행이 즉시 커밋되도록 트랜잭션을 최적화합니다.
관련 지표
이 인사이트와 관련된 지표는 다음과 같습니다.
-
trx_rseg_history_len
자세한 내용은 MySQL 5.7 참조 설명서의 InnoDB INFORMATION_SCHEMA 지표 테이블
을 참조하세요.