任务:应帅气的领导要求,需要监控生产环境mysql和mongo数据库服务。不仅要connect successful还要进行数据交互进一步确认数据库服务正常。

思路:

mysql和mongo 数据库ip、端口、用户名、密码、认证库(mongo)分别写在mysqldb_message.txt和mongodb_message.txt两个文件中。查询脚本db_test.py,邮件脚本sendEmail.py

格式如下:

mysqldb_message.txt

host:192.168.0.32 user:test passwd:123456 port:3306

host:192.168.0.222 user:test passwd:123456 port:3307

host:192.168.1.101 user:cctest passwd:Yj7netlkj port:3990

mongodb_message.txt

host:192.168.1.101 user:errorbook passwd:wangyue port:37017 authDB:admin

host:127.0.0.1 user:qingcong passwd:qingcong port:27017 authDB:admin

.

查询脚本db_test.py:

需要注意的是:

1、由于Python3.6,pymongo模块中的MongoClient函数连接mongo数据库时,超时参数connecttimeOutMS并不会生效(亲测),并且如果仅仅用MongoClient连接mongo数据库而不对数据库内的数据进行交互,那么无论MongoClient返回的是正确的连接对象还是发生了错误,Python3.6均不会报错。所以,必须要对数据库数据进行交互,才能确定数据库服务是否正常

2、由于mongo超时时间大概在30多秒左右,因此引入Python提供的超时函数timeout_decorator.timeout(),但此函数对不同的操作系统用法不一样。此脚本在windows环境下运行会报错。#!/usr/bin/env python#encoding: utf-8#author: 847907826@qq.com#注意,需要在Linux环境下Python3以上版本执行,且需要安装pymysql、pymongo、timeout_decorator模块import reimport timeimport pymysqlimport timeout_decoratorfrom pymongo import MongoClientimport sys

sys.path.append('/tools/scripts')   # /tools/scripts脚本目录,导入进sys.path中为后续才能调用send_mail函数from sendEmail import send_mail

#定义host、user、passwd、port、auth_db列表,用与存储数据库信息host = []

user = []

passwd = []

port = []

auth_db = []#mysql配置信息文件路径mysql_file = '/tools/scripts/mysqldb_message.txt'#data format: host:192.168.1.101 user:errorbook passwd:wangyue port:37017 authDB:adminmongo_file = '/tools/scripts/mongodb_message.txt'# data format: host:172.17.0.2 user:root passwd:123456 port:3306#获取mysql_db的配置信息def get_message_mysqldb():

print("读取mysql数据库详细信息文件中,请稍后....")        # time.sleep(1)

with open(mysql_file, 'r') as source:

lines = source.read().splitlines()  # splitlines 去除空行,即不保留每行结尾的\n,否则读取的每行中末尾均有\n

i = 0

for char in lines:                        if char.strip() != '':  # 去掉字符串前后的空格

char = re.split('[ :]', lines[i])  # 以空格和分号作为空格符进行分割

num = 1

host.append(char[num])

user.append(char[num + 2])

passwd.append(char[num + 4])

port.append(char[num + 6])

i = i + 1

print("读取完成\n---------------------------")        return host, user, passwd, port#获取mongodb_db的配置信息def get_message_mongodb():

with open(mongo_file, 'r') as source:

lines = source.read().splitlines()

i = 0

for char in lines:                        if char.strip() != '':  # 去掉字符串前后的空格

char = re.split('[ :]', lines[i])  # 以空格和分号作为空格符进行分割

num = 1

host.append(char[num])

user.append(char[num + 2])

passwd.append(char[num + 4])

port.append(char[num + 6])

auth_db.append(char[num + 8])

i = i + 1

return host, user, passwd, port, auth_db#连接mysql数据库def mysqldb_connect_and_test(ip, user, passwd, port):

print("连接mysql数据库{0}中,请稍后....".format(ip))        # time.sleep(1)

try:                # print("ip:{0}, user:{1}, passwd:{2}, port:{3}".format(ip, user, passwd, port))

conn = pymysql.connect(host=ip,

user=user,

passwd=passwd,

port=int(port),

charset='utf8',

connect_timeout=3)

print("连接成功,执行测试语句中...")                with conn.cursor() as cur:

sql = 'select 1 from dual'

a = str(cur.execute(sql))

print("successful! 进一步确认数据库服务正常。执行结果-->a: {0}".format(a))        except Exception:

print("发生异常,数据库连接失败,服务器ip:{0}".format(ip), Exception)

send_mail("监控中心", ["吴青聪"], [], "测试email", "(测试)邮件内容:python检测到mysql数据库异常,服务器为{0}".format(host), "")        else:

