返回顶部
首页 > 资讯 > 数据库 >python写的监控mysql主从的ap
  • 211
分享到

python写的监控mysql主从的ap

主从pythonmysql 2023-01-31 06:01:42 211人浏览 薄情痞子
摘要

#!/usr/bin/env python # -*- coding: utf-8 -*- #File:repl_wx.py #creater:wangwei import Mysqldb import Queue,os,base64,ti

  1. #!/usr/bin/env python 
  2. # -*- coding: utf-8 -*- 
  3. #File:repl_wx.py 
  4. #creater:wangwei 
  5. import Mysqldb 
  6. import Queue,os,base64,time,sys,wx,threading 
  7. import ConfigParser,logging 
  8. from wx.lib.mixins.listctrl import ListCtrlAutoWidthMixin 
  9.  
  10.  
  11. class Repl: 
  12.     def __init__(self,user,passwd,host,hostname): 
  13.         self.user = user 
  14.         self.passwd = passwd 
  15.         self.host = host 
  16.         self.hostname = hostname 
  17.     def Slave(self,user,passwd,host,hostname): 
  18.         try: 
  19.             conn = mysqldb.connect(host,user = self.user,passwd = self.passwd,connect_timeout = 2) 
  20.             cursor = conn.cursor(cursorclass = Mysqldb.cursors.DictCursor)  
  21.             sql = "SHOW VARIABLES LIKE 'version'" 
  22.             cursor.execute(sql) 
  23.             alldata = cursor.fetchall() 
  24.             version = alldata[0]["Value"].split('.')[0] 
  25.             sql = "show slave status" 
  26.             cursor.execute(sql) 
  27.             alldata = cursor.fetchall() 
  28.             IO = alldata[0]["Slave_IO_Running"] 
  29.             SQL = alldata[0]["Slave_SQL_Running"] 
  30.             if version == "4": 
  31.                 Errno = alldata[0]["Last_errno"] 
  32.                 Error = alldata[0]["Last_error"] 
  33.             else: 
  34.                 Errno = alldata[0]["Last_Errno"] 
  35.                 Error = alldata[0]["Last_Error"] 
  36.             cursor.close() 
  37.             conn.close() 
  38.             return IO,SQL,Errno,Error 
  39.         except: 
  40.             return 0,0,0,0 
  41.  
  42. class Check: 
  43.     def __init__(self,app,user,passwd,host,hostname): 
  44.         self.app=app 
  45.         self.user = user 
  46.         self.passwd = passwd 
  47.         self.host = host 
  48.         self.hostname = hostname 
  49.         boss = Repl(user,passwd,host,hostname) 
  50.         IO,SQL,Errno,Error = boss.Slave(self.user,self.passwd,self.host,self.hostname) 
  51.         self.IO = IO 
  52.         self.SQL = SQL 
  53.         self.Errno = Errno 
  54.         self.Error = Error 
  55.     def Status(self): 
  56.         now = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) 
  57.         if not self.IO and not self.SQL: 
  58.             errlist = [self.host,self.hostname,now,'Error:Can not Connect mysql!'] 
  59.             wx.CallAfter(self.app.ErrORMessage, errlist) 
  60.             a = self.hostname +  " " + self.host + " Can not Connect mysql DB!" 
  61.             logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',datefmt='%Y-%m-%d %H:%M:%S',filename='slave.log',filemode='a') 
  62.             logging.error(a) 
  63.             return 0 
  64.         if self.IO == "Yes": 
  65.             if self.SQL == "Yes": 
  66.                 #print now + " " + self.hostname + " OK -slave is running " + self.host 
  67.                 #errlist = [self.host,self.hostname,now,'OK -slave is running!'] 
  68.                 #wx.CallAfter(self.app.ErrorMessage, errlist) 
  69.                 return 0 
  70.             else: 
  71.                 #print now + " " + self.hostname + " Critical -slave SQL Error!" 
  72.                 errlist = [self.host,self.hostname,now,'Critical -slave SQL Error!'] 
  73.                 wx.CallAfter(self.app.ErrorMessage, errlist) 
  74.                 a = self.hostname +  " " + self.host + " Critical -slave SQL Error!" 
  75.                 logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',datefmt='%Y-%m-%d %H:%M:%S',filename='slave.log',filemode='a') 
  76.                 logging.error(a) 
  77.                 return 1 
  78.         else: 
  79.             if self.SQL == "Yes": 
  80.                 #print now + " " + self.hostname + " Critical -slave IO Error!" 
  81.                 errlist = [self.host,self.hostname,now,'Critical -slave IO Error!'] 
  82.                 wx.CallAfter(self.app.ErrorMessage, errlist) 
  83.                 a = self.hostname +  " " + self.host + " Critical -slave IO Error!" 
  84.                 logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',datefmt='%Y-%m-%d %H:%M:%S',filename='slave.log',filemode='a') 
  85.                 logging.error(a) 
  86.                 return 2 
  87.             else: 
  88.                 #print now + " " + self.hostname + " Critical -slave IO and SQL Error!" 
  89.                 errlist = [self.host,self.hostname,now,'Critical -slave IO and SQL Error!'] 
  90.                 wx.CallAfter(self.app.ErrorMessage, errlist) 
  91.                 a = self.hostname +  " " + self.host + " Critical -slave IO and SQL Error!" 
  92.                 logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',datefmt='%Y-%m-%d %H:%M:%S',filename='slave.log',filemode='a') 
  93.                 logging.error(a) 
  94.                 return 3 
  95.  
  96. class StartScan(threading.Thread): 
  97.     def __init__(self,app): 
  98.         threading.Thread.__init__(self) 
  99.         self.app = app 
  100.         self.timeToQuit = threading.Event() 
  101.         self.timeToQuit.clear() 
  102.     def stop(self): 
  103.         self.timeToQuit.set() 
  104.     def run(self): 
  105.         self.user,self.passwd,self.hostlist,self.a,self.time = self.conf() 
  106.         self.times = 1 
  107.         while True: 
  108.             threads = [] 
  109.             if self.timeToQuit.isSet(): 
  110.                 break 
  111.             for i in range(self.a): 
  112.                 host = self.hostlist[i][0] 
  113.                 hostname = self.hostlist[i][1] 
  114.                 boss = Check(self,self.user,self.passwd,host,hostname) 
  115.                 t = threading.Thread(target=boss.Status,args=()) 
  116.                 threads.append(t) 
  117.             #print 'Total %s Threads is working...' %self.a + '\n' 
  118.             msg = u"第" + "%s"%(self.times) + u"次扫描....." 
  119.             self.app.CurrentScan(msg) 
  120.             for i in range(self.a): 
  121.                 threads[i].start() 
  122.                 time.sleep(0.05) 
  123.             for i in range(self.a): 
  124.                 threads[i].join() 
  125.             self.times += 1 
  126.             time.sleep(self.time) 
  127.     def CurrentScan(self,msg): 
  128.         wx.CallAfter(self.app.CurrentScan, msg) 
  129.     def conf(self): 
  130.         fp = ConfigParser.ConfigParser() 
  131.         fp.readfp(open('repl.ini')) 
  132.         iplist = fp.get("global", "iplist") 
  133.         user = fp.get("global", "user") 
  134.         passwd = fp.get("global", "passwd") 
  135.         time = fp.getint("global","time") 
  136.         user = base64.decodestring(user) 
  137.         passwd = base64.decodestring(passwd) 
  138.         hostlist = [] 
  139.         for i in iplist.split(";"): 
  140.             hostlist.append(i.split(",")) 
  141.         a = len(hostlist) 
  142.         return user,passwd,hostlist,a,time 
  143.     def ErrorMessage(self,errlist): 
  144.         wx.CallAfter(self.app.ErrorMessage, errlist) 
  145.  
  146. class ScanUnit(wx.Panel): 
  147.     def __init__(self, parent,id=-1,title='',port='',): 
  148.         wx.Panel.__init__(self, parent,id) 
  149.         self.parent = parent 
  150.         self.id = id 
  151.         self.title = title 
  152.         self.scaning = wx.StaticText(self,-1,label=u"准备扫描……",style = wx.ALIGN_LEFT|wx.ST_NO_AUTORESIZE) 
  153.         self.openBtn=wx.Button(self,-1,u'打开日志') 
  154.         self.openBtn.SetForegroundColour('red') 
  155.         #self.openBtn.SetBackgroundColour('purple') 
  156.         self.startBtn=wx.Button(self,-1,u'扫描') 
  157.         self.stopBtn=wx.Button(self,-1,u'停止') 
  158.         self.stopBtn.Disable() 
  159.         self.list = AutoWidthListCtrl(self) 
  160.         self.list.SetTextColour("red") 
  161.         self.list.InsertColumn(0, 'IP', width=120) 
  162.         self.list.InsertColumn(1, u'区组名称', width=100) 
  163.         self.list.InsertColumn(3, u'发生时间',width=140) 
  164.         self.list.InsertColumn(4, u'返回信息',width=200) 
  165.         self.list.DeleteAllItems() 
  166.         self.Bind(wx.EVT_BUTTON,self.OnStart,self.startBtn) 
  167.         self.Bind(wx.EVT_BUTTON,self.OnStop,self.stopBtn) 
  168.         self.Bind(wx.EVT_BUTTON,self.Open,self.openBtn) 
  169.         self._layout() 
  170.     def _layout(self):  #布局 
  171.         action = wx.BoxSizer(wx.HORIZONTAL) 
  172.         action.Add(self.scaning,3, wx.ALIGN_CENTER_HORIZONTAL|wx.EXPAND)#对齐没有解决 
  173.         action.Add(self.startBtn,1, wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) 
  174.         action.Add(self.stopBtn,1, wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) 
  175.         action.Add(self.openBtn,1, wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) 
  176.         listbox = wx.BoxSizer(wx.HORIZONTAL) 
  177.         listbox.Add(self.list, 1, wx.EXPAND) 
  178.         self.box = wx.StaticBox(self, self.id, self.title,style = wx.SUNKEN_BORDER) 
  179.         self.ScanUnit = wx.StaticBoxSizer(self.box, wx.VERTICAL) 
  180.         self.ScanUnit.Add(action, 0, wx.ALL|wx.EXPAND, 2) 
  181.         self.ScanUnit.Add(listbox, 5, wx.EXPAND, 2) 
  182.         self.SetSizer(self.ScanUnit) 
  183.         self.parent.sizer.Add(self,1,wx.EXPAND) 
  184.     def OnStart(self,event): 
  185.         self.startBtn.Disable() 
  186.         self.stopBtn.Enable() 
  187.         #self.DeleteItems() 
  188.         self.thread=StartScan(self) 
  189.         self.thread.setDaemon(True) 
  190.         self.thread.start() 
  191.         self.scaning.SetLabel(u'正在扫描……') 
  192.     def OnStop(self,event): 
  193.         self.stopBtn.Disable() 
  194.         self.startBtn.Enable() 
  195.         self.thread.stop() 
  196.         self.scaning.SetLabel(u'停止扫描……') 
  197.     def Open(self,event): 
  198.         wx.Execute("notepad slave.log") 
  199.         #os.system('notepad slave.log') 
  200.     def CurrentScan(self,msg): #当前扫描动作 
  201.         self.scaning.SetLabel(msg) 
  202.     def ErrorMessage(self,errlist):#错误信息 
  203.         index = self.list.InsertStringitem(sys.maxint, errlist[0]) 
  204.         self.list.SetStringItem(index, 1, errlist[1]) 
  205.         self.list.SetStringItem(index, 2, errlist[2]) 
  206.         self.list.SetStringItem(index, 3, errlist[3]) 
  207.         self.list.RefreshItem(index) 
  208.     def DeleteItems(self): 
  209.         self.list.DeleteAllItems() 
  210.  
  211. class AutoWidthListCtrl(wx.ListCtrl, ListCtrlAutoWidthMixin): 
  212.     def __init__(self, parent): 
  213.         wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT|wx.LC_HRULES|wx.LC_VRULES) 
  214.         ListCtrlAutoWidthMixin.__init__(self) 
  215.  
  216. class MainPanel(wx.Panel): 
  217.     def __init__(self,parent): 
  218.         wx.Panel.__init__(self, parent) 
  219.         self.sizer = wx.GridSizer(rows=1,cols=1,hgap = 20,vgap = 15) 
  220.         self.aaa = ScanUnit(self,-1,u'<Mysql主从>','8001') 
  221.         self.SetSizer(self.sizer) 
  222.  
  223. class CreateMenu():#创建菜单 
  224.     def __init__(self,parent): 
  225.         self.menuBar = wx.MenuBar() 
  226.         self.file = wx.Menu() 
  227.         self.close = self.file.Append(-1,u'退出(&X)') 
  228.         self.menuBar.Append(self.file,u'文件(&F)') 
  229.         self.help = wx.Menu() 
  230.         self.about = self.help.Append(-1,u'关于(&A)') 
  231.         self.menuBar.Append(self.help,u'帮助(&H)') 
  232.         parent.SetMenuBar(self.menuBar) 
  233.  
  234. class MyFrame(wx.App): 
  235.     u'''''Mysql主从监控\nE-mail:wangwei03@gyyx.cn\nQQ:83521260''' 
  236.     def OnInit(self): 
  237.         self.frame=wx.Frame(parent=None,id=-1,title=u'Mysql主从监控程序',size=(650,450)) 
  238.         self.frame.SetIcon(wx.Icon('kankan.ico', wx.BITMAP_TYPE_ICO)) 
  239.         self.panel = MainPanel(self.frame) 
  240.         self.frame.Center(direction=wx.BOTH) 
  241.         self.menu = CreateMenu(self.frame) 
  242.         self.frame.statusBar = self.frame.CreateStatusBar(3) 
  243.         #print dir(self.frame.statusBar) 
  244.         self.frame.statusBar.SetStatusWidths([-12,-12,-13])  
  245.         self.frame.statusBar.SetForegroundColour('purple') 
  246.         self.frame.statusBar.SetBackgroundColour('pink') 
  247.         self.frame.StatusBar.Font.Bold = True 
  248.         #self.frame.StatusBar.Font.Size = 13 
  249.         self.frame.StatusBar.SetStatusText(u"好好学习",0) 
  250.         self.frame.StatusBar.SetStatusText(u"天天向上",1) 
  251.         self.timer=wx.PyTimer(self.Notify) 
  252.         self.timer.Start(1000) 
  253.         self.Notify() 
  254.         self.Bind(wx.EVT_MENU,self.OnClose,self.menu.close) 
  255.         self.Bind(wx.EVT_MENU,self.OnAbout,self.menu.about) 
  256.         self.SetTopWindow(self.frame) 
  257.         self.frame.Show() 
  258.         return True 
  259.     def Notify(self): 
  260.         t = time.localtime(time.time()) 
  261.         st = time.strftime("%Y-%m-%d %H:%M:%S",t) 
  262.         self.frame.StatusBar.SetStatusText(u"当前系统时间  "+st,2) 
  263.     def OnClose(self,event): 
  264.         self.frame.Destroy() 
  265.     def OnAbout(self,event): 
  266.         wx.MessageBox(self.__doc__,'Mysql Replication Status',wx.OK) 
  267.  
  268. if __name__ == "__main__":  
  269.     app=MyFrame(None) 
  270.     app.MainLoop() 

