Cách bật Nhật ký truy vấn chậm của MySQL

Một trong những vấn đề về hiệu suất MySQL thường gặp nhất là các truy vấn chậm bất ngờ, có thể xảy ra khi khối lượng công việc sản xuất gây căng thẳng cho một truy vấn hoạt động tốt trong quá trình phát triển

Mỗi khi một điểm cuối bị tấn công, các ứng dụng lớn có thể đưa ra hàng trăm truy vấn cơ sở dữ liệu khác nhau, khiến việc xác định những truy vấn đang làm chậm phản hồi của máy chủ trở nên khó khăn. Sử dụng nhật ký truy vấn chậm của MySQL làm điểm bắt đầu cho các cuộc điều tra của bạn, bạn có thể xác định các câu lệnh SQL có vấn đề

Kích hoạt Nhật ký truy vấn chậm

Các truy vấn SQL chạy dài không hoàn thành trong khoảng thời gian đã định cấu hình sẽ được ghi lại trong nhật ký, đây là một cơ chế tích hợp sẵn. Bạn có thể thấy SQL đã được thực thi và thời gian thực hiện bằng cách đọc nội dung của nhật ký

Bạn có thể bật ghi nhật ký truy vấn chậm trên máy chủ của mình bằng cách thực hiện lệnh sau từ trình bao MySQL quản trị

_10

Việc sửa đổi có hiệu lực ngay lập tức và các truy vấn chậm giờ đây sẽ được ghi lại là

SET GLOBAL long_query_time=1;
9. Bạn có thể định kỳ xem lại tệp này để phát hiện các truy vấn không hoạt động tốt

Giới hạn này thường được nới lỏng đối với các ứng dụng web hướng tới người dùng, nơi mong đợi các phản hồi gần như ngay lập tức và MySQL tính một truy vấn là "chậm" nếu mất hơn 10 giây để hoàn thành. Thay đổi giá trị của biến

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
0 sẽ thay đổi giới hạn trên

________Đầu tiên

Điều quan trọng là đạt được sự cân bằng phù hợp với ứng dụng cụ thể của bạn vì giá trị xác định thời lượng tối thiểu cho các truy vấn chậm. Các giá trị rất thấp có thể dẫn đến quá nhiều truy vấn được ghi lại, tạo ra nhật ký quá nhiễu, trong khi ngưỡng quá cao sẽ loại trừ các truy vấn thực sự có ảnh hưởng đến hiệu suất

Sử dụng tệp cấu hình của MySQL

Nếu bạn có ý định sử dụng MySQL trong một khoảng thời gian dài, bạn nên kích hoạt nhật ký truy vấn chậm trong tệp cấu hình MySQL của mình để đảm bảo rằng việc ghi nhật ký sẽ tự động tiếp tục sau khi máy chủ MySQL khởi động lại

Phân phối nền tảng có thể ảnh hưởng đến vị trí của tệp cấu hình, nhưng nó thường ở

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
1 hoặc
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
2. Để sao chép các cài đặt đã được bật động ở trên, hãy thêm các dòng sau

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1

Để áp dụng các thay đổi của bạn, hãy khởi động lại MySQL

$ sudo service mysql restart

Bây giờ, mỗi khi máy chủ MySQL khởi chạy, nhật ký truy vấn chậm sẽ hoạt động

Tùy chỉnh nội dung nhật ký

Điều này loại trừ bất kỳ hoạt động quản trị chậm nào có thể diễn ra, chẳng hạn như tạo chỉ mục và tối ưu hóa bảng, cũng như các truy vấn có khả năng bị chậm trong tương lai. Nhật ký thường chỉ chứa các truy vấn SQL không vượt quá ngưỡng "chậm" và đã được gửi bởi ứng dụng khách

