91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中如何自動結束mysql慢查詢會話

發布時間:2021-06-21 15:21:33 來源:億速云 閱讀:274 作者:小新 欄目:開發技術

這篇文章主要介紹python中如何自動結束mysql慢查詢會話,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

生產環境的有些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%'
AND time > 10;
#直接使用sql批量殺會話,拼接kill xxx;后,拷貝了在控制臺執行
SELECT
 concat('KILL ', id, ';')
FROM
 information_schema.`PROCESSLIST`
WHERE
 info LIKE '%select * from table%'
AND time > 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
def job(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[0], slow_session[1]))
    cursor.execute("kill %s", slow_session[0])
if __name__ == '__main__':
  # 每5秒執行檢查任務
  schedule.every(5).seconds.do(kill_slow)
  # 此處固定寫法,意思是每秒鐘schedule看下是否有pending的任務,有就執行
  while True:
    schedule.run_pending()
    time.sleep(1)

以上是“python中如何自動結束mysql慢查詢會話”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

诸城市| 堆龙德庆县| 石景山区| 德令哈市| 来安县| 屏东市| 武宁县| 潞西市| 元阳县| 屯昌县| 扶风县| 新昌县| 宣化县| 离岛区| 招远市| 通道| 南丰县| 专栏| 潮安县| 枣强县| 尼玛县| 榆社县| 神木县| 游戏| 孙吴县| 红原县| 东乌珠穆沁旗| 通渭县| 灌云县| 连平县| 南丹县| 贵港市| 十堰市| 西华县| 庆安县| 翁牛特旗| 海城市| 庄河市| 关岭| 文山县| 泰州市|