sql >> Databasteknik >  >> RDS >> Mysql

Global frågetimeout i MySQL 5.6

Det verkar inte finnas någon motsvarighet till max_execution_time i MySQL före versionerna 5.7.4 och 5.7.8 (inställningen bytte namn). Vad du kan göra är att skapa ditt eget periodiska jobb som kontrollerar om frågor har överskridit timeout och manuellt döda dem. Tyvärr är det inte riktigt detsamma som vad de nyare MySQL-versionerna gör:utan att inspektera kommandoinformationen kommer du att döda alla frågor, inte bara läsbara SELECT , och det är nästan omöjligt att kontrollera på sessionsnivå.

Ett sätt att göra det skulle vara att skapa en lagrad procedur som frågar processlistan och dödar såsom krävs. En sådan lagrad procedur kan se ut så här:

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 implementera allt detta i din applikationslogik, men det skulle kräva separata rundresor till databasen för att varje fråga ska dödas. Vad som återstår då är att kalla detta med jämna mellanrum:

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

Hur och var exakt beror mycket på din faktiska applikation.




  1. hur man ändrar (Uppdatera) kolumnnamn i tabell med MySQL arbetsbänk?

  2. Förstå kolumnalias i Select Query i SQL Server - SQL Server / TSQL självstudie del 115

  3. Databastabeller, en tabell som refererar till flera orelaterade tabeller

  4. Hur kan jag ta reda på standardteckenuppsättningen/sorteringen i min MySQL