Bằng cách thực hiện các sửa đổi sau đối với tệp cấu hình của mình, bạn có thể mở rộng nhật ký để bao gồm thông tin này

  • Các câu lệnh SQL quản trị như
    SET GLOBAL long_query_time=1;
    1,
    SET GLOBAL long_query_time=1;
    2,
    SET GLOBAL long_query_time=1;
    3 và
    SET GLOBAL long_query_time=1;
    4 được bao gồm trong
    SET GLOBAL long_query_time=1;
    0. Điều này hiếm khi được mong muốn vì các hoạt động này thường được thực hiện bởi các tập lệnh di chuyển và bảo trì. Tuy nhiên, nếu ứng dụng của bạn cũng thực thi các tác vụ này một cách linh hoạt, cài đặt này có thể hữu ích
  • Cài đặt này, bị tắt theo mặc định, cho phép ghi nhật ký truy vấn chậm đối với các truy vấn được sao chép trên các máy chủ bản sao. Thay vào đó, đối với phiên bản MySQL 8. 0, sử dụng
    SET GLOBAL long_query_time=1;
    6. 26 tuổi trở lên
  • Điều này có thể giúp xác định khi truy vấn thiếu chỉ mục hoặc không thể sử dụng chỉ mục đó.
    SET GLOBAL long_query_time=1;
    7 - Khi cài đặt này được bật, các truy vấn dự kiến ​​sẽ truy xuất tất cả các bản ghi từ bảng hoặc dạng xem đích sẽ được ghi lại, ngay cả khi chúng không loại trừ ngưỡng truy vấn chậm. Nếu không có hạn chế về số lượng hàng có thể được tìm nạp, các truy vấn có sẵn chỉ mục sẽ vẫn được ghi lại

Có thể có những trường hợp dự đoán hoặc yêu cầu quét toàn bộ chỉ mục và truy vấn ghi nhật ký không sử dụng chỉ mục có thể làm tăng đáng kể mức độ chi tiết. Mặc dù không thể trả lời các truy vấn này nhưng chúng sẽ tiếp tục xuất hiện trong nhật ký

Biến

SET GLOBAL long_query_time=1;
8, chỉ định số lượng nhật ký tối đa sẽ được ghi trong khoảng thời gian 60 giây, có thể được sử dụng để xếp hạng các truy vấn giới hạn không có chỉ mục. Tối đa 10 truy vấn có thể được ghi lại mỗi phút với giá trị là
SET GLOBAL long_query_time=1;
9;

Giải thích Nhật ký truy vấn chậm

Một tập hợp các dòng giống như sau sẽ được hiển thị cho mỗi truy vấn vào Nhật ký truy vấn chậm

SET GLOBAL long_query_time=1;
4

Thời gian thực hiện của truy vấn, người dùng MySQL mà máy khách đã kết nối và số liệu thống kê hiển thị lượng thời gian và các hàng đã gửi đều được liệt kê trong các dòng nhận xét phía trên truy vấn. Ví dụ nói trên mất 3 giây để hoàn thành. Đây có thể là một dấu hiệu cho thấy các chỉ mục bị thiếu đang khiến MySQL kiểm tra quá nhiều bản ghi vì phải mất 5 giây để hoàn thành và xem xét hơn 320.000 hàng trước khi chỉ gửi 5.143 cho máy khách

Bằng cách đặt biến hệ thống

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
0 trong tệp cấu hình của mình, bạn có thể tùy chọn thêm thông tin bổ sung vào nhật ký, chẳng hạn như ID chuỗi, số byte đã nhận và gửi, số lượng hàng được tính đến để sắp xếp và yêu cầu cụ thể của câu lệnh

Các truy vấn được hiển thị đầy đủ, không có bất kỳ giá trị tham số nào bị che khuất và tệp nhật ký phải được xử lý cẩn thận vì nội dung của nó rất nhạy cảm. Nếu bạn đang sử dụng nhật ký truy vấn chậm trên máy chủ sản xuất, điều này có nghĩa là sẽ có dữ liệu người dùng và quyền truy cập sẽ bị giới hạn đối với các nhà phát triển và quản trị viên cơ sở dữ liệu đang điều chỉnh các câu lệnh SQL

Ghi nhật ký và sao lưu truy vấn chậm

Khi bạn sử dụng MySQLDump để tạo các bản sao lưu cơ sở dữ liệu, một vấn đề với nhật ký truy vấn chậm là các truy vấn

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
1 chạy dài sẽ được thực thi để tìm nạp dữ liệu từ các bảng của bạn và đưa chúng vào bản sao lưu của bạn. Điều này có thể làm hỏng nhật ký nếu bạn tạo bản sao lưu thường xuyên vì chúng sẽ được đưa vào nhật ký truy vấn chậm giống như bất kỳ câu lệnh SQL nào khác

Để khắc phục điều này, hãy tạm thời hủy kích hoạt nhật ký truy vấn chậm trước khi thực hiện

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
2. Sau đó, bạn có thể kích hoạt lại nhật ký sau khi sao lưu xong. Tập lệnh sao lưu của bạn phải được sửa đổi để giống như sau

SET GLOBAL long_query_time=1;
8

