同等のものはないようです
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)
方法と場所は、実際のアプリケーションに大きく依存します。