python自動(dòng)結(jié)束mysql慢查詢會(huì)話的實(shí)例代碼
生產(chǎn)環(huán)境的有些sql查詢寫得太復(fù)雜,或是表很大,對(duì)應(yīng)索引未建立或建立不合理,或是查詢未充分使用索引等,就有可能出現(xiàn)慢查詢,一些慢查詢需要修改程序,可能沒那么快能解決,這時(shí)如果有個(gè)腳本能自動(dòng)檢測(cè)符合條件的慢查詢會(huì)話并結(jié)束,那么是很方便的,當(dāng)然運(yùn)維人員也可順便弄個(gè)檢測(cè)慢查詢并告警的腳本。
涉及知識(shí)點(diǎn)
- mysql慢查詢會(huì)話查詢
- schedule定時(shí)任務(wù)調(diào)度
- pymysql執(zhí)行sql
代碼分解
mysql慢查詢
#會(huì)話查詢,只能查詢所有會(huì)話,不能按條件過(guò)濾,不過(guò)比較好記
show PROCESSLIST;
#從information_schema中查詢會(huì)話,可以按條件過(guò)濾
SELECT
*
FROM
information_schema.`PROCESSLIST`;
#查詢符合條件的慢會(huì)話,id是會(huì)話ID,info是正在執(zhí)行的sql,time是會(huì)話持續(xù)時(shí)間,殺會(huì)話時(shí)注意要做好過(guò)濾
SELECT
id,
info,
time
FROM
information_schema.`PROCESSLIST`
WHERE
info LIKE '%select * from table%'
AND time > 10;
#直接使用sql批量殺會(huì)話,拼接kill xxx;后,拷貝了在控制臺(tái)執(zhí)行
SELECT
concat('KILL ', id, ';')
FROM
information_schema.`PROCESSLIST`
WHERE
info LIKE '%select * from table%'
AND time > 10;
腳本主入口
if __name__ == '__main__':
#每5秒執(zhí)行檢查任務(wù)
schedule.every(5).seconds.do(kill_slow)
#此處固定寫法,意思是每秒鐘schedule看下是否有pending的任務(wù),有就執(zhí)行
while True:
schedule.run_pending()
time.sleep(1)
schedule的其它示例
import schedule
import time
def job(message='stuff'):
print("I'm working on:", message)
#每10分鐘
schedule.every(10).minutes.do(job)
#每小時(shí)
schedule.every().hour.do(job, message='things')
#每天10點(diǎn)30分
schedule.every().day.at("10:30").do(job)
while True:
schedule.run_pending()
time.sleep(1)
pymysql使用
# 連接數(shù)據(jù)庫(kù),設(shè)置結(jié)果集用dict返回,autocommit自動(dòng)提交事務(wù)
db = pymysql.connect(host='localhost', db='dbname',
user='root', passwd='admin',
port=3306, charset='utf8',
cursorclass=pymysql.cursors.DictCursor, autocommit=True)
cursor = db.cursor()
查詢符合條件的慢會(huì)話并結(jié)束
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
# 連接數(shù)據(jù)庫(kù),設(shè)置結(jié)果集用dict返回,autocommit自動(dòng)提交事務(wù)
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])
if __name__ == '__main__':
# 每5秒執(zhí)行檢查任務(wù)
schedule.every(5).seconds.do(kill_slow)
# 此處固定寫法,意思是每秒鐘schedule看下是否有pending的任務(wù),有就執(zhí)行
while True:
schedule.run_pending()
time.sleep(1)
總結(jié)
以上所述是小編給大家介紹的python自動(dòng)結(jié)束mysql慢查詢會(huì)話的實(shí)例代碼,希望對(duì)大家有所幫助!
相關(guān)文章
python實(shí)現(xiàn)的按要求生成手機(jī)號(hào)功能示例
這篇文章主要介紹了python實(shí)現(xiàn)的按要求生成手機(jī)號(hào)功能,涉及Python流程控制、隨機(jī)數(shù)操作及數(shù)學(xué)運(yùn)算相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-10-10
Python實(shí)現(xiàn)簡(jiǎn)易端口掃描器代碼實(shí)例
本篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)易端口掃描器的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
Python 代碼在函數(shù)中運(yùn)行得更快的原因解析
我們知道,python 是一種解釋型語(yǔ)言,它會(huì)逐行讀取并執(zhí)行代碼,小伙伴們可能會(huì)有這個(gè)疑問(wèn):為什么在函數(shù)中運(yùn)行的 Python 代碼速度更快,今天這篇文章將會(huì)解答大家心中的疑惑2023-09-09
如何利用Python給自己的頭像加一個(gè)小國(guó)旗(小月餅)
這篇文章主要給大家介紹了關(guān)于如何利用Python給自己的頭像加一個(gè)小國(guó)旗(小月餅)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Python實(shí)現(xiàn)爬取知乎神回復(fù)簡(jiǎn)單爬蟲代碼分享
這篇文章主要介紹了Python實(shí)現(xiàn)爬取知乎神回復(fù)簡(jiǎn)單爬蟲代碼分享,本文實(shí)現(xiàn)了爬取知乎的“如何正確地吐槽”收藏夾,是對(duì)個(gè)人的一個(gè)興趣實(shí)現(xiàn),需要的朋友可以參考下2015-01-01
django實(shí)現(xiàn)支付寶支付實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于django支付寶支付的代碼實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2019-10-10

