返回顶部
首页 > 资讯 > 数据库 >用Python对MySQL同步状态进行监
  • 774
分享到

用Python对MySQL同步状态进行监

状态PythonMySQL 2023-01-31 05:01:52 774人浏览 安东尼
摘要

用python对Mysql同步状态进行监控 使用Python对mysql数据库服务器是否可访问,及主从同步是否中断进行监控,是一件非常简单的事情。感谢Python给我们带来了如此简单,强大,快捷的开发环境。 本文使用到的Pytho

pythonMysql同步状态进行监控

使用Pythonmysql数据库服务器是否可访问,及主从同步是否中断进行监控,是一件非常简单的事情。感谢Python给我们带来了如此简单,强大,快捷的开发环境。

本文使用到的Python模块
使用telnetlib校验服务器是否可被访问
使用SMTP向管理员发送通知邮件
使用Mysql官方的驱动对数据库进行访问
使用optparse实现命令行参数的提取

实现原理
使用optparse模块获取命令行参数。读取defaults-file设置文件内容(如果存在),使用参数覆盖defaults-file的值(如果传递参数,如:–host, –user, –to之类)。

直接去连MySQL等待是否能进行访问的返回结果太慢了,所以使用telnet对服务器的连通性进行验证。可以设置等待时间,可控性高一些。

当服务器工作正常,使用MySQL与服务器进行连接,获取主从同步的状态。

将获取服务器的异常状态信息(服务器无法访问,主从同步的状态中断),使用SMTP发送给管理员,并把造成中断同步的异常信息一同发送到管理员的邮箱中。


Created with Raphaël 2.1.2starttelnet host:portconnect?slave statusslave?endnotifyyesnoyesno

slavecheckpoint.py

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 style="text-indent:2em;">收到这封邮件说明你的数据库同步出现异常,请您及时进行处理。</p>
            <p>异常信息:<br />{body}</p>
            <p style="text-align:right;">{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()

server1.cnf 设置文件内容

[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

完成了以上的配置之后,我们在定时任务里添加一条任务,就可以让程序为我们监控MySQL的服务器状态了。
crontab设置

*/2 * * * * python slavecheckpoint.py --defaults-file=server1.cnf --to=dba@abc.com

github项目地址: https://GitHub.com/yagas/checkpoint.git

您可能感兴趣的文档:

--结束END--

本文标题: 用Python对MySQL同步状态进行监

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

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

猜你喜欢
  • 用Python对MySQL同步状态进行监
    用Python对MySQL同步状态进行监控 使用Python对MySQL数据库服务器是否可访问,及主从同步是否中断进行监控,是一件非常简单的事情。感谢Python给我们带来了如此简单,强大,快捷的开发环境。 本文使用到的Pytho...
    99+
    2023-01-31
    状态 Python MySQL
  • 使用zabbix怎么对docker容器状态进行监控
    这篇文章给大家介绍使用zabbix怎么对docker容器状态进行监控,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首选,zabbix_agentd 配置  vim /usr/local/zabbix/etc/...
    99+
    2023-06-07
  • 怎么对Java 线程池的运行状态进行监控
    怎么对Java 线程池的运行状态进行监控?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数下面给出一个线程池使用示...
    99+
    2023-06-06
  • Android应用中怎么对网络连接状态进行监听
    这篇文章给大家介绍Android应用中怎么对网络连接状态进行监听,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。思路:网络变化时系统会发出广播。所以我们监听这个广播,利用接口回调通知activity做相应的操作就好了。。...
    99+
    2023-05-31
    android roi
  • 使用python对mysql主从进行监控
    1.编写python的监控脚本   A.通过获取mysql库中的状态值来判断这个mysql主从状态是否正常        B.进行两个状态值的判断           C.进行调取钉钉机器人,发送消息      2.设置定时任务进行脚本...
    99+
    2023-01-30
    主从 python mysql
  • 利用Python监测MySQL主从状态
        探测MySQL主从状态,如果从未同步,则发邮件通知运维人员。利用定时任务秒级监测!# -*- coding: utf-8 -* #! /usr/bin/env python from fabric.api import * fro...
    99+
    2023-01-31
    主从 状态 Python
  • vue状态过度如何进行监听
    这篇“vue状态过度如何进行监听”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue状态过度如何进行监听”文章吧。vue状态...
    99+
    2023-07-04
  • vue状态过度使用什么进行监听
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。状态过渡状态就是数据,它包含了数值、颜色值、属性值等等,所以状态过渡指的就是数据本身的过渡动效。Vue 推荐通过 “数据驱动,响应式更新” 的方式来实现状态过渡。其主要思...
    99+
    2023-05-14
    Vue
  • MySQL MHA 运行状态监控介绍
    目录一 项目描述1.1 背景1.2 实现设计1.2.1 之前的方法1.2.2 优化后的方法 二.实现详情2.1 编辑Python可执行文件2.2 修改 telegraf 文件2.3 ...
    99+
    2024-04-02
  • 怎么在Android中利用广播对usb连接状态进行监听
    今天就跟大家聊聊有关怎么在Android中利用广播对usb连接状态进行监听,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。实现方法如下:package com.lgs.test.tes...
    99+
    2023-05-31
    android roi usb
  • 如何对Kubernetes对象的状态进行管理
    这篇文章的内容主要围绕如何对Kubernetes对象的状态进行管理进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!我们下面主要聚焦于探究如何对Kube...
    99+
    2023-06-04
  • 使用zabbix怎么对mysql进行监控
    今天就跟大家聊聊有关使用zabbix怎么对mysql进行监控,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。zabbix 监控 mysql1、监控规划...
    99+
    2024-04-02
  • Android应用中怎么对状态栏进行设置
    Android应用中怎么对状态栏进行设置?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android 状态栏的设置适配问题详解最近看了很多关于状态栏的问题的处理,总结出处理状态...
    99+
    2023-05-31
    android roi
  • zabbix监控mysql容器主从同步状态并告警钉钉/企业微信
    前言:被监控的主机已经安装和配置mysql主从同步,和zabbix-agent插件。 mysql创建主从同步:http://t.csdn.cn/P4MYq centos安装zabbix-agent2:http://t.csdn.cn/fx7...
    99+
    2023-09-04
    zabbix 钉钉 mysql 数据库 docker 容器
  • 如何用Shell监控iptables运行状态
    这篇文章主要介绍“如何用Shell监控iptables运行状态”,在日常操作中,相信很多人在如何用Shell监控iptables运行状态问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Shell监控ipt...
    99+
    2023-06-09
  • 详解JVM系列之对象的锁状态和同步
    目录java对象头java中锁状态的变化偏向锁biased locking轻量级锁thin lock重量级锁三种锁状态的不同java对象头 Java的锁状态其实可以分为三种,分别是偏...
    99+
    2024-04-02
  • Shell中怎么监视指定进程的运行状态
    本篇文章给大家分享的是有关Shell中怎么监视指定进程的运行状态,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。现用shell脚本实现指定进程的运行状态。直接上代码。#!/bin...
    99+
    2023-06-09
  • 使用Apache SeaTunnel进行数据库同步(MySQL to MySQL)
    Apache SeaTunnel 起到的主要作用是什么? 目前,大数据体系里有各种各样的数据引擎,有大数据生态的 Hadoop、Hive、Kudu、Kafka、HDFS,也有泛大数据库体系的 MongoDB、Redis、ClickHouse...
    99+
    2023-08-17
    数据库 mysql seaTunnel
  • Shell脚本实现监视指定进程的运行状态
    在之前的博客中,曾经写了自动化测试程序的实现方法,现在开发者需要知道被测试的进程(在此指运行在LINUX上的主进程的)在异常退出之前的进程的运行状态,例如内存的使用率、CPU的使用率等。 现用shell脚本...
    99+
    2022-06-04
    脚本 运行状态 进程
  • 使用zabbix怎么监控MySQL主从状态
    本篇文章为大家展示了使用zabbix怎么监控MySQL主从状态,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一般情况下,在MySQL的从上查看从的运行状态是通过Sl...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作