sql >> データベース >  >> RDS >> Mysql

MySQL5.6のグローバルクエリタイムアウト

    同等のものはないようです max_execution_time バージョン5.7.4および5.7.8より前のMySQLでは(設定によって名前が変更されました)。できることは、クエリがタイムアウトを超えたかどうかをチェックし、手動で強制終了する独自の定期的なジョブを作成することです。残念ながら、これは新しいMySQLバージョンの機能とはまったく同じではありません。コマンド情報を検査しないと、読み取り専用のSELECTだけでなく、すべてのクエリが強制終了されます。 、およびセッションレベルで制御することはほぼ不可能です。

    これを行う1つの方法は、ストアドプロシージャ<を作成することです。 / a> プロセスリスト をクエリします およびキル 要求に応じ。このようなストアドプロシージャは次のようになります。

    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. MariaDBで名前付きタイムゾーンを設定する方法

    2. 経過時間が特定の時間に自動的に達したときにメールを送信するにはどうすればよいですか?

    3. SQLでの2つの日付間の完全な月数の計算

    4. sum()クエリが小数点以下の結果を返すのはなぜですか?