Cómo puedo detener una consulta de MySQL si se toma demasiado tiempo?

Es posible el tiempo de espera de una consulta en MySQL?

Es decir, si cualquier consulta excede el tiempo que especifique, será asesinado por MySQL y devolverá un error en lugar de esperar a la eternidad.

  • Para ayudarnos a responder a la pregunta: ¿Está usted tratando de hacer esto en, o fuera de el, su código? Y si quisiera una respuesta para un idioma específico, ¿cuál?
  • Yo no conozco a ninguna de ANSI SQL para eso, pero yo sé cómo hacerlo en un par de aplicaciones que consumen — ¿cómo se conectan? No es la join-limit sintaxis asociada por conexión y muy poco se puede hacer en la aplicación.
  • lo siento, no soy tonta, se me olvidó especificar las cosas. no estoy tratando de hacer esto en mi código, quiero saber, si es posible hacer este tiempo de espera de consulta en mysql auto, algo así como: consulta se ejecuta durante 120 segundos, el límite es 120 para mysql va a matar esta consulta y la devolución de algún error o algo. he cuestión con la 3ª parte de código que es desagradable y no tengo permiso para editarlo. debo matar a esa consulta en mysql, no en el código.
  • esto funciona: serverfault.com/a/402076/280625
InformationsquelleAutor acheruns | 2010-01-26

9 Kommentare

  1. 10

    Hay un buen script de Perl en CPAN para hacer justamente esto:
    http://search.cpan.org/~rsoliv/mysql-genocidio-0.03/mysql-genocidio

    Sólo hay que programarla para que se ejecute con los parámetros adecuados. Crear un archivo CRONtab /etc/cron.d/mysql_query_timeout a programarla para que se ejecute cada minuto:

    * * * * * root /path/to/mysql-genocide -t 7200 -s -K

    Donde 7200 es el maxiumum permitido que el tiempo de ejecución en segundos. El modificador-s en los filtros de todos excepto de las consultas SELECT. El modificador-K indica la secuencia de comandos para matar los procesos coincidentes.

    El usuario root debería ser capaz de ejecutar local de mysql herramientas sin necesidad de autenticación de lo contrario, usted tendrá que proporcionar las credenciales en la línea de comandos.

  2. 9

    Acaba de establecer la siguiente secuencia de comandos bash como un cron job para lograr esto con MySQL 5.0 (mata a cualquier consulta que se ha estado ejecutando durante más de 30 segundos). Compartir aquí en caso de que sea de utilidad a cualquier persona (disculpas si mi bash scripting estilo es ineficaz o atroz, no es mi principal lenguaje de desarrollo):

    #!/bin/bash
    linecount=0
    processes=$(echo "show processlist" | mysql -uroot -ppassword)
    oldIfs=$IFS
    IFS='
    '
    echo "Checking for slow MySQL queries..."
    for line in $processes
    do
        if [ "$linecount" -gt 0 ]
            then
                pid=$(echo "$line" | cut -f1)
                length=$(echo "$line" | cut -f6)
                query=$(echo "$line" | cut -f8)
                #Id User    Host    db  Command Time    State   Info
                if [ "$length" -gt 30 ]
                    then
                        #echo "$pid = $length"
                        echo "WARNING:  Killing query with pid=$pid with total execution time of $length seconds! (query=$query)"
                        killoutput=$(echo "kill query $pid" | mysql -uroot -ppassword)
                        echo "Result of killing $pid:  $killoutput"
                fi
        fi
        linecount=`expr $linecount + 1`
    done
    IFS=$oldIfs
  3. 8

    Empezando con MySQL 5.1 usted puede crear un procedimiento almacenado para la consulta de la information_schmea.PROCESSLIST de mesa para todas las consultas que coincidan con sus criterios de «larga marcha» iterar sobre un cursor para matarlos. A continuación, el programa de instalación de que el procedimiento a ejecutar sobre una base recurrente en el programador de eventos.

    Ver: http://forge.mysql.com/tools/tool.php?id=106

  4. 8

    He pensado que ha sido alrededor de un poco más de tiempo, pero de acuerdo a este,

    MySQL 5.7.4 introduce la posibilidad de establecer lado del servidor de la ejecución de los límites de tiempo, especificado en milisegundos, para el nivel superior de sólo-lectura de las instrucciones SELECT.

    SELECT 
    MAX_STATEMENT_TIME = 1000 --in milliseconds
    * 
    FROM table;

    Tenga en cuenta que esto sólo funciona para sólo lectura de las instrucciones SELECT.

    • NB: cambiado el nombre a MAX_EXECUTION_TIME en v 5.7.8
  5. 3

    No creo que el egrep arriba se encuentra «2000».

    ¿Por qué no tratar simplemente seleccionando el identificador (id así, y evitar todo lo de que posh shell material:

    mysql -e 'select id from information_schema.processlist where info is not null and time > 30;'
  6. 3

    Creo que esta vieja pregunta necesita una respuesta actualizada.

    Puede establecer un GLOBAL tiempo de espera para todos su lectura sólo SELECT consultas como ésta:

    SET GLOBAL MAX_EXECUTION_TIME=1000;

    El tiempo especificado en milisegundos.

    Si desea que el tiempo de espera sólo para una consulta específica, se puede establecer en línea como esta:

    SELECT /*+ MAX_EXECUTION_TIME(1000) */my_column FROM my_table WHERE ...

    MySQL devuelve un error, en lugar de esperar a la eternidad.

    Tenga en cuenta que este método sólo funciona para leer-sólo SELECTs. Si un SELECT declaración se determine que no es sólo de lectura, entonces cualquier temporizador para que se cancela y el siguiente mensaje de NOTA se informa al usuario:

    Note 1908 Select is not a read only statement, disabling timer

    Para las declaraciones con subconsultas, que limita la parte superior SELECT sólo. No se aplica a SELECT declaraciones dentro de los programas almacenados. El uso de la MAX_EXECUTION_TIME sugerencia en SELECT instrucciones dentro de un programa almacenado será ignorado.

    • Este es uno de los que trabajan en MySql 5.7.21 que se ejecutan en Windows.
  7. 2

    Aquí está mi script :

    mysql -e 'show processlist\G' |\
    egrep -b5 'Time: [6-9]{3,10}' |\
    grep 'Id:' |\
    cut -d':' -f2 |\
    grep -v '155' |\ ## Binary Log PID
    sed 's/^ //' |\
    while read id
    do
        mysql -e "kill $id;"
    done

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea