用Python对MySQL同步状态进行监控_MySQL
用Python对MySQL同步状态进行监控
使用Python对MySQL数据库服务器是否可访问,及主从同步是否中断进行监控,是一件非常简单的事情。感谢Python给我们带来了如此简单,强大,快捷的开发环境。
本文使用到的Python模块
使用telnetlib校验服务器是否可被访问
使用SMTP向管理员发送通知邮件
使用MySQL官方的驱动对数据库进行访问
使用optparse实现命令行参数的提取
实现原理
使用optparse模块获取命令行参数。读取defaults-file设置文件内容(如果存在),使用参数覆盖defaults-file的值(如果传递参数,如:–host, –user, –to之类)。
直接去连MySQL等待是否能进行访问的返回结果太慢了,所以使用telnet对服务器的连通性进行验证。可以设置等待时间,可控性高一些。
当服务器工作正常,使用MySQL与服务器进行连接,获取主从同步的状态。
将获取服务器的异常状态信息(服务器无法访问,主从同步的状态中断),使用SMTP发送给管理员,并把造成中断同步的异常信息一同发送到管理员的邮箱中。
slavecheckpoint.py
<code class="python hljs ">coding=utf-8 """ 数据库同步状态侦测 MySQL数据库同步复制状态监测脚本。可配合Linux下的crond进行定时监测。如果同步 状态异常,侧使用邮件通知管理员,并将造成同步中断的错误信息也包含到邮件当中,管 理员可即时通过错误信息直接定位异常。 实例: python slavecheckpoint.py --defaults-file=/etc/slave.cnf --to=xxxx@abc.com ===FILE:slave.cnf=========== [config] smtp_host=smtp.163.com from=消息中心<xxx@162.com> host=localhost """ import mysql.connector from mysql.connector import errorcode import telnetlib import smtplib from email.mime.text import MIMEText import optparse from ConfigParser import ConfigParser import os,time,sys class SlaveStatu: __instance__ = None __error__ = [] def __init__(self,*args,**kwargs): self.__config__ = { "host":"localhsot", "user":"root", "password":"", "port":3306, "smtp_host":"localhost", "smtp_user":"", "smtp_password":"", "from":"admin@localhost", "to":"" } #优先读取设置文件中的值 if not kwargs["defaults_file"] is None: defaults_file = self.__read_defaults_file__( kwargs["defaults_file"] ) del kwargs["defaults_file"] #使用参数的设置去覆盖设置文件的值 for key,val in kwargs.items(): if not val is None and len(val) > 0: self.__config__[key] = val def __configParseMySQL__(self): """ 提取数据库的设置 :return: dict """ return { "host" : self.__config__["host"], "port" : self.__config__["port"], "user" : self.__config__["user"], "password" : self.__config__["password"] } def __configParseSMTP__(self): """ 提取SMTP邮件设置 :return: dict """ return { "smtp_host": self.__config__["smtp_host"], "smtp_user": self.__config__["smtp_user"], "smtp_password": self.__config__["smtp_password"], "from": self.__config__["from"], "to": self.__config__["to"] } def __read_defaults_file__( self, filePath ): """ 加载设置文件设置的值 :param filePath: 设置文件路径 :return: """ section = "config" if os.path.exists( filePath ): cnf = ConfigParser() cnf.read( filePath ) options = cnf.options( section ) for key in options: self.__config__[key] = cnf.get( section, key ) def telnet( self, host, port, timeout=5 ): """ 测试服务器地址和端口是否畅通 :param host: 服务器地址 :param port: 服务器端口 :param timeout: 测试超时时间 :return: Boolean """ try: tel = telnetlib.Telnet( host, port, timeout ) tel.close() return True except: return False def connect(self): """ 创建数据库链接 """ try: config = self.__configParseMySQL__() if self.telnet( config["host"],config["port"]): self.__instance__ = mysql.connector.connect( **config ) return True else: raise Exception("unable connect") except: self.__error__.append( "无法连接服务器主机: {host}:{port}".format( host=config[ "host"], port=config["port"]) ) return False def isSlave(self): """ 数据库同步是否正常 :return: None同步未开启,False同步中断,True同步正常 """ cur = self.__instance__.cursor(dictionary=True) cur.execute("SHOW SLAVE STATUS") result = cur.fetchone() cur.close() if result: if result["Slave_SQL_Running"] == "Yes" and result["Slave_IO_Running"] == "Yes": return True else: if result["Slave_SQL_Running"] == "No": self.__error__.append( result["Last_SQL_Error"] ) else: self.__error__.append( result["Last_IO_Error"] ) return False def get_last_error(self): """ 获取第一个错误信息 :return: String """ if self.__error__: return self.__error__.pop(0) def notify(self,title,message): """ 发送消息提醒 :param title: 消息的标题 :param message: 消息的内容 :return: """ msg = [title,message] pool = [] notify = notify_email( self.__configParseSMTP__() ) pool.append( notify ) for item in pool: item.ring( msg ) def close(self): """ 关闭数据库链接 """ if self.__instance__: self.__instance__.close() class notify_email(object): def __init__(self,config): self.config = config def ring(self, message=[]): subject = message.pop(0) messageBody = "".join( message ) mailList = self.config["to"].split(";") datetime = time.strftime("%Y-%m-%d %H:%M:%S") for to in mailList: body = """ <p>管理员<strong>{admin}</strong>,你好:</p> <p>收到这封邮件说明你的数据库同步出现异常,请您及时进行处理。</p> <p>异常信息:<br />{body}</p> <p>{date}</p> """.format( admin=to, body=messageBody, date=datetime ) msg = MIMEText( body, "html", "utf-8" ) msg["From"] = self.config["from"] msg["To"] = to msg["Subject"] = subject smtp = smtplib.SMTP() smtp.connect( self.config["smtp_host"] ) if self.config.has_key("smtp_user"): smtp.login( self.config["smtp_user"], self.config["smtp_password"] ) smtp.sendmail( self.config["from"], to, msg.as_string() ) smtp.quit() if __name__ == "__main__": #命令行参数列表 usage = """usage: MySQLStat [options]""" opt = optparse.OptionParser(usage=usage) opt.add_option("-H","--host",dest="host",help="MySQL host (default: localhost)") opt.add_option("-u","--user",dest="user",help="MySQL user") opt.add_option("-p","--password",dest="password",help="MySQL password") opt.add_option("-P","--port",dest="port",help="MySQL port (default: 3306)") opt.add_option("","--smtp_host",dest="smtp_host",help="SMTP host (default: localhost)") opt.add_option("","--smtp_user",dest="smtp_user",help="SMTP user") opt.add_option("","--smtp_password",dest="smtp_password",help="SMTP password") opt.add_option("","--from",dest="from",help="Email from") opt.add_option("","--to",dest="to",help="Email to") opt.add_option("","--defaults-file",dest="defaults_file",help="config file path") (options,args) = opt.parse_args() options = options.__dict__ Statu = SlaveStatu( **options ) subject = "服务中心异常信息提醒" if Statu.connect() is False or Statu.isSlave() is False: Statu.notify( subject, Statu.get_last_error() ) Statu.close()</code>
server1.cnf 设置文件内容
<code class=" hljs ini">[config] smtp_host=smtp.aliyun.com smtp_user=xxxx@aliyun.com smtp_password=xxxxxx from=管理中心<xxxx@aliyun.com> host=xxx.xxx.xxx.xxx user=root password=123456</code>
完成了以上的配置之后,我们在定时任务里添加一条任务,就可以让程序为我们监控MySQL的服务器状态了。
crontab设置
<code class=" hljs avrasm">*/2 * * * * python slavecheckpoint.py --defaults-file=server1.cnf --to=dba@abc.com</code>
github项目地址: https://github.com/yagas/checkpoint.git

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

