mysql 잠금을 어떻게 표시 할 수 있습니까?


43

어쨌든 mysql 데이터베이스에서 활성화 된 모든 잠금을 표시 할 수 있습니까?


1
INNODB_LOCK_WAITS 및 INNODB_LOCKS 테이블을 쿼리 할 수 ​​있습니다.

답변:


38

InnoDB 테이블 및 경고에 대한 Marko의 링크를 참조하십시오.

MyISAM의 경우, "이것은 문제가되는 쿼리"솔루션입니다. 항상 프로세스 목록으로 시작해야합니다. 그러나 인쇄 된 검색어가 잘리지 않도록 전체 키워드를 포함해야합니다.

SHOW FULL PROCESSLIST;

현재 프로세스, SQL 쿼리 및 상태 목록이 표시됩니다. 일반적으로 단일 쿼리로 인해 많은 다른 쿼리가 잠기면 쉽게 식별 할 수 있습니다. 영향을받는 쿼리는 상태가 Locked되고 문제가되는 쿼리는 자체적으로 자리에 앉아 임시 테이블과 같이 집중적 인 작업을 대기 할 수 있습니다.

확실하지 않은 경우에는 SQL 공제 기능을 사용하여 문제의 원인이 될 수있는 SQL 조각을 확인해야합니다.


20

InnoDB를 사용하고 실행중인 쿼리를 확인 해야하는 경우 권장합니다

show engine innodb status;

Marko의 링크에서 언급했듯이. 그러면 잠금 쿼리, 잠긴 행 / 테이블 수 등이 표시됩니다. TRANSACTIONS 아래를보십시오.

사용의 문제 SHOW PROCESSLIST는 다른 쿼리가 대기열에 있지 않으면 잠금이 표시되지 않는다는 것입니다.


20

시도 SHOW OPEN TABLES:

show open tables where In_Use > 0 ;

여러 데이터베이스와 수백 개의 연결이있는 경우 특히 사용 중 잠금을 즉시 식별하는 가장 좋은 방법이라고 생각합니다.
nelaaro

7

이 명령 사용

SHOW PROCESSLIST

테이블에 대한 잠금을 획득 한 프로세스를 포함하여 현재 실행중인 모든 프로세스를 표시합니다.


7

어떤 답변도 현재 보유하고있는 모든 잠금을 표시 할 수 없습니다.

터미널의 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을 설치하지 않았으며 귀찮게하지 않았습니다. 아마도 그럴 수 있습니다.


6

AFAIK MYSQL에는 여전히 네이티브 방법이 없지만 innotop을 사용 합니다. 무료이며 다른 기능도 많이 있습니다.

innotop 도구 사용에 대한 자세한 내용 은 이 링크 를 참조하십시오 .


4

이 게시물에서 가져온 참조.

아래 스크립트를 사용할 수 있습니다 :

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.