配置文件的名字为:repl.ini

格式为:

[global]
user = cmVwbsdfsdfA==
passwd = SGMxNzVBcEdEZ0ZRTGsfdfV6aA==
time = 10
iplist = 192.168.8.11,烟雨江南;192.168.8.12,开天辟地;
#说明:用户名和密码#base64.encodestring(),base64.decodestring()加密和解密,time为设置的超时时间(单位为秒),iplist为IP和名字列表

主要用于批量的mysql丛库服务器状态监控

您可能感兴趣的文档:

--结束END--

本文标题: python写的监控mysql主从的ap

本文链接: https://lsjlt.com/news/189497.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python写的监控mysql主从的ap
    #!/usr/bin/env python # -*- coding: utf-8 -*- #File:repl_wx.py #creater:wangwei import MySQLdb import Queue,os,base64,ti...
    99+
    2023-01-31
    主从 python mysql
  • 使用python对mysql主从进行监控
    1.编写python的监控脚本   A.通过获取mysql库中的状态值来判断这个mysql主从状态是否正常        B.进行两个状态值的判断           C.进行调取钉钉机器人,发送消息      2.设置定时任务进行脚本...
    99+
    2023-01-30
    主从 python mysql
  • 监控MySQL主从状态的shell脚本
    分享一个Linux下,监控MySQL主从状态及配合企业微信机器人报警的Shell脚本 SLAVE_IP:为监控的主机IP USER:为msyql用户 PASSWORD:为mysql密码 WHER&#...
    99+
    2022-05-27
    监控MySQL 监控MySQL主从状态 MySQL shell脚本
  • Mysql主从状态监控脚本
    目标:对Mysql从库进行状态监控,如果从库复制异常就告警思路:1、首先查找Mysql从库的4个参数值(show slave status根据这个命令);分别是从库的IO线程、SQL线程、复制延迟时间(这个...
    99+
    2024-04-02
  • shell监控脚本实例—监控mysql主从复制
    本节内容:监控mysql主从复制的shell脚本。 说明:监控脚本在 rhel5 下测试正常,其它版本的linux 系统请自行测试,需要的一些准备工作可以查看这篇文章 代码: #监控mysql 主从复制c...
    99+
    2022-06-04
    主从 脚本 实例
  • shell脚本监控mysql主从状态
    此脚本首先判断mysql服务器是否运行,如果正常,继续判断主从,否则发邮件告警,只发一次。判断主从状态是判断IO和SQL线程是否都为yes,如果不是则发邮件通知,只发一次。 #!/bin/bash#def...
    99+
    2022-06-04
    主从 脚本 状态
  • 监控mysql数据库主从状态
    python版本2.6.6#!/usr/bin/pythonimport MySQLdbdef check_mysql():    status = True &nb...
    99+
    2024-04-02
  • shell如何监控mysql主从复制
    这篇文章主要为大家展示了“shell如何监控mysql主从复制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“shell如何监控mysql主从复制”这篇文章吧。说明:监控脚本在 rhel5 下测试...
    99+
    2023-06-09
  • 转:MySQL主从、字典死锁、连接数的Python监控脚本
    #!/usr/bin/python ...
    99+
    2024-04-02
  • Mysql如何实现主从延迟监控
    这篇文章主要介绍了Mysql如何实现主从延迟监控,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 Mysql 主从延时监控 pt-hear...
    99+
    2024-04-02
  • 自动监控主从MySQL同步的SHELL脚本分享
    这篇文章主要介绍“自动监控主从MySQL同步的SHELL脚本分享”,在日常操作中,相信很多人在自动监控主从MySQL同步的SHELL脚本分享问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • Linux下MySQL主从同步监控shell脚本
    说明: 操作系统:CentOS 目的:定时监控MySQL主从数据库是否同步,如果不同步,记录故障时间,并执行命令使主从恢复同步状态 1、创建脚本文件 vi /home/crontab/ch...
    99+
    2022-06-03
    Linux 监控
  • Shell脚本实现监控MySQL主从同步
    代码如下: #!/bin/bash #check MySQL_Slave Status #crontab time 00:10 MYSQLPORT=`netstat -na|grep "LISTEN...
    99+
    2022-06-04
    主从 脚本 Shell
  • 使用zabbix怎么监控MySQL主从状态
    本篇文章为大家展示了使用zabbix怎么监控MySQL主从状态,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一般情况下,在MySQL的从上查看从的运行状态是通过Sl...
    99+
    2024-04-02
  • 利用Python监测MySQL主从状态
        探测MySQL主从状态,如果从未同步,则发邮件通知运维人员。利用定时任务秒级监测!# -*- coding: utf-8 -* #! /usr/bin/env python from fabric.api import * fro...
    99+
    2023-01-31
    主从 状态 Python
  • 怎么用shell脚本监控mysql主从状态
    这篇文章主要介绍“怎么用shell脚本监控mysql主从状态”,在日常操作中,相信很多人在怎么用shell脚本监控mysql主从状态问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用shell脚本监控mys...
    99+
    2023-06-09
  • MySQL主从复制状态监控及微信告警
    MySQL主从复制状态监控及微信告警shell脚本实现当MySQL主从状态异常时,触发微信告警1. 设置主从监控脚本vi /opt/scripts/mysql/check_repl_status.sh#!/...
    99+
    2024-04-02
  • 怎么用Shell脚本实现监控MySQL主从同步
    这篇文章主要介绍“怎么用Shell脚本实现监控MySQL主从同步”,在日常操作中,相信很多人在怎么用Shell脚本实现监控MySQL主从同步问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Shell脚本实...
    99+
    2023-06-09
  • 如何使用脚本监控mysql主从复制状态
    使用脚本监控 mysql 主从复制状态的方法:准备脚本,包含必要信息和获取主从库信息的命令。运行脚本以获取主库的 io 线程、io 位置和从库的 io 线程、io 位置和 sql 线程、...
    99+
    2024-06-15
    mysql
  • 用python监控mysql数据库是否可写
    监控数据库是否可写,如果你的监控脚本逻辑是,写入数据库成功后显示成功,反之显示不成功然后报警。那么难题来了,数据库真的无法写入了,你的监控脚本的写入命令也会被mysql hang住,一直卡在那里,直到天荒地...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作