MySQL-এ InnoDB ডেডলক (deadlock) লগগুলো দেখতে innodb_print_all_deadlocks সিস্টেম ভেরিয়েবল এনেবল করে SHOW ENGINE INNODB STATUS কমান্ড ব্যবহার করা হয়।
স্টেপ ১: ডেডলক লগিং এনেবল করুন
mysql> SET GLOBAL innodb_print_all_deadlocks = 1;
Query OK, 0 rows affected (0.00 sec)
নোট: এটি গ্লোবাল সেটিং, সার্ভার রিস্টার্ট হলে রিসেট হয়। স্থায়ী করতে my.cnf/my.ini-এ যোগ করুন:
[mysqld]
innodb_print_all_deadlocks = 1
স্টেপ ২: ডেডলক লগ দেখুন
mysql> SHOW ENGINE INNODB STATUS;
নমুনা আউটপুট (সংক্ষিপ্ত)
+--------+------+--------------------------------------------------------------------+
| Type | Name | Status |
+--------+------+--------------------------------------------------------------------+
| InnoDB | | ===================================== |
| | | 2019-05-03 16:44:53 0xf9c INNODB MONITOR OUTPUT |
| | | ===================================== |
| | | Per second averages calculated from the last 26 seconds |
| | | ---------------------- |
| | | BACKGROUND THREAD |
| | | ---------------------- |
| | | SEMAPHORES |
| | | ... |
| | | ------------ TRANSACTIONS ------------ |
| | | Trx id counter 136292 |
| | | LIST OF TRANSACTIONS FOR EACH SESSION: |
| | | ---TRANSACTION 283092444694336, not started |
| | | ... |
| | | LATEST DETECTED DEADLOCK |
| | | 2019-05-03 16:44:53 0xf9c |
| | | *** (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 0x7f8b1c007700 |
| | | *** (2) TRANSACTION: |
| | | TRANSACTION 12346, ACTIVE 0 sec inserting |
| | | ... |
| | | *** WE ROLL BACK TRANSACTION (1) |
| | | ---------------------------- END OF INNODB MONITOR OUTPUT ======== |
+--------+------+--------------------------------------------------------------------+
ডেডলক সেকশন বুঝুন
আউটপুটের LATEST DETECTED DEADLOCK সেকশনটি খুঁজুন। এতে থাকে:
- ডেডলক ঘটার সময়
- увলঝিত দুটি ট্রানজ্যাকশনের ডিটেইলস
- কোন লকগুলো কনফ্লিক্ট করেছে
- কোন ট্রানজ্যাকশন রোলব্যাক হয়েছে (WE ROLL BACK TRANSACTION)
- প্রশ্নের SQL স্টেটমেন্ট
ডেডলক এনালাইসিস টিপস
- লক অর্ডারিং: সব ট্রানজ্যাকশনে টেবিল/রো একই অর্ডারে লক করুন
- ছোট ট্রানজ্যাকশন: ট্রানজ্যাকশন যত ছোট হয়, ডেডলক চান্স কম
- ইনডেক্স: উপযুক্ত ইনডেক্স ন रहने থেকে ফুল টেবিল লক হয়
innodb_lock_wait_timeout(ডিফল্ট ৫০ সেক) - লক ওয়াইট টাইমআউট
পারফরম্যান্স স্কিমা (MySQL 5.7+)
SELECT * FROM performance_schema.events_waits_current
WHERE EVENT_NAME LIKE '%lock%';
রিয়েল-টাইম লক ওয়াইট মনিটরিংয়ের জন্য।