背景
生產環境的有些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...