Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Hết thời gian chờ truy vấn toàn cầu trong MySQL 5.6

Có vẻ như không có tương đương tới max_execution_time trong MySQL trước phiên bản 5.7.4 và 5.7.8 (cài đặt đã thay đổi tên của nó). Những gì bạn có thể làm là tạo công việc định kỳ của riêng mình để kiểm tra xem các truy vấn có vượt quá thời gian chờ hay không và loại bỏ chúng theo cách thủ công. Thật không may, điều đó không hoàn toàn giống với những gì các phiên bản MySQL mới hơn làm:nếu không kiểm tra thông tin lệnh, bạn sẽ kết thúc việc giết tất cả các truy vấn, không chỉ đọc SELECT và không thể kiểm soát ở cấp độ phiên.

Một cách để làm điều đó là tạo thủ tục được lưu trữ truy vấn danh sách quy trình giết theo yêu cầu. Thủ tục được lưu trữ như vậy có thể trông giống như:

DELIMITER //
CREATE PROCEDURE stmt_timeout_killer (timeout INT)
BEGIN
    DECLARE query_id INT;
    DECLARE done INT DEFAULT FALSE;

    DECLARE curs CURSOR FOR
    SELECT id
    FROM information_schema.processlist
    WHERE command = 'Query' AND time >= timeout;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    -- Ignore ER_NO_SUCH_THREAD, in case the query finished between
    -- checking the process list and actually killing threads
    DECLARE CONTINUE HANDLER FOR 1094 BEGIN END;

    OPEN curs;

    read_loop: LOOP
        FETCH curs INTO query_id;

        IF done THEN
            LEAVE read_loop;
        END IF;

        -- Prevent suicide
        IF query_id != CONNECTION_ID() THEN
            KILL QUERY query_id;
        END IF;
    END LOOP;

    CLOSE curs;
END//
DELIMITER ;

Ngoài ra, bạn có thể triển khai tất cả những điều đó trong logic ứng dụng của mình, nhưng nó sẽ yêu cầu các chuyến đi vòng riêng biệt đến cơ sở dữ liệu để mỗi truy vấn bị loại bỏ. Điều còn lại sau đó là gọi điều này theo định kỳ:

# Somewhere suitable
engine.execute(text("CALL stmt_timeout_killer(:timeout)"), timeout=30)

Chính xác như thế nào và ở đâu phụ thuộc nhiều vào ứng dụng thực tế của bạn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để sửa đổi các chuỗi phụ?

  2. Cách tốt nhất để loại bỏ giá trị khỏi trường SET?

  3. Sử dụng biến phiên PHP trong tệp MySQL chạy bằng PHP?

  4. Điều đó có nghĩa là gì khi MySQL ở trạng thái Đang gửi dữ liệu?

  5. MySQL:Cách tính số tuần kể từ một ngày cụ thể?