sql >> Database >  >> RDS >> Mysql

Globale query-time-out in MySQL 5.6

Het lijkt erop dat er geen equivalent is naar max_execution_time in MySQL vóór versies 5.7.4 en 5.7.8 (de instelling veranderde van naam). Wat u kunt doen, is uw eigen periodieke taak maken die controleert of query's de time-out hebben overschreden en deze handmatig beëindigen. Helaas is dat niet helemaal hetzelfde als wat de nieuwere MySQL-versies doen:zonder de opdrachtinformatie te inspecteren, doodt u uiteindelijk alle zoekopdrachten, niet alleen alleen lezen SELECT , en het is bijna onmogelijk om te controleren op sessieniveau.

Een manier om dat te doen is door een opgeslagen procedure die de proceslijst doorzoekt en kills zoals gevraagd. Een dergelijke opgeslagen procedure kan er als volgt uitzien:

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 ;

Als alternatief zou je dat allemaal in je applicatielogica kunnen implementeren, maar het zou afzonderlijke retourvluchten naar de database vereisen voor elke query die moet worden afgebroken. Wat overblijft is om dit periodiek te noemen:

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

Hoe en waar precies hangt sterk af van uw daadwerkelijke toepassing.




  1. controleer of een kolom ALLE waarden van een andere kolom bevat - Mysql

  2. Die verdomd grote objecten

  3. Een veilige PHP-klasse die verbinding maakt met MySQL?

  4. MySQL op dubbele sleutel... bestaande ID krijgen?