it-swarm-vi.tech

Làm thế nào tôi có thể hiển thị khóa mysql?

Có cách nào để hiển thị tất cả các khóa đang hoạt động trong cơ sở dữ liệu mysql không?

54
Rory

Xem liên kết của Marko cho các bảng InnoDB và hãy cẩn thận.

Đối với MyISAM, không có giải pháp "đây là truy vấn vi phạm" dễ dàng. Bạn nên luôn luôn bắt đầu với một danh sách quy trình. Nhưng hãy chắc chắn bao gồm từ khóa đầy đủ để các truy vấn được in không bị cắt ngắn:

SHOW FULL PROCESSLIST;

Điều này sẽ cho bạn thấy một danh sách tất cả các quy trình hiện tại, truy vấn SQL và trạng thái của chúng. Bây giờ thông thường nếu một truy vấn duy nhất khiến nhiều người khác khóa thì nó sẽ dễ dàng được xác định. Các truy vấn bị ảnh hưởng sẽ có trạng thái Locked và truy vấn vi phạm sẽ tự đứng ra, có thể đang chờ một cái gì đó chuyên sâu, như một bảng tạm thời.

Nếu điều đó không rõ ràng thì bạn sẽ phải sử dụng khả năng khấu trừ SQL của mình để xác định đoạn SQL vi phạm nào có thể là nguyên nhân gây ra tai ương của bạn.

47
Dan Carley

Nếu bạn sử dụng InnoDB và cần kiểm tra các truy vấn đang chạy, tôi khuyên bạn nên

show engine innodb status;

như được đề cập trong liên kết của Marko. Điều này sẽ cung cấp cho bạn truy vấn khóa, có bao nhiêu hàng/bảng bị khóa bởi nó, v.v. Xem phần GIAO DỊCH.

Vấn đề với việc sử dụng SHOW PROCESSLIST là bạn sẽ không thấy các khóa trừ khi các truy vấn khác đang xếp hàng.

26
Polymorphix

Thử SHOW OPEN TABLES :

show open tables where In_Use > 0 ;
24
M Sleman

Không có câu trả lời nào có thể hiển thị tất cả các khóa hiện đang được giữ.

Làm điều này ví dụ trong mysql trong một thiết bị đầu cuối.

start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there

Rõ ràng giao dịch ở trên giữ một khóa, bởi vì giao dịch vẫn còn hoạt động. Nhưng không có truy vấn nào đang diễn ra ngay bây giờ và không ai đang chờ khóa ở bất cứ đâu (ít nhất là).

INFORMATION_SCHEMA.INNODB_LOCKS là trống, điều này có nghĩa là tài liệ , vì chỉ có một giao dịch và hiện tại không có ai chờ đợi bất kỳ khóa nào. Cũng thế INNODB_LOCKS dù sao cũng bị phản đối.

SHOW ENGINE INNODB STATUS là vô dụng: someTable hoàn toàn không được đề cập

SHOW FULL PROCESSLIST trống, vì thủ phạm không thực sự chạy truy vấn ngay bây giờ.

Bạn có thể dùng INFORMATION_SCHEMA.INNODB_TRX, performance_schema.events_statements_historyperformance_schema.threads để trích xuất các truy vấn mà bất kỳ giao dịch đang hoạt động nào đã thực hiện trong quá khứ như được nêu trong câu trả lời khác của tôi , nhưng tôi không tìm thấy bất kỳ cách nào để thấy rằng someTable bị khóa kịch bản trên.

Các đề xuất trong các câu trả lời khác cho đến nay sẽ không giúp được ít nhất.

Tuyên bố miễn trừ trách nhiệm: Tôi chưa cài đặt innotop và tôi không bận tâm. Có lẽ có thể hoạt động.

11
Peter V. Mørch

Sử dụng lệnh này

SHOW PROCESSLIST

sẽ hiển thị tất cả quy trình hiện đang chạy, bao gồm cả quy trình đã thu được khóa trên các bảng.

7
Arie K

AFAIK vẫn chưa có cách riêng trong MYSQL, nhưng tôi sử dụng innotop . Nó miễn phí và có nhiều chức năng khác.

Đồng thời xem liên kết này để biết thêm thông tin về cách sử dụng công cụ innotop.

7
Marko Carter

Tham khảo được lấy từ bài đăng này.

Bạn có thể sử dụng tập lệnh dưới đây:

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
5
Anvesh