「事件日誌訊息中的連接狀態顯示為待機狀態:已斷開連接,原因是符合NIC標準。這表示系統在待機模式下,網路介面卡(NIC)已斷開連接。雖然這通常是網路問題,但也可能由軟體和硬體衝突引起。在接下來的討論中,我們將探討如何解決這個問題。」待機連接斷開的原因是什麼? NIC合規性?如果在Windows事件檢視器中發現「ConnectivityStatusinStandby:DisConnected,Reason:NICCompliance」訊息,這表示您的NIC或網路介面控制器可能有問題。這種情況通常

陌陌這款廣為人知的社群平台,為用戶的日常社交提供了豐富的功能服務。在陌陌上,用戶可以輕鬆分享生活狀態、結交朋友、進行聊天等。其中設定狀態功能讓使用者能夠向其他展示自己當前的心情和狀態,進而吸引更多人的注意和交流。那麼究竟該如何設定自己的陌陌狀態呢,以下就為大家帶來詳細的內容介紹!陌陌怎麼設定狀態? 1.打開陌陌,點擊右下角更多,找到並點擊每日狀態。 2、選擇狀態。 3、即可顯示設定的狀態。

想要顯示為「離線」或不想在WhatsApp上與您的朋友分享您的目前狀態?有一個簡單而巧妙的技巧可以做到這一點。您可以調整WhatsApp設置,以便您的朋友或其他人無法在其中看到您的當前狀態(離線或上次看到)。如何在您的WhatsApp狀態列上顯示為離線狀態?這是一個非常簡單和簡化的過程。因此,請立即執行以下步驟。步驟1–在手機上開啟WhatsApp。步驟2–點選⋮並選擇開啟「設定」。步驟3–打開“隱私”設定以存取它。步驟4–在該隱私頁面上,開啟「上次查看和線上」設定以存取該設定。步驟5–將「誰可

