programing

시간이 너무 오래 걸리는 경우 MySQL 쿼리를 중지하려면 어떻게 해야 합니까?

muds 2023. 7. 25. 21:25
반응형

시간이 너무 오래 걸리는 경우 MySQL 쿼리를 중지하려면 어떻게 해야 합니까?

MySQL에서 쿼리 시간을 초과할 수 있습니까?

즉, 쿼리가 지정한 시간을 초과하면 MySQL에 의해 삭제되고 영구 대기 대신 오류가 반환됩니다.

CPAN에는 이를 수행할 수 있는 좋은 Perl 스크립트가 있습니다. http://search.cpan.org/ ~rsoliv/soliv-interval-0.03/sulf-interval-interval

적절한 매개 변수를 사용하여 실행되도록 예약하기만 하면 됩니다./etc/cron.d/mysql_query_timeout CRON 탭 파일을 생성하여 매 분마다 실행되도록 예약합니다.

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

여기서 7200은 허용되는 최대 실행 시간(초)입니다.-s 스위치는 SELECT 쿼리를 제외한 모든 쿼리를 필터링합니다.-K 스위치는 스크립트에 일치하는 프로세스를 중지하도록 지시합니다.

루트 사용자는 인증 없이 로컬 mysql 도구를 실행할 수 있어야 합니다. 그렇지 않으면 명령줄에 자격 증명을 제공해야 합니다.

MySQL 5.0을 사용하여 이를 수행하기 위해 다음 bash 스크립트를 cron 작업으로 설정했습니다(30초 이상 실행된 모든 쿼리를 제거함).누구에게나 유용하다는 것이 입증된 경우 여기서 공유(내 bash 스크립트 스타일이 비효율적이거나 엉망인 경우, 내 기본 개발 언어가 아닌 경우 사과):

#!/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

좀 더 오래된 줄 알았는데, 여기에 따르면,

MySQL 5.7.4에는 최상위 읽기 전용 SELECT 문에 대해 밀리초 단위로 지정된 서버 측 실행 시간 제한을 설정하는 기능이 도입되었습니다.

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

이것은 읽기 전용 SELECT 문에만 적용됩니다.

MySQL 5.1부터는 information_schmea를 쿼리하는 저장 프로시저를 만들 수 있습니다.사용자의 "장기 실행" 기준과 일치하는 모든 쿼리에 대한 PROCESSLIST 테이블을 커서 위에서 반복하여 쿼리를 삭제합니다.그런 다음 해당 절차가 이벤트 스케줄러에서 반복적으로 실행되도록 설정합니다.

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

MySQL 포럼에는 이에 대한 몇 가지 스레드가 있습니다.

이 게시물은 innodb_lock_wait_timeout을 사용하여 서버에서 시간 초과를 설정하는 방법을 자세히 설명합니다.

JDBC를 사용한다고 가정할 때 프로그래밍 방식으로 실행하는 방법은 다음과 같습니다.

저는 이 오래된 질문에 대해 새로운 답변이 필요하다고 생각합니다.

설정할 수 있습니다.GLOBAL 전용에 시간 입니다.SELECT다음과 같은 쿼리:

SET GLOBAL MAX_EXECUTION_TIME=1000;

지정된 시간은 밀리초 단위입니다.

특정 쿼리에 대해서만 시간 초과를 원하는 경우 다음과 같이 인라인으로 설정할 수 있습니다.

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

MySQL은 영원을 기다리는 대신 오류를 반환합니다.

이 방법은 읽기 전용에만 사용할 수 있습니다.SELECT만약에SELECT문이 읽기 전용이 아닌 것으로 확인되면 해당 문에 설정된 타이머가 취소되고 다음 참고 메시지가 사용자에게 보고됩니다.

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

하위 쿼리가 있는 문의 경우 위쪽을 제한합니다.SELECT한합니다. 에만해다니에는 .SELECT저장된 프로그램 내의 문.사용MAX_EXECUTION_TIME에 암시를 주다.SELECT저장된 프로그램 내의 문은 무시됩니다.

나는 위의 egrep가 "2000"을 찾을 것이라고 생각하지 않습니다.
ID만 선택하고 고급스러운 셸을 모두 피하는 것이 어떻습니까?

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

MySQL 5.7.8 이후 SELECT 문에 대한 실행 시간 초과를 정의하는 max_execution_time 옵션이 있습니다.

내 대본은 다음과 같습니다.

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

언급URL : https://stackoverflow.com/questions/2137084/how-can-i-stop-a-mysql-query-if-it-takes-too-long

반응형