কম্পিউটার টিউটোরিয়াল

MySQL-এ ডেডলক লগ দেখানোর পদ্ধতি (innodb_print_all_deadlocks)

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%';

রিয়েল-টাইম লক ওয়াইট মনিটরিংয়ের জন্য।

  1. MySQL-এ SHOW GRANTS দিয়ে নির্দিষ্ট ইউজারের সব 권한 (Grants) দেখানো

  2. MySQL에서 GROUP_CONCAT으로 전체 컬럼 값을 콤마 구분 단일 행으로 합치기

  3. MySQL-এ information_schema.columns থেকে টেবিলের সব ফিল্ড (কলাম) দেখানো

  4. MySQL-এ SUBSTRING_INDEX ব্যবহার করে স্ল্যাশের আগের অংশ রাখা