Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Batas waktu kueri global di MySQL 5.6

Sepertinya tidak ada yang setara ke max_execution_time di MySQL sebelum versi 5.7.4 dan 5.7.8 (pengaturan mengubah namanya). Yang dapat Anda lakukan adalah membuat pekerjaan berkala Anda sendiri yang memeriksa apakah kueri telah melampaui batas waktu dan mematikannya secara manual. Sayangnya itu tidak persis sama dengan apa yang dilakukan versi MySQL yang lebih baru:tanpa memeriksa info perintah, Anda akan berakhir dengan mematikan semua kueri, tidak hanya membaca SELECT saja. , dan hampir tidak mungkin untuk mengontrol pada tingkat sesi.

Salah satu cara untuk melakukannya adalah dengan membuat prosedur tersimpan yang menanyakan daftar proses dan membunuh seperti yang dipersyaratkan. Prosedur tersimpan tersebut dapat terlihat seperti:

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 ;

Atau Anda bisa menerapkan semua itu dalam logika aplikasi Anda, tetapi itu akan membutuhkan perjalanan pulang pergi yang terpisah ke database untuk setiap kueri yang akan dimatikan. Yang tersisa adalah memanggil ini secara berkala:

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

Bagaimana dan di mana tepatnya sangat bergantung pada aplikasi Anda yang sebenarnya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah urutan tabel penting di mysql?

  2. Bagaimana menemukan nomor 4 digit unik gratis berikutnya

  3. Cara menggunakan pertandingan melawan di mysql

  4. Ubah tipe data kolom di MySQL tanpa kehilangan metadata lainnya (DEFAULT, NOTNULL...)

  5. konkurensi transaksi mysql innodb