Từ MySQL 5.7 trở đi, điều này có thể thực hiện được, nhưng trước tiên yêu cầu bật mdl
trong performance_schema.setup_instruments
bàn. Bạn có thể thực hiện việc này tạm thời (cho đến khi máy chủ được khởi động lại lần sau) bằng cách chạy:
UPDATE performance_schema.setup_instruments
SET enabled = 'YES'
WHERE name = 'wait/lock/metadata/sql/mdl';
Hoặc vĩnh viễn, bằng cách thêm câu chú sau vào [mysqld]
phần my.cnf
của bạn tệp (hoặc bất kỳ tệp cấu hình nào mà MySQL đọc từ khi cài đặt của bạn):
[mysqld]
performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'
(Đương nhiên, MySQL sẽ cần được khởi động lại để thay đổi cấu hình có hiệu lực nếu bạn thực hiện phương pháp sau.)
Các khóa bạn lấy ra sau mdl
Có thể thấy công cụ đã được kích hoạt bằng cách chạy SELECT
chống lại performance_schema.metadata_locks
bàn. Như đã lưu ý trong tài liệu, GET_LOCK
ổ khóa có OBJECT_TYPE
trong số 'USER LEVEL LOCK'
, do đó, chúng tôi có thể lọc truy vấn của mình xuống chúng bằng WHERE
mệnh đề:
mysql> SELECT GET_LOCK('foobarbaz', -1);
+---------------------------+
| GET_LOCK('foobarbaz', -1) |
+---------------------------+
| 1 |
+---------------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM performance_schema.metadata_locks
-> WHERE OBJECT_TYPE='USER LEVEL LOCK'
-> \G
*************************** 1. row ***************************
OBJECT_TYPE: USER LEVEL LOCK
OBJECT_SCHEMA: NULL
OBJECT_NAME: foobarbaz
OBJECT_INSTANCE_BEGIN: 139872119610944
LOCK_TYPE: EXCLUSIVE
LOCK_DURATION: EXPLICIT
LOCK_STATUS: GRANTED
SOURCE: item_func.cc:5482
OWNER_THREAD_ID: 35
OWNER_EVENT_ID: 3
1 row in set (0.00 sec)
mysql>
Ý nghĩa của các cột trong kết quả này hầu hết được ghi lại đầy đủ tại https://dev.mysql.com/doc/refman/en/metadata-locks-table.html
, nhưng có một điểm nhầm lẫn đáng lưu ý:OWNER_THREAD_ID
cột không không chứa kết nối ID (giống như được hiển thị trong PROCESSLIST
hoặc được trả lại bởi CONNECTION_ID()
) của sợi giữ khóa. Thật khó hiểu, thuật ngữ "ID luồng" đôi khi được sử dụng như một từ đồng nghĩa của "ID kết nối" trong tài liệu MySQL, nhưng điều này không phải một trong những thời điểm đó. Nếu bạn muốn xác định kết nối ID của kết nối giữ khóa (ví dụ:để loại bỏ kết nối đó bằng KILL
), bạn sẽ cần tra cứu PROCESSLIST_ID
tương ứng với THREAD_ID
trong performance_schema.threads
bàn. Ví dụ:để loại bỏ kết nối đang giữ khóa của tôi ở trên ...
mysql> SELECT OWNER_THREAD_ID FROM performance_schema.metadata_locks
-> WHERE OBJECT_TYPE='USER LEVEL LOCK'
-> AND OBJECT_NAME='foobarbaz';
+-----------------+
| OWNER_THREAD_ID |
+-----------------+
| 35 |
+-----------------+
1 row in set (0.00 sec)
mysql> SELECT PROCESSLIST_ID FROM performance_schema.threads
-> WHERE THREAD_ID=35;
+----------------+
| PROCESSLIST_ID |
+----------------+
| 10 |
+----------------+
1 row in set (0.00 sec)
mysql> KILL 10;
Query OK, 0 rows affected (0.00 sec)