ฉันจะแสดงการล็อค mysql ได้อย่างไร


43

อย่างไรก็ตามมีการแสดงการล็อคทั้งหมดที่ใช้งานในฐานข้อมูล mysql หรือไม่?


1
คุณสามารถสืบค้นตาราง INNODB_LOCK_WAITS และ INNODB_LOCKS

คำตอบ:


38

ดูลิงก์ของมาร์โคสำหรับตาราง InnoDB และคำเตือน

สำหรับ MyISAM นั้นไม่ใช่เรื่องง่ายเลยที่จะแก้ปัญหา "นี่เป็นคำค้นหาที่ละเมิด" คุณควรเริ่มต้นด้วยรายการกระบวนการ แต่ต้องแน่ใจว่าได้รวมคำหลักแบบเต็มเพื่อไม่ให้มีการตัดคำสืบค้นที่พิมพ์ออกมา:

SHOW FULL PROCESSLIST;

นี่จะแสดงรายการกระบวนการปัจจุบันทั้งหมดแบบสอบถาม SQL และสถานะ ตอนนี้โดยปกติแล้วหากการสืบค้นเดี่ยวทำให้หลาย ๆ คนล็อคแล้วควรระบุได้ง่าย ข้อความค้นหาที่ได้รับผลกระทบจะมีสถานะเป็นLockedและข้อความค้นหาที่ละเมิดจะดำเนินการเองโดยอาจรอสิ่งที่เข้มข้นเช่นตารางชั่วคราว

หากไม่ชัดเจนคุณจะต้องใช้พลังในการลด SQL เพื่อพิจารณาว่าส่วนใดของการละเมิด SQL ที่อาจเป็นสาเหตุของปัญหาของคุณ


20

หากคุณใช้ InnoDB และต้องตรวจสอบคำสั่งที่ฉันแนะนำ

show engine innodb status;

ตามที่กล่าวไว้ในลิงค์ของ Marko สิ่งนี้จะให้แบบสอบถามการล็อกจำนวนแถว / ตารางที่ถูกล็อก ฯลฯ ดูภายใต้รายการ

ปัญหาเกี่ยวกับการใช้SHOW PROCESSLISTคือคุณจะไม่เห็นการล็อกเว้นแต่ว่าการสืบค้นอื่น ๆ กำลังเข้าคิว


20

ลองSHOW OPEN TABLES:

show open tables where In_Use > 0 ;

ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดในการระบุการล็อคการใช้งานทันทีโดยเฉพาะถ้าคุณมีฐานข้อมูลหลายตัวและหลายร้อยการเชื่อมต่อ
nelaaro

7

ใช้คำสั่งนี้

SHOW PROCESSLIST

จะแสดงกระบวนการทั้งหมดที่กำลังทำงานรวมถึงกระบวนการที่ได้รับการล็อคบนตาราง


7

ไม่มีคำตอบใด ๆ ที่สามารถแสดงการล็อคทั้งหมดที่มีอยู่ในปัจจุบัน

ทำเช่นนี้ใน 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 และฉันก็ไม่ได้สนใจ บางทีนั่นอาจทำงานได้


6

AFAIK ยังคงไม่มีทางพื้นเมืองใน MySQL แต่ฉันจะใช้innotop ได้ฟรีและมีฟังก์ชั่นอื่น ๆ อีกมากมายเช่นกัน

ดูลิงค์นี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้เครื่องมือ innotop


4

การอ้างอิงที่นำมาจากโพสต์นี้

คุณสามารถใช้สคริปต์ด้านล่าง:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.