อย่างไรก็ตามมีการแสดงการล็อคทั้งหมดที่ใช้งานในฐานข้อมูล mysql หรือไม่?
อย่างไรก็ตามมีการแสดงการล็อคทั้งหมดที่ใช้งานในฐานข้อมูล mysql หรือไม่?
คำตอบ:
ดูลิงก์ของมาร์โคสำหรับตาราง InnoDB และคำเตือน
สำหรับ MyISAM นั้นไม่ใช่เรื่องง่ายเลยที่จะแก้ปัญหา "นี่เป็นคำค้นหาที่ละเมิด" คุณควรเริ่มต้นด้วยรายการกระบวนการ แต่ต้องแน่ใจว่าได้รวมคำหลักแบบเต็มเพื่อไม่ให้มีการตัดคำสืบค้นที่พิมพ์ออกมา:
SHOW FULL PROCESSLIST;
นี่จะแสดงรายการกระบวนการปัจจุบันทั้งหมดแบบสอบถาม SQL และสถานะ ตอนนี้โดยปกติแล้วหากการสืบค้นเดี่ยวทำให้หลาย ๆ คนล็อคแล้วควรระบุได้ง่าย ข้อความค้นหาที่ได้รับผลกระทบจะมีสถานะเป็นLocked
และข้อความค้นหาที่ละเมิดจะดำเนินการเองโดยอาจรอสิ่งที่เข้มข้นเช่นตารางชั่วคราว
หากไม่ชัดเจนคุณจะต้องใช้พลังในการลด SQL เพื่อพิจารณาว่าส่วนใดของการละเมิด SQL ที่อาจเป็นสาเหตุของปัญหาของคุณ
หากคุณใช้ InnoDB และต้องตรวจสอบคำสั่งที่ฉันแนะนำ
show engine innodb status;
ตามที่กล่าวไว้ในลิงค์ของ Marko สิ่งนี้จะให้แบบสอบถามการล็อกจำนวนแถว / ตารางที่ถูกล็อก ฯลฯ ดูภายใต้รายการ
ปัญหาเกี่ยวกับการใช้SHOW PROCESSLIST
คือคุณจะไม่เห็นการล็อกเว้นแต่ว่าการสืบค้นอื่น ๆ กำลังเข้าคิว
ลองSHOW OPEN TABLES
:
show open tables where In_Use > 0 ;
ใช้คำสั่งนี้
SHOW PROCESSLIST
จะแสดงกระบวนการทั้งหมดที่กำลังทำงานรวมถึงกระบวนการที่ได้รับการล็อคบนตาราง
ไม่มีคำตอบใด ๆ ที่สามารถแสดงการล็อคทั้งหมดที่มีอยู่ในปัจจุบัน
ทำเช่นนี้ใน mysql ใน terminal
start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there
ชัดเจนการทำธุรกรรมดังกล่าวถือล็อคเพราะการทำธุรกรรมยังคงใช้งานอยู่ แต่ไม่มีการค้นหาเกิดขึ้นในขณะนี้และไม่มีใครรอการล็อกจากทุกที่ (แต่อย่างน้อย)
INFORMATION_SCHEMA.INNODB_LOCKS
ว่างเปล่าซึ่งมีเหตุผลสำหรับเอกสารเนื่องจากมีเพียงธุรกรรมเดียวและในปัจจุบันไม่มีใครรอการล็อกใด ๆ ยังINNODB_LOCKS
เลิกใช้อยู่แล้ว
SHOW ENGINE INNODB STATUS
ไม่มีประโยชน์อะไร: someTable
ไม่ได้กล่าวถึงเลย
SHOW FULL PROCESSLIST
ว่างเปล่าเนื่องจากผู้ร้ายไม่ได้เรียกใช้คิวรีในขณะนี้
คุณสามารถใช้INFORMATION_SCHEMA.INNODB_TRX
, performance_schema.events_statements_history
และperformance_schema.threads
เพื่อดึงแบบสอบถามว่าการทำธุรกรรมใด ๆ ที่ใช้งานได้ดำเนินการในอดีตที่ผ่านมาตามที่ระบุในคำตอบอื่น ๆ ของฉันแต่ฉันไม่ได้เจอทางใดทางหนึ่งที่จะเห็นว่าsomeTable
ถูกขังอยู่ในสถานการณ์ดังกล่าวข้างต้น
คำแนะนำในคำตอบอื่น ๆ จะไม่ช่วยอย่างน้อย
คำเตือน: ฉันไม่ได้ติดตั้ง innotop และฉันก็ไม่ได้สนใจ บางทีนั่นอาจทำงานได้
AFAIK ยังคงไม่มีทางพื้นเมืองใน MySQL แต่ฉันจะใช้innotop ได้ฟรีและมีฟังก์ชั่นอื่น ๆ อีกมากมายเช่นกัน
ดูลิงค์นี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้เครื่องมือ innotop
คุณสามารถใช้สคริปต์ด้านล่าง:
SELECT
pl.id
,pl.user
,pl.state
,it.trx_id
,it.trx_mysql_thread_id
,it.trx_query AS query
,it.trx_id AS blocking_trx_id
,it.trx_mysql_thread_id AS blocking_thread
,it.trx_query AS blocking_query
FROM information_schema.processlist AS pl
INNER JOIN information_schema.innodb_trx AS it
ON pl.id = it.trx_mysql_thread_id
INNER JOIN information_schema.innodb_lock_waits AS ilw
ON it.trx_id = ilw.requesting_trx_id
AND it.trx_id = ilw.blocking_trx_id