Làm cách nào để biết giao dịch nào đang gây ra trạng thái "Đang chờ khóa siêu dữ liệu bảng"?


94

Tôi đang cố gắng thực hiện một số DDL trên bảng và SHOW PROCESSLISTkết quả là thông báo "Đang chờ khóa siêu dữ liệu bảng".

Làm cách nào để biết giao dịch nào chưa được đóng?

Tôi đang sử dụng MySQL v5.5.24.

Câu trả lời:


145
SHOW ENGINE INNODB STATUS \G

Tìm Phần -

TRANSACTIONS

Chúng tôi có thể sử dụng Bảng INFORMATION_SCHEMA .

Truy vấn hữu ích

Để kiểm tra tất cả các giao dịch khóa đang chờ đợi:

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

Danh sách các giao dịch chặn:

SELECT * 
FROM INNODB_LOCKS 
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);

HOẶC LÀ

SELECT INNODB_LOCKS.* 
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
  ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);

Danh sách các ổ khóa trên bảng cụ thể:

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

Danh sách các giao dịch đang chờ khóa:

SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';

Tham khảo - Khắc phục sự cố MySQL: Phải làm gì khi truy vấn không hoạt động , Chương 6 - Trang 96.


17
Chỉ cần lưu ý rằng tất cả các bảng được tham chiếu đều có trong INFORMATION_SCHEMAcơ sở dữ liệu.
Michael Mior

9
Các bảng InnoDB này có thực sự giữ thông tin về khóa siêu dữ liệu không? Bài đăng trên blog này gợi ý khác: mysql.wisborg.dk/2014/01/13/…
Gareth

1
@Gareth: hoạt động cho đến mysql -mysql-5-7-3-. Cảm ơn đã cập nhật.
Joddy

11
tất cả những người tập hợp rỗng ... nhưng vẫn còn khóa được hiển thị trên processlist ...
K2xL

1
Kiểm tra bình luận bên dưới stackoverflow.com/a/36175882/362574
Joddy

50

Nếu bạn không thể tìm thấy quy trình khóa bảng (vì nó đã chết), có thể một chuỗi vẫn đang dọn dẹp như thế này

phần GIAO DỊCH của

show engine innodb status;

cuối cùng

---TRANSACTION 1135701157, ACTIVE 6768 sec
MySQL thread id 5208136, OS thread handle 0x7f2982e91700, query id 882213399 xxxIPxxx 82.235.36.49 my_user cleaning up

như đã đề cập trong một bình luận trong Xóa bế tắc giao dịch?

bạn có thể thử hủy chuỗi giao dịch trực tiếp, tại đây với

 KILL 5208136;

đã làm cho tôi.


10

mysql 5.7 hiển thị thông tin khóa siêu dữ liệu thông qua performance_schema.metadata_locksbảng.

Tài liệu tại đây


4

Tôi đã gặp sự cố tương tự với Datagrip và không có giải pháp nào trong số này hoạt động.

Khi tôi khởi động lại Máy khách Datagrip, nó không còn là vấn đề nữa và tôi có thể bỏ bảng lại.


3
khởi động lại / khởi động lại - giải pháp hoạt động 100% cho bất kỳ sự cố máy tính nào. Tuy nhiên, trong giai đoạn Sản phẩm, không phải lúc nào cũng có thể khởi động lại
hỏi bạn

1
Tôi đã gặp sự cố tương tự và việc đóng DataGrip đột ngột làm rơi tất cả các khóa. Đó là một bó thời gian lãng phí ..
ScottBurfieldMills
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.