Một kết nối MySQL liên kết [kết nối] Bàn làm việc với máy chủ MySQL. Hầu hết các hành động được thực hiện trong Workbench sau đó được thực hiện đối với máy chủ MySQL được kết nối. Mỗi kết nối MySQL chứa tập hợp các định nghĩa riêng, vì vậy bạn có thể xác định nhiều kết nối MySQL trong Workbench. Ví dụ: các kết nối có thể kết nối với các máy chủ MySQL khác nhau hoặc cùng một máy chủ MySQL với các tên người dùng khác nhau hoặc bật SSL cho một máy chủ hoặc bạn có thể thiết lập kết nối với máy chủ MySQL từ xa [trên máy chủ lưu trữ web của bạn?] bằng SSH
Đối với nhiều kết nối đến cùng một máy chủ MySQL cục bộ, bạn có thể có một kết nối sử dụng "root" với một kết nối khác sử dụng người dùng ít đặc quyền hơn. Tùy thuộc vào cách bạn thiết lập người dùng, họ có thể [hoặc không] đều có quyền xem và sử dụng cùng một cơ sở dữ liệu [thông tin]. Ví dụ: bạn có thể sử dụng Workbench để định cấu hình và sử dụng người dùng ít đặc quyền hơn mà bạn sử dụng cho ứng dụng web của mình
Vì vậy, để tóm tắt, các kết nối chỉ cần kết nối với máy chủ MySQL. Nếu hai kết nối sử dụng cùng một thông tin chính xác thì kết quả trong Workbench sẽ giống hệt nhau, mặc dù đây không phải là trường hợp sử dụng phổ biến. Để biết thêm thông tin về kết nối MySQL trong MySQL Workbench, hãy xem Chương 5, Kết nối trong MySQL Workbench
Bạn có thể tự hỏi liệu người dùng của bạn có thể làm chậm hoặc thậm chí DOS cơ sở dữ liệu MySQL của bạn với một yêu cầu không may mắn hay không. Nếu nó chỉ chứa sai số lượng điều kiện trong biểu mẫu tìm kiếm nâng cao của bạn, kích hoạt quá trình quét toàn bộ bảng trên tập dữ liệu lớn hơn nhiều so với bạn dự đoán thì có thể họ có thể
Nếu bạn cung cấp chức năng tìm kiếm nâng cao, thống kê tổng hợp, báo cáo hoặc xuất dữ liệu trong ứng dụng của mình, thì truy vấn chạy dài không thường xuyên là một phần của thiết kế. Bạn có thể chưa bị quá tải và chậm cơ sở dữ liệu, chỉ vì người dùng của bạn không thường xuyên sử dụng các tính năng này
Cho đến MySQL 5. 7, bạn không có cách nào dễ dàng để tự bảo vệ mình khỏi một lượng lớn người dùng DDoS cơ sở dữ liệu của bạn bằng các truy vấn dài. Ngoài ra, PHP max_execution_time
không áp dụng cho việc chờ các cuộc gọi mạng như được hiển thị trong bài đăng trên blog trước đây trên max_execution_time. Điều này có nghĩa là các tập lệnh PHP và kết nối MySQL của bạn có thể bị chặn miễn là truy vấn chạy, trường hợp xấu nhất là vài phút hoặc vài giờ
Khi bạn Google vấn đề này, giải pháp được đề xuất là chạy một daemon hoặc cronjob theo dõi danh sách quy trình và chỉ loại bỏ các truy vấn chạy dài. Điều này chắc chắn hoạt động, nhưng bạn không biết ai đang chạy truy vấn và tại sao, điều này ngăn bạn áp dụng thời gian chờ chi tiết hơn dựa trên ngữ cảnh [ví dụ: web so với quy trình nền]
Với MySQL5. 7, giờ đây bạn có thể sử dụng gợi ý truy vấn trình tối ưu hóa mới cho các truy vấn SELECT
trong Mili giây
SELECT /*+ MAX_EXECUTION_TIME[1000] */ status, count[*] FROM articles GROUP BY status ORDER BY status;
Hoặc bạn có thể thiết lập một
SET SESSION MAX_EXECUTION_TIME=2000; SET GLOBAL MAX_EXECUTION_TIME=2000;
Thời gian chờ chỉ áp dụng cho các truy vấn CHỌN chỉ đọc
Nếu truy vấn của bạn mất nhiều thời gian, nó sẽ không thành công với lỗi sau
ERROR 3024 [HY000]: Query execution was interrupted, maximum statement execution time exceeded
Bạn có thể xử lý lỗi này một cách tập trung trong ứng dụng của mình và hiển thị thông báo cho người dùng rằng phản hồi mất quá nhiều thời gian và đã bị hủy bỏ
Sử dụng phần mềm Theo dõi ngoại lệ [chẳng hạn như Tideways], bạn có thể ghi nhật ký người dùng, giao dịch hoặc trang nào đang khiến các truy vấn này bị hủy bỏ, tần suất chúng xảy ra và liệu hiệu suất truy vấn có thể được cải thiện hay không
Khi cài đặt Stash hoặc trong quá trình sử dụng ứng dụng, mẫu thông báo sau được báo cáo trong tệp nhật ký
2012-08-12 22:20:25,437 ERROR [main] com.jolbox.bonecp.ConnectionHandle Database access problem. Killing off all remaining connections in the connection pool. SQL State = 08S01
2012-08-12 22:20:25,456 ERROR [main] o.h.transaction.JDBCTransaction JDBC begin failed
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 18,058 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
Gây ra
Sự cố này xảy ra do các kết nối cơ sở dữ liệu hết thời gian của máy chủ MySQL nhanh hơn nhóm kết nối Stash có thể nhận thấy. Điều này làm cạn kiệt nhóm kết nối Stash vì nó sẽ giữ cho các kết nối của nó mở trong khi phía MySQL của các kết nối đã bị đóng
Nghị quyết
Stash được vận chuyển với khoảng thời gian kiểm tra kết nối mặc định là 10 phút
MySQL có giá trị mặc định biến được đặt thành 28800 giây [8 giờ]
Do đó, nếu cả hai bên của kết nối vẫn giữ nguyên giá trị mặc định, sự cố sẽ không bao giờ xảy ra, vì MySQL sẽ không bao giờ hết thời gian chờ kết nối trước khi Stash thực hiện điều đó
Nếu biến wait_timeout của MySQL bị giảm giá trị
Trong trường hợp này, để tránh việc MySQL đóng các kết nối và Stash không thông báo, hãy xác định giá trị khoảng thời gian kiểm tra Stash thành giá trị nhỏ hơn giá trị MySQL.
Trong tệpSTASH_HOME/shared/stash-config.properties
, hãy thêm dòng sau và xác định số phút cho thời gian chờ kết nốidb.pool.idle.testInterval=1
Nếu thời gian chờ của MySQL chưa đến một phút, hãy thêm
interactiveClient=true
vào URL JDBC trong tệpstash-config.properties
file to use MySQL default value 28800 seconds, eg:jdbc.url=jdbc:mysql://localhost:3306/stash212?autoReconnect=true&characterEncoding=utf8&useUnicode=true&sessionVariables=storage_engine%3DInnoDB&interactiveClient=true
Lưu ý rằng MySQL giữ lại một số phạm vi cho biến wait_timeout
và interactive_timeout
. Kiểm tra kỹ cài đặt tương tự của biến bằng cách chạy các truy vấn sau trên cơ sở dữ liệu