마지막 여러 innodb 교착 상태보기


12

mysql / innodb에서 최신 교착 상태를 볼 수 있지만 과거 교착 상태를 볼 수있는 방법이 있습니까? 두 가지 교착 상태 문제가 있습니다. 하나는 중요하고 다른 하나는 중요하지 않습니다. 덜 중요한 교착 상태는 하루에 여러 번 발생하므로 "최신"교착 상태가됩니다.

답변:


15

MySQL 5.5.30에 도입 된 설정이 있습니다 : innodb_print_all_deadlocks

이 옵션을 활성화하면 InnoDB 사용자 트랜잭션의 모든 교착 상태에 대한 정보가 mysqld 오류 로그에 기록됩니다. 그렇지 않으면 SHOW ENGINE INNODB STATUS 명령을 사용하여 마지막 교착 상태에 대한 정보 만 표시됩니다. InnoDB가 상황을 즉시 감지하고 트랜잭션 중 하나를 자동으로 롤백하기 때문에 가끔 InnoDB 교착 상태가 반드시 문제가되는 것은 아닙니다. 응용 프로그램에 롤백을 감지하고 조작을 재 시도 할 적절한 오류 처리 로직이없는 경우 교착 상태가 발생하는 이유를 해결하려면이 옵션을 사용할 수 있습니다. 교착 상태가 많으면 여러 테이블에 대해 DML 또는 SELECT ... FOR UPDATE 문을 발행하는 트랜잭션을 재구성해야하므로 각 트랜잭션이 동일한 순서로 테이블에 액세스하여 교착 상태를 피할 수 있습니다.

이 설정을 추가하십시오 my.cnf

[mysqld]
innodb_print_all_deadlocks = 1

또는

[mysqld]
innodb_print_all_deadlocks = on

mysql을 다시 시작할 필요는 없습니다. mysql에 로그인하고 실행하십시오.

mysql> SET GLOBAL innodb_print_all_deadlocks = 1;

or

mysql> SET GLOBAL innodb_print_all_deadlocks = 'ON';

이 설정은 나에게도 새로운 것입니다.

그것을 시도하고 당신이 생각하는 모든 것을 알려주세요!


5.5.34를 실행 중입니다. 우리 버전에 대한 옵션이 있습니까?
gwgeller 2014

내 실수. 5.5 dev.mysql.com/doc/refman/5.5/en/…에 있습니다. 답변을 업데이트하겠습니다.
RolandoMySQLDBA

광고 된대로 작동합니다. 감사합니다! sql을 사용하여 설정을 변경하여 다시 시작할 필요가 없었습니다. 우연히도 덜 심각한 교착 상태가 발생하여 오류 로그에 표시되었습니다.
gwgeller

런타임에 값을 설정하면 작동하지 않으며 오류 로그에 아무것도 기록하지 않습니다.
lapo

1
@Jordan AWS는 결코 SUPER를 제공하지 않으며 6 년 전 dba.stackexchange.com/questions/34525/…에 대해 언급했습니다 . 그들은 당신이 해킹 mysql.user하고 실행할 수 없도록 트리거를 사용합니다 FLUSH PRIVILEGES;.
RolandoMySQLDBA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.