print("连接成功:{0}\n".format(ip))#连接mongodb数据库@timeout_decorator.timeout(3)def mongodb_connect_and_test(ip, user, passwd, port, auth_db):

print("请稍等,连接mongodb中...")        try:

client = MongoClient(ip, int(port))                # 利用server_info()判断mongodb状态

dbnames = client.server_info()  #

print(dbnames)                #利用authenticate判断mongodb状态

db = client[auth_db]

result = db.authenticate(user, passwd)        except Exception as es:

print("Error!连接失败,服务器ip:{0}".format(ip), es)

send_mail("监控中心", ["吴青聪"], [], "测试email", "(测试)邮件内容:python检测到mongo数据库异常,服务器为{0}".format(host), "")        else:

print("Successful!连接mongodb成功,测试语句执行成功")

client.close()#清空列表变量def clear_list():

host.clear()

user.clear()

passwd.clear()

port.clear()def main():

# 检查mysql

print("检查mysql数据库:")

get_message_mysqldb()

index = 0

for ip in host:

print("------------------------")

mysqldb_connect_and_test(ip, user[index], passwd[index], port[index])

index = index + 1

clear_list()  # 清空变量列表

#检查mongodb

print("\n检查mysql数据库:")

get_message_mongodb()

index = 0

for ip in host:

print("------------------------")                # print("ip:{0}, user:{1}, passwd:{2}, port:{3}".format(ip, user[index], passwd[index], port[index]))

mongodb_connect_and_test(ip, user[index], passwd[index], port[index], auth_db[index])

index = index + 1if __name__ == '__main__':

main()

发送邮件脚本sendEmail.py:#!/usr/bin/env python#encoding: utf-8import smtplib  # 加载smtplib模块import tracebackfrom email.header import Headerfrom email.mime.application import MIMEApplicationfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.utils import parseaddr, formataddr

login_name = 'monitor@7net.cc'  # 发件人邮箱账号,为了后面易于维护,所以写成了变量login_pass = '******'           # 邮箱密码,此处隐藏^_^smtp_port = 465def _format_addr(s):name, addr = parseaddr(s)return formataddr(( \

Header(name, 'utf-8').encode(), \

addr))# addr.encode('utf-8') if isinstance(addr, unicode) else addr))def send_mail(sender, recps, Ccs, subject, htmlmsg, fileAttachment):# 参数分别是:发送人邮箱、收件人邮箱、抄送人邮箱、主题、内容、附件,如果看不懂此处代码,知道如何使用即可smtpserver = 'smtp.exmail.qq.com'receivers = recps + Ccstry:        # msg = MIMEText(htmlmsg, 'html', 'utf-8')

msg = MIMEMultipart()

msg.attach(MIMEText(htmlmsg, 'html', 'utf-8'))        # msg['Subject'] = subject

msg['Subject'] = Header(subject, 'utf-8').encode()        # msg['From'] = sender

msg['From'] = _format_addr(sender)

Recp = []        for recp in recps:

Recp.append(_format_addr(recp))

ccs = []        for cc in Ccs:

ccs.append(_format_addr(cc))

msg['To'] = ','.join(Recp)

msg['Cc'] = ','.join(ccs)        # if fileAttachment!='' :

#     # 附件

for file in fileAttachment:

part = MIMEApplication(open(file, 'rb').read())

attFileName = file.split('/')[-1]

part.add_header('Content-Disposition', 'attachment', filename=attFileName)

msg.attach(part)        # part = MIMEApplication(open(fileAttachment, 'rb').read())

# part.add_header('Content-Disposition', 'attachment', filename=fileAttachment)

# msg.attach(part)

smtp = smtplib.SMTP_SSL()

smtp.connect(smtpserver, smtp_port)

smtp.login(login_name, login_pass)        #      smtp.login(username, password)

smtp.sendmail(sender, receivers, msg.as_string())

smtp.quit()

print('SendEmail success')except:

traceback.print_exc()

--------------------------------------

本文转自枕着稻香博客51CTO博客

如需转载,请联系作者授权

原文链接:https://blog.51cto.com/wuqingcong/2356570

