Làm thế nào để nắm bắt các truy vấn chạy trên máy chủ MySQL?


14

Chúng tôi đang cố gắng thực hiện một số gỡ lỗi hiệu suất máy chủ và tôi muốn chụp một ảnh chụp nhanh các truy vấn đang chạy trên máy chủ MySQL của chúng tôi trong một vài phút.

Tôi quen thuộc với MySQL SHOW FULL PROCESSLIST, tuy nhiên tôi muốn có thể chạy nó thông qua dòng lệnh để tôi có thể chuyển nó vào một tệp và xử lý nó.

Có cách nào để xuất truy vấn này vào một tệp và để nó chạy mỗi giây hay không?

Có cách nào tốt hơn để nắm bắt tất cả các truy vấn đang được chạy không?

Lưu ý rằng tôi không quan tâm đến chỉ các truy vấn chậm (Tôi quen thuộc với nhật ký truy vấn chậm).


Bạn đang chạy hệ điều hành nào? Điều này cực kỳ dễ thực hiện trên linux, vì vậy tôi đoán windows?
Patrick

@Patrick Vui mừng khi nghe nó dễ dàng trên linux! Cháy đi ...
hafichuk

1
Hầu hết các truy vấn sẽ chạy và kết thúc trong ít hơn một giây và không bao giờ hiển thị trên danh sách của bạn.
Joel Coel

ngoài ra các truy vấn dài hơn sẽ xuất hiện nhiều lần một lần cho mỗi vòng lặp, nhưng chắc chắn nếu bạn muốn, bạn có thể chỉ echo show full processlist | mysqlhoặc tốt hơn SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"trong một vòng lặp trong bash. Thêm một vài dòng và bạn sẽ nhận được các chức năng truy vấn cùng hơn innotophoặc pt-kill
hữu thần

Câu trả lời:


10

Tôi sẽ sử dụng nhật ký truy vấn chậm. Nó nắm bắt tất cả các truy vấn, không chỉ những truy vấn chậm, nếu bạn đặt long_query_time = 0.

Nó cũng nắm bắt TẤT CẢ các truy vấn, điều này không đúng với các kỹ thuật đánh hơi TCP được đề cập ở đây; những người sẽ không nắm bắt được các truy vấn được thực hiện thông qua một ổ cắm. Ditto để xem PROCESSLIST SHOW; bạn sẽ bỏ lỡ các truy vấn chạy nhanh.

Nếu bạn muốn nắm bắt các truy vấn thông qua danh sách quy trình hoặc thông qua lưu lượng TCP, tôi khuyên bạn nên sử dụng tiêu hóa pt-query-digest của Percona Toolkit. Nó có thể thăm dò danh sách quy trình cho bạn (và hiểu được kết quả, rất khó thực hiện nếu bạn tự chụp một loạt các mẫu của nó) và nó có thể diễn giải giao thức TCP của MySQL, vì vậy bạn có thể lấy một số TCP giao thông và phân tích nó. Tất nhiên, đó cũng là trình tổng hợp / trình biên dịch / phóng viên truy vấn tốt nhất từng được viết, nhưng bạn không nói bạn muốn làm gì với các truy vấn sau khi bạn nắm bắt chúng.


13

Cách mạnh mẽ nhất là sử dụng "nhật ký truy vấn chung", sẽ nắm bắt tất cả các truy vấn: http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Bạn không chỉ định phiên bản máy chủ MySQL, nhưng nếu bạn có 5.1.12 trở lên, bạn có thể bật và tắt phiên bản đó với biến toàn cục thông qua SQL; Xem các tài liệu hướng dẫn để biết chi tiết.


Cảm ơn @Daniel. Chúng tôi đã bật tính năng này, tuy nhiên không có thông tin dấu thời gian trong nhật ký. Bất kỳ ý tưởng làm thế nào để có được một dấu thời gian trong đó?
hafichuk

Xin lỗi, không, không có gì khác ngoài việc chỉ cho bạn hướng dẫn.
Daniel Pittman

2
Nhật ký truy vấn chậm với long_query_time = 0 là một tùy chọn tốt hơn; nó vẫn sẽ nắm bắt tất cả các truy vấn.
tước Schwartz

+1 cho baron: nhật ký truy vấn chung không bao gồm các số liệu hiệu suất bạn cần. Ngoài ra còn có các tập lệnh perl đi kèm với máy chủ MySQL để phân tích nhật ký truy vấn chậm (loại bỏ các giá trị bằng chữ khỏi các vị từ). Nhưng lưu ý rằng các phiên bản cũ hơn của MySQL sẽ không hỗ trợ thời gian dài hơn 1 giây - nếu đó là trường hợp dành cho bạn sau đó nâng cấp - có nhiều cải tiến hiệu suất hơn trong các phiên bản gần đây.
symcbean


4

Chắc chắn rồi:

mysqladmin -u root -p -i 1 --verbose processlist > /tmp/pl.out

Chúc mừng


À ... mysqladmin. Hoàn hảo, cảm ơn @ HTTP500
hafichuk

1
Điều này thực sự chạy lệnh processlist cứ sau 1 giây. Một số truy vấn rất nhanh vẫn có thể thoát khỏi bị bắt; nếu tải được tạo thành từ một vài truy vấn lớn thì nó sẽ hoạt động, nếu nó được tạo thành từ nhiều truy vấn nhỏ thì có thể không.
LSerni 7/12/2015

@Isemi, OP yêu cầu "mỗi giây hoặc lâu hơn".
HTTP500

3

Đây có thể là một nơi dành cho Proxy Mysql . Về cơ bản, nó cho phép bạn nắm bắt (và thao tác) các truy vấn được gửi. Một thiết lập cơ bản để đánh chặn là khá dễ dàng. Sau đó, chỉ cần thay đổi cấu hình máy khách của bạn để trỏ đến proxy để bạn có thể nắm bắt tất cả các yêu cầu.


3

Các thiết bị đầu cuối dựa trên Wireshark chương trình tshark có thể giúp:

tshark -T fields -R mysql.query -e mysql.query

sudo yum install wiresharksẽ cung cấp cho bạn tshark trên Amazon Linux và sudo apt-get install tsharksẽ cung cấp cho bạn tshark trên Ubuntu 14+


2

Tôi đã sử dụng giải pháp của 'Rui Pedro Bernardino. Hoạt động tuyệt vời ngoại trừ tôi đã thay đổi một vài điều trong dòng đầu tiên như chi tiết bên dưới ...

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e 'while(<>) { chomp; next if /^[^ ]+[ ]*$/;
    if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'


0

Tôi đã tìm kiếm và tìm kiếm và cuối cùng tôi đã đến MONyog để theo dõi tất cả các truy vấn theo thời gian thực được thực hiện trong máy chủ mysql. Điều duy nhất cần lưu ý là bảng "Performance_schema" và "statement_digest" được bật và Performance_schema là được bật có sẵn với MySQL 5.6,14 trở lên.

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.