시간이 너무 오래 걸리는 경우 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
'programing' 카테고리의 다른 글
Dapper.NET을 사용하여 저장 프로시저 호출에서 Oracle OUT 매개 변수 값을 가져옵니다. (0) | 2023.07.25 |
---|---|
도메인 간 Ajax 요청을 보내는 Phonegap-Javascript (0) | 2023.07.25 |
Tableau에 연결할 때 MariaDB의 저장 프로시저가 나타나지 않는 이유는 무엇입니까? (0) | 2023.07.25 |
사용자 정의 함수를 사용하여 PHP 배열을 검색하는 우아한 방법 (0) | 2023.07.25 |
자바스크립트에서 epoch 이후 초를 어떻게 얻을 수 있습니까? (0) | 2023.07.25 |