python脚本监控mysql数据库_Python脚本监控mysql数据库,Python脚本监控mongo数据库相关推荐

  1. python处理千万级数据_Python批量删除mysql中千万级大量数据的脚本分享

    场景描述 线上Mysql数据库里面有张表保存有每天的统计结果,每天有1千多万条,这是我们意想不到的,统计结果咋有这么多.运维找过来,磁盘占了200G,最后问了运营,可以只保留最近3天的,前面的数据,只 ...

  2. python监控服务器信息进行可视化_Python实现数据可视化,看如何监控你的爬虫

    好,开始今天的文章. 今天主要是来说一下怎么可视化来监控你的爬虫的状态. 相信大家在跑爬虫的过程中,也会好奇自己养的爬虫一分钟可以爬多少页面,多大的数据量,当然查询的方式多种多样.今天我来讲一种可视化 ...

  3. python脚本自动化盲注_python dvwa布尔盲注自动化脚本(level=low)

    仅供学习代码参考 1#python dvwa布尔盲注自动化脚本 2 importrequests3 importstring4 importtime5 INIT_URL="http://12 ...

  4. python连接mysql数据库数据库_python如何连接mysql数据库

    先花点时间来说说一个程序怎么和数据库进行交互 1.和数据库建立连接 2.执行sql语句,接收返回值 3.关闭数据库连接 使用MySQLdb也要遵循上面的几步.让我们一步步的进行. 1.MySQL数据库 ...

  5. python里面装数据库_python 安装操作 MySQL 数据库.

    以ubuntu和mysql为例 检查自己的机器上面有没有安装数据库 1 xpower@xpower-CW65S:~$ sudo service mysql start2 [sudo] xpower 的 ...

  6. python 自动化 mysql 部署_Python自动化管理Mysql数据库教程

    Python自动化管理Mysql数据库教程 发布时间:2020-05-28 11:14:31 来源:51CTO 阅读:238 作者:三月 下面一起来了解下Python自动化管理Mysql数据库教程,相 ...

  7. python 无法加载mysql数据库_Python无法连接MySQL数据库是什么原因?

    我想要使用Python来连接MySQL数据库,但是报了如下错误File "/usr/local/lib/python3.5/dist-packages/pymysql/__init__.py ...

  8. python定时运行py文件_Python使用windows设置定时执行脚本

    如果你写了一些Python程序,想要在特定的时间进行执行,例如你想让一段爬虫程序在每天的上午10点执行一次,那么我们就可以来使用windows自带的定时任务进行设置.由于Windows系统,无法使用L ...

  9. python如何删除mysql数据库_python删除数据mysql数据库连接

    Python学习之旅:访问MySQL数据库 Python学习之旅:访问MySQL数据库 MySQL是Web世界中使用最广泛的数据库服务器.为服务器端设计的数据库,能承受高并发访问. python如何使 ...

  10. python查询千万级数据_Python批量删除mysql中千万级大量数据

    场景描述 线上mysql数据库里面有张表保存有每天的统计结果,每天有1千多万条,这是我们意想不到的,统计结果咋有这么多.运维找过来,磁盘占了200g,最后问了运营,可以只保留最近3天的,前面的数据,只 ...

最新文章

  1. 使用Mahout搭建推荐系统之入门篇3-Mahout源码初探
  2. CentOS服务器上的 git 包版本控制
  3. Apache OFBIZ高速上手(二)--MVC框架
  4. Java数组实现循环队列的两种方法
  5. 084_html5WebWorkers
  6. 岗位推荐 | 京东AI研究院招聘计算机视觉算法实习生
  7. java web 颜色灰色_网站动态变灰解决方案(java web项目网站)
  8. python ddt
  9. ES(Elasticsearch)基本查询总结(含docker安装,python操作)
  10. Ajax学习笔记-运行原理及实现-2
  11. SQL Server 2019下载及安装详细教程
  12. 展讯7731C_M Android6.0 充电指示灯实现(一)------关机充电实现【转】
  13. TED-4-美好人生的定义
  14. 论EBS的并发请求(报表中心)的必要性
  15. Shell read命令详解
  16. 参数化建模类毕业论文文献有哪些?
  17. 梦幻岛:一场“艺术策展”与“WEB3”的梦幻联动
  18. ThreadPoolExecutor线程池的使用
  19. 帧、报文、报文段、分组、包、数据报、PDU、SDU、信元
  20. java实现快速排序算法

热门文章

  1. 工作81:图片间隙问题
  2. 前端学习(2387):组件库使用说明
  3. “约见”面试官系列之常见面试题第十七篇之实现深拷贝(建议收藏)
  4. 前端学习(1997)vue之电商管理系统电商系统之渲染tab栏标签
  5. 前端学习(973):移动端其他插件使用
  6. java面试题29 牛客 以下关于集合类ArrayList、LinkedList、HashMap描述
  7. java学习(110):日期date类
  8. linux可配置哪些服务,linux操作系统下服务配置
  9. https证书pfx 生成 pem,crt,key
  10. MongoDB基本命令使用