查看伺服器狀態的方法有使用命令列工具、圖形介面工具、監控工具、日誌檔案和遠端管理工具等。詳細介紹:1、使用命令列工具,在Linux或Unix伺服器上,可以使用命令列工具來查看伺服器的狀態;2、使用圖形介面工具,對於具有圖形介面的伺服器作業系統,可以使用系統提供的圖形介面工具來查看伺服器狀態;3、使用監控工具,可以使用專門的監控工具來即時監視伺服器的狀態等等。

深入了解Java執行緒的五種狀態及其轉換規則一、執行緒的五種狀態介紹在Java中,執行緒的生命週期可以分為五個不同的狀態,包括新狀態(NEW)、就緒狀態(RUNNABLE)、運作狀態(RUNNING)、阻塞狀態(BLOCKED)和終止狀態(TERMINATED)。新建狀態(NEW):當執行緒物件建立後,它就處於新建狀態。此時,線程物件已經分配了足夠的資源來執行任務

當我們在電腦上看到印表機處於離線狀態時,有時我們可能不知道這意味著什麼。實際上,這表示印表機沒有連接印表機離線狀態是什麼意思呀:答:離線狀態指的是印表機沒有連線可能的原因是印表機沒有開啟或沒有正常連線印表機狀態解決方法重寫內容而不改變原意時,需要將語言改寫為中文,不需要出現原句1、先確認你的印表機正常開啟,如果沒有的話就打開它。使用另一種方法:1、如果您的印表機已經打開,您可以先進入「控制台」然後,點擊「檢視裝置和印表機」選項3、接下來選擇您的印表機,點擊「查看目前正在列印的內容」最

PHP無狀態的介紹與原理解析在Web開發中,無狀態性是一個重要概念,它指的是伺服器在處理客戶端請求時不會保存任何客戶端的狀態信息,每個請求都是獨立的,並不依賴先前的請求。 PHP作為常用的伺服器端腳本語言,也支援無狀態的特性。本文將介紹PHP無狀態的概念及其原理,並透過具體的程式碼範例進行解析。無狀態的概念無狀態的概念是指伺服器不會在處理客戶端請求時保存任

親愛的讀者朋友們,今天我們將為您精心奉上一篇關於Dubbo在Go語言方面的探討文章。 Dubbo作為一款優秀的分散式服務框架,在Java語言中得到了廣泛的應用與支援。而隨著Go語言在近年來的快速發展,許多開發者對於Dubbo是否已經支援Go語言這個問題產生了濃厚的興趣。本文將從Dubbo在Go語言方面的支援情況、具體實作方法以及程式碼範例等方面展開闡述,希望能為
