Mysql
 sql >> база данни >  >> RDS >> Mysql

Глобално изчакване на заявка в MySQL 5.6

Изглежда, че няма еквивалент до max_execution_time в MySQL преди версии 5.7.4 и 5.7.8 (настройката промени името си). Това, което можете да направите, е да създадете свое собствено периодично задание, което проверява дали заявките са превишили времето за изчакване и ръчно да ги убива. За съжаление това не е съвсем същото като това, което правят по-новите версии на MySQL:без да проверявате информацията за командата, в крайна сметка ще убиете всички заявки, а не само четете SELECT , и е почти невъзможно да се контролира на ниво сесия.

Един от начините да направите това е да създадете съхранена процедура който прави заявки за списъка с процеси и убива както се изисква. Такава съхранена процедура може да изглежда така:

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 ;

Като алтернатива можете да приложите всичко това в логиката на приложението си, но това ще изисква отделни кръгови пътувания до базата данни, за да бъде убита всяка заявка. Това, което остава, е периодично да извиквате това:

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

Как и къде точно зависи до голяма степен от действителното ви приложение.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ИЗБЕРЕТЕ между днес и вчера

  2. Сървърът изпрати набор от знаци (255), неизвестен на клиента, но наборите от символи съвпадат

  3. Как да добавя множество селекции на квадратчета за отметка към моята база данни с помощта на php

  4. Не мога да стартирам MySql Utilities

  5. Запазване на данни в PHP / Mysql с вградена редакция в CKEditor