2017-02-16 2 views
0

다음은 내가 시도한 것을 요약 한 것입니다.Python을 사용하여 Sleeping MySQL 연결을 종료하는 방법?

셸 스크립트에서이 작업을 수행 할 수 있지만 --secure-file-priv 옵션을 사용하는 상태에서 서버를 실행중인 경우에는이 작업을 수행 할 수 없습니다. 그리고 나는 그것을 무능하게하고 싶지 않다.

- 공정한 --secure-file-priv를 사용하면 특정 디렉토리로 내보낼 수 있습니다.

show global variables like '%secure%'; 

을 입력하면 MySQL 결과 세트를 직접 파일에 기록 할 수있는 경로를 얻을 수 있습니다.

1. 쉘 스크립트는 Percona의 Percona의 pt-kill

pt-kill --match-command Sleep --kill --victims all --interval 10 
사용하여 연결을 자고 죽이는

을 PT가-죽일

mysql -e "select concat('KILL ',id,';') from information_schema.processlist where Command = 'Sleep' AND user = 'root' into outfile '/tmp/sleep_processes.txt'" 
mysql -e "source /tmp/sleep_processes.txt;" 
rm -rf /tmp/sleep_processes.txt 

2

장애인-priv에 --secure 파일을 필요로하는

3. pand가있는 Python 스크립트 as

판다 스 프레임에서 모든 쿼리가 삭제되도록 나열하는 Python 스크립트. 하지만 판다 스 프레임에서 각 명령을 어떻게 실행합니까?

import MySQLdb as mdb 
import pandas as pd 
con = mdb.connect('localhost', 'root', 'password', 'mydatabase'); 
with con: 
cur = con.cursor() 
cur.execute("select concat('kill ',id,';') sleeping_connections FROM information_schema.processlist isp WHERE Command = 'Sleep' and time > 60") 
rows = cur.fetchall() 
df = pd.DataFrame([[ij for ij in i] for i in rows]) 
df.rename(columns={0: 'Sleeping Connections'}, inplace=True); 
print(df.head(10)) 
+0

@jezrael - FYI. – MontyPython

+0

MySQL 시스템 변수에'wait_timeout'을 설정하는 것을 고려 했습니까? –

+0

@ TanHongTat - 네,하지만 그건 영구적입니다. 내가 너무 낮게 설정하면 MySQL에 연결하는 응용 프로그램에서 풀링 문제가 발생합니다. 그러나이 크론 작업은 일시적인 해결책이었습니다. – MontyPython

답변

0

고유 한 텍스트 처리를 수행하여 임시 파일 (따라서 보안 파일 priv 문제)을 건너 뛸 수 있습니다. 따라서 쉘 -scripting은 secure-file-priv를 비활성화하지 않고도 가능합니다.

IDS=$(mysql -Be 'show processlist' | awk '$5 ~ /Sleep/ {print $1}') 
for i in $IDS; do 
    mysql -Be "kill $i" 
done 

또는 당신이 한 줄에서 작업을 수행 할 수 있습니다

mysql -Be 'show processlist' | awk '$5 ~ /Sleep/ {print $1}'| xargs -n 1 -i%% mysql -Be "kill %%" 

당신은 MySQL의 명령을 실행할 때 일반적으로 얻을 예쁜 복싱을 제거은 "-B"를 발동 "배치 모드". 이를 통해 간단한 텍스트 처리를 통해 모든 것을 죽일 수 있습니다.

이 두 가지 모두 서버에 여러 개의 연결을 작성합니다 (하나는 프로세스를 가져오고 하나는 KILL). 여러분의 환경에서 문제가된다면 모든 KILL을 하나의 연결로 발행하도록 다시 작성할 수 있습니다.

관련 문제