Điều này sẽ cho phép bạn tập trung vào SQL được thực thi bởi ứng dụng của bạn bằng cách loại bỏ hoạt động MySQLDump khỏi nhật ký truy vấn chậm

Bản tóm tắt

Một trong những cách tốt nhất để xác định nguồn gốc của các vấn đề về hiệu suất là sử dụng nhật ký truy vấn chậm của MySQL. Bắt đầu bằng cách ước tính độ trễ bạn đang gặp phải và sử dụng giá trị này làm

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
0 của bạn. Nếu không có gì xuất hiện trong nhật ký sau khi bạn đã tạo lại sự cố, hãy giảm giá trị

Nhật ký truy vấn chậm sẽ không cho bạn biết chính xác cách tăng tốc mọi thứ, nhưng có thể xem SQL chính xác mà máy chủ nhận được sẽ cho phép bạn lặp lại các câu lệnh hoạt động chậm và sau đó đánh giá tác động của việc tối ưu hóa. Có thể tạo sự khác biệt giữa truy vấn hoạt động với hàng nghìn hàng và truy vấn chỉ hoạt động với một số ít bằng cách thêm chỉ mục hoặc ràng buộc bị thiếu

Các truy vấn chậm bất ngờ là một trong những vấn đề về hiệu suất phổ biến nhất của MySQL. Một truy vấn hoạt động ở mức chấp nhận được trong quá trình phát triển có thể chùn bước khi bị căng thẳng bởi khối lượng công việc sản xuất

Các ứng dụng lớn có thể chạy hàng trăm truy vấn cơ sở dữ liệu duy nhất mỗi khi điểm cuối bị tấn công. Điều này gây khó khăn cho việc tìm ra các truy vấn gây ra sự chậm trễ trong phản hồi của máy chủ. Nhật ký truy vấn chậm của MySQL là một tùy chọn gỡ lỗi có thể giúp bạn xác định các câu lệnh SQL đáng ngờ, cung cấp điểm khởi đầu cho các cuộc điều tra của bạn

Kích hoạt Nhật ký truy vấn chậm

Nhật ký là một cơ chế tích hợp sẵn để ghi lại các truy vấn SQL chạy dài. Các truy vấn không hoàn thành trong thời gian đã định cấu hình sẽ được ghi vào nhật ký. Đọc nội dung của nhật ký cho bạn biết SQL đã được thực thi và thời gian thực hiện

Ghi nhật ký truy vấn chậm bị tắt theo mặc định. Bạn có thể kích hoạt nó trên máy chủ của mình bằng cách chạy lệnh sau từ trình bao MySQL quản trị

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
1

Thay đổi áp dụng ngay lập tức. Các truy vấn chậm bây giờ sẽ được ghi vào

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
0. Bạn có thể xem lại tệp này định kỳ để xác định các truy vấn hoạt động kém

MySQL tính một truy vấn là “chậm” nếu mất hơn 10 giây để hoàn thành. Giới hạn này thường quá thoải mái đối với các ứng dụng web hướng tới người dùng nơi mong đợi các phản hồi gần như ngay lập tức. Bạn có thể thay đổi giới hạn bằng cách đặt biến

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
1

SET GLOBAL long_query_time=1;

Giá trị đặt thời lượng tối thiểu cho các truy vấn chậm. Điều quan trọng là tìm sự cân bằng phù hợp với ứng dụng của riêng bạn. Ngưỡng quá cao sẽ loại trừ các truy vấn đang thực sự ảnh hưởng đến hiệu suất. Ngược lại, các giá trị rất thấp có thể khiến quá nhiều truy vấn được ghi lại, tạo ra nhật ký quá nhiễu

Sử dụng tệp cấu hình của MySQL

Bạn nên kích hoạt nhật ký truy vấn chậm trong tệp cấu hình MySQL của mình nếu bạn định sử dụng nó lâu dài. Điều này sẽ đảm bảo quá trình ghi nhật ký được tiếp tục tự động sau khi máy chủ MySQL khởi động lại

Vị trí của tệp cấu hình có thể khác nhau tùy theo phân phối nền tảng. Nó thường ở

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
2 hoặc
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
3. Thêm các dòng sau để sao chép các cài đặt đã được bật động ở trên

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1

Khởi động lại MySQL để áp dụng các thay đổi của bạn

$ sudo service mysql restart

Nhật ký truy vấn chậm giờ đây sẽ hoạt động mỗi khi máy chủ MySQL khởi động

