python練手指令碼 自動結束mysql慢查詢會話

2021-09-29 00:16:22 字數 4102 閱讀 7537

背景

生產環境的有些sql查詢寫得太複雜,或是表很大,對應索引未建立或建立不合理,或是查詢未充分使用索引等,就有可能出現慢查詢,一些慢查詢需要修改程式,可能沒那麼快能解決,這時如果有個指令碼能自動檢測符合條件的慢查詢會話並結束,那麼是很方便的,當然運維人員也可順便弄個檢測慢查詢並告警的指令碼。

涉及知識點

mysql慢查詢會話查詢

schedule定時任務排程

pymysql執行sql

**分解

mysql慢查詢

#會話查詢,只能查詢所有會話,不能按條件過濾,不過比較好記

show processlist;

#從information_schema中查詢會話,可以按條件過濾

select

*from

information_schema.

`processlist`

;#查詢符合條件的慢會話,id是會話id,info是正在執行的sql,time是會話持續時間,殺會話時注意要做好過濾

select

id,info,

time

from

information_schema.

`processlist`

where

info like

'%select * from table%'

andtime

>10;

#直接使用sql批量殺會話,拼接kill ***;後,拷貝了在控制台執行

select

concat(

'kill '

, id,

';')

from

information_schema.

`processlist`

where

info like

'%select * from table%'

andtime

>

10;

指令碼主入口
if __name__ ==

'__main__'

:#每5秒執行檢查任務

schedule.every(5)

.seconds.do(kill_slow)

#此處固定寫法,意思是每秒鐘schedule看下是否有pending的任務,有就執行

while

true

: schedule.run_pending(

) time.sleep(

1)

schedule的其它示例
import schedule

import time

defjob

(message=

'stuff'):

print

("i'm working on:"

, message)

#每10分鐘

schedule.every(10)

.minutes.do(job)

#每小時

schedule.every(

).hour.do(job, message=

'things'

)#每天10點30分

schedule.every(

).day.at(

"10:30"

).do(job)

while

true

: schedule.run_pending(

) time.sleep(

1)

pymysql使用
# 連線資料庫,設定結果集用dict返回,autocommit自動提交事務

db = pymysql.connect(host=

'localhost'

, db=

'dbname'

, user=

'root'

, passwd=

'admin'

, port=

3306

, charset=

'utf8'

, cursorclass=pymysql.cursors.dictcursor, autocommit=

true

)cursor = db.cursor(

)

查詢符合條件的慢會話並結束
def

kill_slow()

: cursor.execute(

""" select

id,info,

time

from

information_schema.`processlist`

where

info like '%select * from table%'

and time > 10;

""") slow_sessions = cursor.fetchall(

)for slow_session in slow_sessions:

print

("slow session detected, kill it:\n id:%s\nsql:%s"%(

slow_session[0]

, slow_session[1]

))cursor.execute(

"kill %s"

, slow_session[0]

)

完整**
import time

import pymysql

import schedule

# 連線資料庫,設定結果集用dict返回,autocommit自動提交事務

db = pymysql.connect(host=

'localhost'

, db=

'dbname'

, user=

'root'

, passwd=

'admin'

, port=

3306

, charset=

'utf8'

, cursorclass=pymysql.cursors.dictcursor, autocommit=

true

)cursor = db.cursor(

)def

kill_slow()

: cursor.execute(

""" select

id,info,

time

from

information_schema.`processlist`

where

info like '%select * from table%'

and time > 10;

""") slow_sessions = cursor.fetchall(

)for slow_session in slow_sessions:

print

("slow session detected, kill it:\n id:%s\nsql:%s"%(

slow_session[

"id"

], slow_session[

"info"])

) cursor.execute(

"kill %s"

, slow_session[

"id"])

if __name__ ==

'__main__'

:# 每5秒執行檢查任務

schedule.every(5)

.seconds.do(kill_slow)

# 此處固定寫法,意思是每秒鐘schedule看下是否有pending的任務,有就執行

while

true

: schedule.run_pending(

) time.sleep(

1)

Python 如何結束退出 py 指令碼

當你執行指令碼,在判斷條件滿足時,就退出指令碼,結束本次執行。使用sys.exit 直接退出程式,但是會引發乙個 systemexit 異常 這個systemexit異常,是唯一乙個不會被認為是錯誤的異常,當沒有設定異常捕獲的話,是不會有報錯的,可以進行正常退出,當然也可以捕獲這個異常進行一些其他操...

python自動執行指令碼

總體思路 將網頁執行指令碼抓包後轉換成python 用迴圈自動執行 1 抓包 f12開啟瀏覽器抓包,點執行按鈕,network copy curl 2 curl轉換成python curl轉換python 將轉換後的 copy到python檔案中,後面加迴圈語句,如下 for month in ra...

Python 指令碼自動傳送郵件

自動傳送郵件功能是我們經常要用到的,比如每天定時統計報表資訊,然後自動傳送給運營人員,協助運營人員進行業務資料分析。本文是用python寫的乙個自動傳送郵件的指令碼,呼叫函式時,直接把發件人郵箱位址 密碼 收件人郵箱位址 郵件標題 內容等資訊傳遞給函式,即可實現自動傳送郵件功能。指令碼 如下 pyt...