sql >> Database teknologi >  >> RDS >> Mysql

Global forespørgsel timeout i MySQL 5.6

Det lader til, at der ikke er noget tilsvarende til max_execution_time i MySQL før version 5.7.4 og 5.7.8 (indstillingen ændrede sit navn). Hvad du kan gøre er at oprette dit eget periodiske job, der kontrollerer, om forespørgsler har overskredet timeout, og manuelt dræbe dem. Desværre er det ikke helt det samme, som de nyere MySQL-versioner gør:uden at inspicere kommandooplysningerne vil du ende med at dræbe alle forespørgsler, ikke kun læse kun SELECT , og det er næsten umuligt at kontrollere på sessionsniveau.

En måde at gøre det på ville være at oprette en lagret procedure der forespørger på proceslisten og dræber som krævet. En sådan lagret procedure kunne se ud som:

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 ;

Alternativt kan du implementere alt det i din applikationslogik, men det ville kræve separate rundrejser til databasen for hver forespørgsel at blive dræbt. Hvad der så er tilbage er at kalde dette med jævne mellemrum:

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

Hvordan og hvor afhænger i høj grad af din faktiske anvendelse.




  1. Hvordan påvirker søgestien identifikatoropløsning og det aktuelle skema

  2. Hvordan kan jeg slette ved hjælp af INNER JOIN med SQL Server?

  3. MySQL datatype INT(11) mens USIGNED INT(10)?

  4. Tæl antallet af rækker, der indeholder samme værdi