เราพยายามที่จะวางตารางหนึ่ง แต่มันถูกแขวนและเมื่อเราเห็นคำสั่ง 'SHOW PROCESSLIST' มันแสดงว่า 'กำลังรอเมตาดาต้าล็อคข้อมูล' แม้ว่าเราจะไม่สามารถทำการดำเนินการใด ๆ ในตารางนั้น ไม่มีใครรู้วิธีการแก้ไขหรือไม่
เราพยายามที่จะวางตารางหนึ่ง แต่มันถูกแขวนและเมื่อเราเห็นคำสั่ง 'SHOW PROCESSLIST' มันแสดงว่า 'กำลังรอเมตาดาต้าล็อคข้อมูล' แม้ว่าเราจะไม่สามารถทำการดำเนินการใด ๆ ในตารางนั้น ไม่มีใครรู้วิธีการแก้ไขหรือไม่
คำตอบ:
หากมีการเข้าถึงตาราง InnoDB ผ่านทาง SELECT หรือ DML (INSERT, UPDATE, DELETE) คุณควรคาดหวังว่าจะได้รับการล็อคเมตาดาต้า
ตามเอกสาร MySQL เกี่ยวกับ MetaData Locking :
เพื่อให้แน่ใจว่าธุรกรรม serializability เซิร์ฟเวอร์ต้องไม่อนุญาตให้หนึ่งเซสชันเพื่อดำเนินการคำสั่ง data definition language (DDL) บนตารางที่ใช้ในธุรกรรมที่ไม่สมบูรณ์ในเซสชันอื่น เซิร์ฟเวอร์ทำได้โดยได้รับการล็อคข้อมูลเมตาบนตารางที่ใช้ภายในธุรกรรมและชะลอการปลดล็อคเหล่านั้นจนกว่าธุรกรรมจะสิ้นสุด ล็อคข้อมูลเมตาบนตารางป้องกันการเปลี่ยนแปลงโครงสร้างของตาราง วิธีการล็อคนี้มีความหมายว่าตารางที่ใช้โดยธุรกรรมภายในหนึ่งเซสชันไม่สามารถใช้ในคำสั่ง DDL โดยเซสชันอื่นจนกว่าธุรกรรมจะสิ้นสุด
ที่ถูกกล่าวว่าคุณควรตรวจสอบหรือไม่ว่าอีกครั้งเซสชัน DB ถือล็อคในตาราง หากเซสชั่นดังกล่าวเป็นธุรกรรมที่ยังไม่เสร็จสิ้นอาจมีการระงับ
หากคุณก็ต้องกลับ diskspace TRUNCATE TABLE
ได้อย่างรวดเร็วคุณสามารถเรียกใช้
ลองเปลี่ยนชื่อตารางก่อนที่จะพยายามวางดังต่อไปนี้:
ALTER TABLE mydb.mytable RENAME mydb.mytabletodrop;
TRUNCATE TABLE mydb.mytabletodrop;
DROP TABLE mydb.mytabletodrop;
foo
อยู่ เมื่อการเชื่อมต่อเหล่านั้นเสร็จสิ้นจากนั้นALTER TABLE
สามารถดำเนินการต่อได้
คุณควรค้นหาว่าแบบสอบถามใดที่ทำให้การล็อกธุรกรรมโดยการดำเนินการ:
SHOW ENGINE INNODB STATUS
TRANSACTION
และดูในส่วนที่มีชื่อว่า หลังจากนั้นคุณควรจะฆ่าแบบสอบถามนั้นเพื่อทิ้งฐานข้อมูล
การอ้างอิง: ฉันจะค้นหาธุรกรรมที่ก่อให้เกิดสถานะ“ กำลังรอการล็อกข้อมูลเมตาของตาราง” ได้อย่างไร
foo
ชื่อตารางfootodrop