การตรวจสอบ Locks และ Transaction ใน InnoDB
ใช้คำสั่ง SHOW ENGINE INNODB STATUS\G เพื่อดูข้อมูลล็อค ทราน잭ชัน และสถานะ InnoDB แบบละเอียด
คำสั่ง
SHOW ENGINE INNODB STATUS\G
ใช้ \G เพื่อแสดงผลแนวตั้ง (อ่านง่ายกว่า)
ส่วนสำคัญใน Output
1. SEMAPHORES - ล็อคระดับระบบปฏิบัติการ
---------- SEMAPHORES ----------
OS WAIT ARRAY INFO: reservation count 244, signal count 241
RW-shared spins 23, rounds 37, OS waits 14
RW-excl spins 16, rounds 380, OS waits 9
Spin rounds per wait: 1.61 RW-shared, 23.75 RW-excl, 4.00 RW-sx
- RW-shared = Shared locks (S-locks, สำหรับ SELECT)
- RW-excl = Exclusive locks (X-locks, สำหรับ UPDATE/DELETE)
- OS waits = จำนวนครั้งที่ต้องรอ OS-level mutex
2. TRANSACTIONS - ทรานแซกชันที่ทำงานอยู่
------------ TRANSACTIONS ------------
Trx id counter 60219
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)
- Trx id counter = Transaction ID ถัดไป
- History list length = Undo log entries ที่ยังไม่ purge
- Lock structs = จำนวนล็อคที่ถือครอง
3. FILE I/O - การทำงาน I/O
-------- FILE I/O --------
I/O thread 0 state: wait Windows aio (insert buffer thread)
...
Pending normal aio reads: [0, 0, 0, 0], aio writes: [0, 0, 0, 0]
2134 OS file reads, 2843 OS file writes, 1186 OS fsyncs
4. BUFFER POOL - หน่วยความจำ
--------------------- BUFFER POOL AND MEMORY ---------------------
Total large memory allocated 8585216
Buffer pool size 512
Free buffers 253
Database pages 256
Modified db pages 0
Pages read 2111, created 215, written 1437
5. ROW OPERATIONS - สถิติการทำงานแถว
-------------- ROW OPERATIONS --------------
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
การตรวจสอบ Locks แบบละเอียด (MySQL 5.7+ / 8.0+)
-- ดู Locks ปัจจุบัน
SELECT * FROM performance_schema.data_locks;
-- ดู Threads ที่รอ Lock
SELECT * FROM performance_schema.data_lock_waits;
-- ดู Transactions
SELECT * FROM information_schema.INNODB_TRX;
การวิเคราะห์ Deadlock
-- ดู Deadlock ล่าสุด
SHOW ENGINE INNODB STATUS\G
-- หาส่วน: LATEST DETECTED DEADLOCK
คำแนะนำ
- รันคำสั่งนี้ตอนมีปัญหา Performance หรือ Deadlock
- ใช้ \G เพื่ออ่านง่าย (output ยาวมาก)
- โฟกัสที่: TRANSACTIONS (active locks), SEMAPHORES (contention), ROW OPERATIONS (throughput)
- สำหรับ Monitoring จริง ใช้
Performance Schemaหรือ Tools เช่นpt-deadlock-logger,MySQL Enterprise Monitor