Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL(InnoDB)에서 전역 잠금(Global Lock) 확인하는 방법

MySQL(InnoDB)에서 전역 잠금을 확인하려면 SHOW 명령어를 사용하면 됩니다. 아래 쿼리는 현재 걸려 있는 잠금의 현황뿐만 아니라 잠금을 보유하고 있는 소유자(owner)와 대기 중인 세션(waiter)까지 한눈에 파악할 수 있게 해줍니다. 또한 트랜잭션 ID를 비롯하여 InnoDB 엔진의 내부 동작 상태에 대한 다양한 정보도 함께 출력됩니다.

전역 잠금 확인 쿼리

InnoDB의 잠금 및 트랜잭션 상태를 조회하는 쿼리는 다음과 같습니다:

mysql> SHOW ENGINE INNODB STATUS\G

실행 결과

위 쿼리를 실행하면 다음과 같이 InnoDB 모니터의 전체 상태가 출력됩니다:

*************************** 1. row ***************************
Type: InnoDB
Name:
Status:
=====================================
2019-01-23 14:46:58 0x2914 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 23 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 87 srv_active, 0 srv_shutdown, 51953 srv_idle
srv_master_thread log flush and writes: 0
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 244
OS WAIT ARRAY INFO: signal count 241
RW-shared spins 23, rounds 37, OS waits 14
RW-excl spins 16, rounds 380, OS waits 9
RW-sx spins 1, rounds 4, OS waits 0
Spin rounds per wait: 1.61 RW-shared, 23.75 RW-excl, 4.00 RW-sx
------------
TRANSACTIONS
------------
Trx id counter 60219
Purge done for trx's n:o < 60218 undo n:o < 0 state: running but idle
History list length 32
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 284507225290560, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
--------
FILE I/O
--------
I/O thread 0 state: wait Windows aio (insert buffer thread)
I/O thread 1 state: wait Windows aio (log thread)
I/O thread 2 state: wait Windows aio (read thread)
I/O thread 3 state: wait Windows aio (read thread)
I/O thread 4 state: wait Windows aio (read thread)
I/O thread 5 state: wait Windows aio (read thread)
I/O thread 6 state: wait Windows aio (write thread)
I/O thread 7 state: wait Windows aio (write thread)
I/O thread 8 state: wait Windows aio (write thread)
I/O thread 9 state: wait Windows aio (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0
2134 OS file reads, 2843 OS file writes, 1186 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
insert 0, delete mark 0, delete 0
discarded operations:
insert 0, delete mark 0, delete 0
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 1 buffer(s)
Hash table size 2267, node heap has 1 buffer(s)
Hash table size 2267, node heap has 1 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
Hash table size 2267, node heap has 0 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number 44174557
Log buffer assigned up to 44174557
Log buffer completed up to 44174557
Log written up to 44174557
Log flushed up to 44174557
Added dirty pages up to 44174557
Pages flushed up to 44174557
Last checkpoint at 44174557
1117 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 8585216
Dictionary memory allocated 503201
Buffer pool size 512
Free buffers 253
Database pages 256
Old database pages 0
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 2111, created 215, written 1437
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 256, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
0 read views open inside InnoDB
Process ID=8992, Main thread ID=00000000000029F4 , state=sleeping
Number of rows inserted 247, updated 512, deleted 19, read 6593
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================
1 row in set (0.00 sec)

출력 결과 해석하기

출력되는 항목 중 잠금 분석에 특히 유용한 섹션은 TRANSACTIONS 부분입니다.

  • Trx id counter: 현재 시스템에서 할당된 가장 최근의 트랜잭션 ID를 나타냅니다.
  • History list length: 아직 정리(purge)되지 않은 언두 로그의 길이로, 값이 크면 오래 실행 중인 트랜잭션이 있다는 신호일 수 있습니다.
  • LIST OF TRANSACTIONS FOR EACH SESSION: 세션별 트랜잭션 목록을 보여주며, 각 트랜잭션이 보유한 lock struct 개수와 row lock 개수를 확인할 수 있습니다.

만약 잠금 대기(lock wait)가 발생 중이라면 이 섹션에 LOCK WAIT 항목이 표시되고, 어떤 트랜잭션이 어떤 쿼리를 기다리고 있는지, 누가 잠금을 점유하고 있는지 확인할 수 있습니다. 이를 통해 데드락이나 장시간 잠금 점유로 인한 성능 문제를 진단할 때 큰 도움을 받을 수 있습니다.