Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Hiển thị nhật ký deadlock (Deadlock Logs) trong MySQL InnoDB

Deadlock (chết chóc) xảy ra khi hai transaction khóa chéo nhau và không thể tiến triển. MySQL InnoDB tự động phát hiện và rollback một transaction. Để xem chi tiết deadlock gần nhất, dùng SHOW ENGINE INNODB STATUS. Để ghi log tất cả deadlock vào error log, bật biến innodb_print_all_deadlocks.

Bước 1: Bật ghi log tất cả deadlock (Global, cần quyền SUPER)

mysql> SET GLOBAL innodb_print_all_deadlocks = ON;

Hoặc thêm vào my.cnf (vĩnh viễn):

[mysqld]
innodb_print_all_deadlocks = 1

Bước 2: Xem trạng thái InnoDB (chứa deadlock gần nhất)

mysql> SHOW ENGINE INNODB STATUS\G

Kết quả dài, chứa section ------------------------ LATEST DETECTED DEADLOCK ------------------------ với chi tiết:

  • Thời gian.
  • Hai transaction ID, trạng thái, query đang chạy.
  • Lock mode, lock type, index, table, record.
  • Thread ID, isolation level.

Ví dụ output (rút gọn)

------------------------
LATEST DETECTED DEADLOCK
------------------------
2023-10-15 10:30:45 0x7f8b1c00
*** (1) TRANSACTION:
TRANSACTION 12345, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 10, OS thread handle 12345, query id 100 localhost root
INSERT INTO t VALUES (1, 'a')
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 10 page no 3 n bits 72 index PRIMARY of table `test`.`t` trx id 12345 lock_mode X insert intention waiting
*** (2) TRANSACTION:
TRANSACTION 12346, ACTIVE 0 sec inserting
...
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS ... lock_mode X
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS ... lock_mode X insert intention waiting
*** WE ROLL BACK TRANSACTION (1)
------------

Phân tích deadlock

  1. Xác định 2 transaction và query gây deadlock.
  2. Xem thứ tự lock: Transaction 1 lock A rồi chờ B, Transaction 2 lock B rồi chờ A.
  3. Sửa: Luôn lock theo thứ tự nhất quán (ví dụ: luôn lock bảng cha trước, con sau; hoặc lock theo ID tăng dần).
  4. Rút ngắn transaction, tránh logic phức tạp trong transaction.
  5. Dùng SELECT ... FOR UPDATE / LOCK IN SHARE MODE có chủ đích.

Công cụ hỗ trợ

  • pt-deadlock-logger (Percona Toolkit): Theo dõi, log deadlock liên tục.
  • mysqldumpslow, pt-query-digest phân tích slow log (deadlock không trong slow log mặc định).
  • Monitoring: Prometheus + Grafana + mysqld_exporter (metric mysql_global_status_innodb_deadlocks).