Tùy chỉnh nội dung nhật ký

Nhật ký thường chỉ bao gồm các truy vấn SQL loại trừ ngưỡng “chậm” và đã được gửi bởi các ứng dụng khách. Điều này loại trừ mọi hoạt động quản trị chậm có thể xảy ra, chẳng hạn như tạo chỉ mục và tối ưu hóa bảng, cũng như các truy vấn có khả năng bị chậm trong tương lai

Bạn có thể mở rộng nhật ký để bao gồm thông tin này bằng cách thực hiện các thay đổi sau đối với tệp cấu hình của mình

  • SET GLOBAL long_query_time=1;
    0 – Bao gồm các câu lệnh SQL quản trị như
    SET GLOBAL long_query_time=1;
    1,
    SET GLOBAL long_query_time=1;
    2,
    SET GLOBAL long_query_time=1;
    3 và
    SET GLOBAL long_query_time=1;
    4. Điều này hiếm khi được mong muốn vì các hoạt động này thường được chạy trong các tập lệnh bảo trì và di chuyển. Tuy nhiên, cài đặt này có thể hữu ích nếu ứng dụng của bạn cũng tự động thực hiện các tác vụ này
  • SET GLOBAL long_query_time=1;
    5 – Cài đặt này cho phép ghi nhật ký truy vấn chậm đối với các truy vấn được sao chép trên máy chủ bản sao. Điều này bị tắt theo mặc định. Sử dụng
    SET GLOBAL long_query_time=1;
    6 thay thế cho MySQL phiên bản 8. 0. 26 tuổi trở lên
  • SET GLOBAL long_query_time=1;
    7 – Khi cài đặt này được bật, các truy vấn dự kiến ​​sẽ truy xuất tất cả các bản ghi từ bảng hoặc dạng xem đích sẽ được ghi lại, ngay cả khi chúng không loại trừ ngưỡng truy vấn chậm. Điều này có thể giúp xác định khi truy vấn thiếu chỉ mục hoặc không thể sử dụng chỉ mục đó. Các truy vấn có sẵn chỉ mục sẽ vẫn được ghi nếu chúng thiếu các ràng buộc giới hạn số lượng hàng được tìm nạp

Truy vấn ghi nhật ký không sử dụng chỉ mục có thể làm tăng đáng kể mức độ chi tiết. Có thể có những tình huống trong đó dự kiến ​​hoặc cần thiết phải quét toàn bộ chỉ mục. Các truy vấn này sẽ tiếp tục hiển thị trong nhật ký mặc dù chúng không thể được giải quyết

Bạn có thể xếp hạng các truy vấn giới hạn mà không có chỉ mục bằng cách đặt biến

SET GLOBAL long_query_time=1;
8. Điều này xác định số lượng nhật ký tối đa sẽ được ghi trong khoảng thời gian 60 giây. Giá trị của
SET GLOBAL long_query_time=1;
9 có nghĩa là tối đa 10 truy vấn sẽ được ghi lại mỗi phút. Sau sự kiện thứ mười, sẽ không có thêm truy vấn nào được ghi lại cho đến khi cửa sổ 60 giây tiếp theo mở ra

Giải thích Nhật ký truy vấn chậm

Mỗi truy vấn đưa nó vào nhật ký truy vấn chậm sẽ hiển thị một tập hợp các dòng giống như sau

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
5

Các dòng nhận xét phía trên truy vấn chứa thời gian thực thi truy vấn, người dùng MySQL mà máy khách đã kết nối và thống kê cung cấp thời lượng cũng như số lượng hàng được gửi. Ví dụ trên lấy 3. 5 giây để hoàn thành và xem xét hơn 320.000 hàng, trước khi chỉ gửi 5.143 cho khách hàng. Đây có thể là một dấu hiệu cho thấy các chỉ mục bị thiếu đang khiến MySQL kiểm tra quá nhiều bản ghi

Bạn có thể tùy ý đưa thêm thông tin vào nhật ký bằng cách đặt biến hệ thống

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
0 trong tệp cấu hình của mình. Điều này sẽ thêm ID luồng, số byte đã nhận và gửi và số lượng hàng được xem xét để sắp xếp, cũng như số lượng yêu cầu cụ thể của câu lệnh cung cấp khả năng hiển thị về cách MySQL xử lý truy vấn

