답변:
InnoDB 테이블 및 경고에 대한 Marko의 링크를 참조하십시오.
MyISAM의 경우, "이것은 문제가되는 쿼리"솔루션입니다. 항상 프로세스 목록으로 시작해야합니다. 그러나 인쇄 된 검색어가 잘리지 않도록 전체 키워드를 포함해야합니다.
SHOW FULL PROCESSLIST;
현재 프로세스, SQL 쿼리 및 상태 목록이 표시됩니다. 일반적으로 단일 쿼리로 인해 많은 다른 쿼리가 잠기면 쉽게 식별 할 수 있습니다. 영향을받는 쿼리는 상태가 Locked
되고 문제가되는 쿼리는 자체적으로 자리에 앉아 임시 테이블과 같이 집중적 인 작업을 대기 할 수 있습니다.
확실하지 않은 경우에는 SQL 공제 기능을 사용하여 문제의 원인이 될 수있는 SQL 조각을 확인해야합니다.
시도 SHOW OPEN TABLES
:
show open tables where In_Use > 0 ;
어떤 답변도 현재 보유하고있는 모든 잠금을 표시 할 수 없습니다.
터미널의 mysql 에서이 작업을 수행하십시오.
start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there
트랜잭션이 여전히 활성 상태이므로 위의 트랜잭션은 잠금을 보유합니다. 그러나 지금은 쿼리가 진행 중이 아니며 어느 곳에서도 (적어도) 잠금을 기다리는 사람은 없습니다.
INFORMATION_SCHEMA.INNODB_LOCKS
트랜잭션이 하나만 있고 현재 잠금을 기다리는 사람이 없기 때문에 문서가 주어진 경우에는 비어 있습니다. 또한 INNODB_LOCKS
어쨌든되지 않습니다.
SHOW ENGINE INNODB STATUS
쓸모 없다 : someTable
전혀 언급되지 않았다
SHOW FULL PROCESSLIST
범인이 실제로 쿼리를 실행하고 있지 않기 때문에 비어 있습니다.
당신은 사용할 수 있습니다 INFORMATION_SCHEMA.INNODB_TRX
, performance_schema.events_statements_history
그리고 performance_schema.threads
에 명시된 바와 같이 활성 트랜잭션이 과거에 실행 한 것을 쿼리를 추출하는 내 다른 대답 ,하지만 난 것을보고 어떤 식 으로든 건너하지 않은 someTable
위의 시나리오에 잠겨 있습니다.
다른 답변의 제안은 적어도 도움이되지 않습니다.
면책 조항 : 나는 innotop을 설치하지 않았으며 귀찮게하지 않았습니다. 아마도 그럴 수 있습니다.
아래 스크립트를 사용할 수 있습니다 :
SELECT
pl.id
,pl.user
,pl.state
,it.trx_id
,it.trx_mysql_thread_id
,it.trx_query AS query
,it.trx_id AS blocking_trx_id
,it.trx_mysql_thread_id AS blocking_thread
,it.trx_query AS blocking_query
FROM information_schema.processlist AS pl
INNER JOIN information_schema.innodb_trx AS it
ON pl.id = it.trx_mysql_thread_id
INNER JOIN information_schema.innodb_lock_waits AS ilw
ON it.trx_id = ilw.requesting_trx_id
AND it.trx_id = ilw.blocking_trx_id