Mysql
 sql >> Base de données >  >> RDS >> Mysql

Délai d'expiration de la requête globale dans MySQL 5.6

Il semble qu'il n'y ait pas d'équivalent à max_execution_time dans MySQL avant les versions 5.7.4 et 5.7.8 (le paramètre a changé de nom). Ce que vous pouvez faire, c'est créer votre propre tâche périodique qui vérifie si les requêtes ont dépassé le délai d'attente et les tue manuellement. Malheureusement, ce n'est pas tout à fait la même chose que ce que font les nouvelles versions de MySQL :sans inspecter les informations de commande, vous finirez par tuer toutes les requêtes, pas seulement en lecture seule SELECT , et il est presque impossible de contrôler au niveau de la session.

Une façon de faire serait de créer une procédure stockée qui interroge la liste de processus et tue comme demandé. Une telle procédure stockée pourrait ressembler à :

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 ;

Vous pouvez également implémenter tout cela dans la logique de votre application, mais cela nécessiterait des allers-retours séparés vers la base de données pour que chaque requête soit supprimée. Il ne reste plus qu'à l'appeler périodiquement :

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

Comment et où exactement dépend fortement de votre application réelle.