Tệp nhật ký phải được xử lý cẩn thận vì nội dung của nó sẽ nhạy cảm. Các truy vấn được hiển thị đầy đủ mà không có bất kỳ giá trị tham số nào bị che khuất. Điều này có nghĩa là dữ liệu người dùng sẽ xuất hiện nếu bạn đang sử dụng nhật ký truy vấn chậm trên máy chủ sản xuất. Quyền truy cập phải được giới hạn đối với các nhà phát triển và quản trị viên cơ sở dữ liệu đang điều chỉnh các câu lệnh SQL

Ghi nhật ký và sao lưu truy vấn chậm

Một sự thất vọng phổ biến với nhật ký truy vấn chậm phát sinh khi bạn cũng đang sử dụng MySQLDump để tạo bản sao lưu cơ sở dữ liệu. Các truy vấn

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
1 dài hạn sẽ được thực thi để tìm nạp dữ liệu từ các bảng của bạn và đưa chúng vào bản sao lưu của bạn. Chúng sẽ được đưa vào nhật ký truy vấn chậm giống như bất kỳ câu lệnh SQL nào khác. Điều này có thể làm ô nhiễm nhật ký nếu bạn đang tạo bản sao lưu thường xuyên

Bạn có thể giải quyết vấn đề này bằng cách tạm thời tắt nhật ký truy vấn chậm trước khi chạy

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
2. Bạn có thể kích hoạt lại nhật ký sau khi sao lưu hoàn tất. Điều chỉnh tập lệnh sao lưu của bạn để nó trông giống như sau

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
9

Điều này sẽ loại bỏ hoạt động MySQLDump khỏi nhật ký truy vấn chậm, giúp bạn dễ dàng tập trung vào SQL được ứng dụng của bạn thực thi hơn

Bản tóm tắt

Nhật ký truy vấn chậm của MySQL là một trong những cách hiệu quả nhất để xác định nguyên nhân của các vấn đề về hiệu suất. Bắt đầu bằng cách ước tính độ trễ bạn đang gặp phải và sử dụng giá trị này làm

slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
1 của bạn. Giảm giá trị nếu không có gì hiển thị trong nhật ký sau khi bạn đã tạo lại sự cố

Nhật ký truy vấn chậm sẽ không cho bạn biết chính xác cách khắc phục tình trạng chậm. Tuy nhiên, khả năng xem SQL chính xác mà máy chủ nhận được cho phép bạn lặp lại các câu lệnh hoạt động kém và sau đó đánh giá hiệu quả của việc tối ưu hóa. Thêm một chỉ mục hoặc thiếu ràng buộc có thể là sự khác biệt giữa một truy vấn chạm vào hàng nghìn hàng và một truy vấn hoạt động với một số ít

Nhật ký truy vấn chậm của MySQL ở đâu?

Theo mặc định, tệp nhật ký truy vấn chậm được đặt tại /var/lib/mysql/hostname-slow. nhật ký .

Nhật ký truy vấn chậm của MySQL là gì?

Nhật ký truy vấn chậm MySQL là nơi máy chủ cơ sở dữ liệu MySQL đăng ký tất cả các truy vấn vượt quá ngưỡng thời gian thực hiện nhất định. Đây thường có thể là nơi bắt đầu tốt để xem truy vấn nào chậm nhất và tần suất chúng chậm. MySQL trên máy chủ của bạn được định cấu hình để ghi nhật ký tất cả các truy vấn mất nhiều thời gian hơn 0. 1 giây

Làm cách nào để kích hoạt nhật ký MySQL?

Để bật tệp nhật ký, hãy làm như sau. .
Tạo /etc/my. tệp tùy chọn cnf với các định nghĩa sau đây sẽ tự động kích hoạt các tệp nhật ký. [mysqld] nhật ký log-bin nhật ký lỗi nhật ký truy vấn chậm. .
Dừng và khởi động máy chủ MySQL để kích hoạt các thay đổi đối với /etc/my

Làm cách nào để tìm nhật ký truy vấn chậm trong máy chủ SQL?

7 cách để tìm các truy vấn SQL chậm .
Tạo một kế hoạch thực hiện thực tế. .
Theo dõi việc sử dụng tài nguyên. .
Sử dụng Trình tư vấn điều chỉnh công cụ cơ sở dữ liệu. .
Tìm truy vấn chậm với SQL DMV. .
Báo cáo truy vấn qua Giải pháp APM. .
Sự kiện mở rộng máy chủ SQL. .
Thông tin chi tiết về hiệu suất truy vấn SQL Azure

Chủ Đề