基于Python实现自动慢查询分析,邮件自动发送

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

由两个程序文件组成,第一个程序实现慢查询分析,文件上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/local/python27/bin/python2.7
from  fabric.api  import  *
from  fabric.context_managers  import  *
from  fabric.contrib.console  import  confirm
import  sys
import  os
import  time
import  datetime
 
sdir  =  '/alidata/server/mysql/data/'
ddir  =  '/root/'
 
env.user = 'root'
 
env.roledefs  =  {
     'master_db' :[ '192.168.1.2' ],
     'slave_db' :[ '192.168.1.3' ],
     'quliao_db' :[ '192.168.1.4' ]
}
 
env.passwords  =  {
     'root@192.168.1.2:22' : '123456' ,
     'root@192.168.1.3:22' : '123456' ,
     'root@192.168.1.4:22' : '123456'
}
 
 
#慢查询分析函数,这个函数会调用服务端本地的工具分析慢查询,之后会清空慢查询文件。
def  my_slow(ori_log,save_log,result_log):
     run( 'cp ' + sdir + ori_log + ' ' + save_log)
     run( '/usr/local/bin/mysqlsla -lt slow ' + ddir + save_log + ' -sort c_sum -top 10 >' + '/root/' + result_log)
     run( 'echo ' + ' '+' >' + sdir + ori_log)
 
#用于下载服务端分析好的慢查询文件保存到本地新建的目录中
def  my_get(fname):
     with lcd( '/alidata/slow_log' ):
         dname  =  time.strftime( '%Y%m%d' ,time.localtime(time.time()))
 
         with cd( '/root/' ):
             get(fname,dname + '/' )
 
#定义文件删除函数,接受两个参数,用于删除拷贝出来的慢查询文件和分析之后的慢查询文件。
def  remove(f1,f2):
     with cd( '/root' ):
         run( 'rm -f ' + f1 + ' ' + f2 )
 
#在客户端机器创建一个以当前日期为名称的文件夹,用于保存分析好的慢查询文件
@runs_once
def  mk_dir():
     with lcd( '/alidata/slow_log' ):
         dname  =  time.strftime( '%Y%m%d' ,time.localtime(time.time()))
         local( 'mkdir ' + dname)
 
 
@roles ( 'slave_db' )
def  sdb():
     print  ( "run slave db pro" )
     run( "ls /alidata/server/mysql/data" )
     my_slow( 'slow.log' , 'mysql-r-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' , 'mysql-read-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     my_get( 'mysql-read-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     remove( 'mysql-r-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' , 'mysql-read-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
 
@roles ( 'master_db' )
def  mdb():
     print  ( 'run master db pro' )
     run( "ls /alidata/server/mysql/data" )
     my_slow( 'AY131008162509536ef1Z-slow.log' , 'mysql-w-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' , 'mysql-write-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     my_get( 'mysql-write-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     remove( 'mysql-w-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' , 'mysql-write-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
 
@roles ( 'quliao_db' )
def  ldb():
     print  ( 'run quliao db pro' )
     run( "ls /alidata/server/mysql/data" )
     my_slow( 'slow.log' , 'mysql-q-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' , 'mysql-quliao-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     my_get( 'mysql-quliao-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     remove( 'mysql-q-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' , 'mysql-quliao-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
 
def  deploy():
     mk_dir()
     execute(sdb)
     execute(mdb)
     execute(ldb)
#最后这里是调用客户端本地的邮件发送程序把刚刚抓回来的慢查询日志以邮件附件的形式发送给管理员。
     local( '/root/tuchao/sendma.py' )



第二个程序负责把分析好的日志以邮件附件的形式发送给管理员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/local/python27/bin/python2.7
# coding=utf8
import  smtplib
import  time
import  datetime
from  email.mime.text  import  MIMEText
from  email  import  encoders
from  email.header  import  Header
from  email.utils  import  parseaddr, formataddr
from  email.MIMEMultipart  import  MIMEMultipart
from  email.MIMEBase  import  MIMEBase
 
from_addr  =  'tuchao@mail.admin.net'
password  =  '111111'
smtp_server  =  '114.234.116.2'
to_addr  =  [ '123456@qq.com' , '1234567@qq.com' ]
 
slow_log_path  =  '/alidata/slow_log/' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '/'
 
 
def  _format_addr(s):
     name,addr  =  parseaddr(s)
     return  formataddr((Header(name, 'utf-8' ).encode(),addr.encode( 'utf-8' if  isinstance (addr,  unicode else  addr))
 
#需要将多个对象组合起来,在这里构建一个MIMEMultipart对象。 
msg  =  MIMEMultipart()
 
msg[ 'From' =  _format_addr(u '来自运维技术XX <%s>'  %  from_addr)
msg[ 'To' =  _format_addr(u '管理员 <%s>'  %  to_addr)
msg[ 'Subject' =  Header(u 'MySQL慢查询日志' 'utf-8' ).encode()
 
msg.attach(MIMEText( '<html><body><h3>mysql-read:从库读慢查询</h3>'  +
     '<p><h3>mysql-write:主库读写慢查询</h3></p>'
     '<p><h3>mysql-quliao:外部程序库读写慢查询</h3></p>'
     '<p><img src="cid:1"></p>'  +
     '</body></html>' 'html' 'utf-8' ))
 
 
with  open (slow_log_path + 'mysql-read-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' , 'rb' ) as f:
     mime  =  MIMEBase( 'text/plain' , 'txt' ,filename = 'mysql-read-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     mime.add_header( 'Content-Disposition' , 'attachment' ,filename = 'mysql-read-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     mime.add_header( 'Content-ID' , '<0>' )
     mime.add_header( 'X-Attachment-Id' , '0' )
     mime.set_payload(f.read())
     encoders.encode_base64(mime)
     msg.attach(mime)
 
with  open (slow_log_path + 'mysql-write-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' , 'rb' ) as f:
     mime  =  MIMEBase( 'text/plain' , 'txt' ,filename = 'mysql-write-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     mime.add_header( 'Content-Disposition' , 'attachment' ,filename = 'mysql-write-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     mime.add_header( 'Content-ID' , '<0>' )
     mime.add_header( 'X-Attachment-Id' , '0' )
     mime.set_payload(f.read())
     encoders.encode_base64(mime)
     msg.attach(mime)
 
with  open (slow_log_path + 'mysql-quliao-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' , 'rb' ) as f:
     mime  =  MIMEBase( 'text/plain' , 'txt' ,filename = 'mysql-quliao-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     mime.add_header( 'Content-Disposition' , 'attachment' ,filename = 'mysql-quliao-' + time.strftime( '%Y%m%d' ,time.localtime(time.time())) + '.log' )
     mime.add_header( 'Content-ID' , '<0>' )
     mime.add_header( 'X-Attachment-Id' , '0' )
     mime.set_payload(f.read())
     encoders.encode_base64(mime)
     msg.attach(mime)
 
with  open ( '/alidata/slow_log/aamy.jpg' , 'rb' ) as f:
     mime  =  MIMEBase( 'image' , 'jpg' ,filename = 'aamy.jpg' )
     mime.add_header( 'Content-Disposition' , 'attachment' ,filename = 'aamy.jpg' )
     mime.add_header( 'Content-ID' , '<1>' )
     mime.add_header( 'X-Attachment-Id' , '0' )
     mime.set_payload(f.read())
     encoders.encode_base64(mime)
     msg.attach(mime)
 
server  =  smtplib.SMTP(smtp_server, 25 )
server.set_debuglevel( 0 )
server.login(from_addr,password)
server.sendmail(from_addr,to_addr,msg.as_string())
server.quit()

构造一个邮件对象就是一个Messag对象

构造一个MIMEText对象,就表示一个文本邮件对象

构造一个MIMEImage对象,就表示一个作为附件的图片

要把多个对象组合起来,就用MIMEMultipart对象

MIMEBase可以表示任何对象



本文转自qw87112 51CTO博客,原文链接:
http://blog.51cto.com/tchuairen/1707669

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2月前
|
存储 分布式计算 大数据
基于Python大数据的的电商用户行为分析系统
本系统基于Django、Scrapy与Hadoop技术,构建电商用户行为分析平台。通过爬取与处理海量用户数据,实现行为追踪、偏好分析与个性化推荐,助力企业提升营销精准度与用户体验,推动电商智能化发展。
|
3月前
|
缓存 监控 算法
唯品会item_search - 按关键字搜索 VIP 商品接口深度分析及 Python 实现
唯品会item_search接口支持通过关键词、分类、价格等条件检索商品,广泛应用于电商数据分析、竞品监控与市场调研。结合Python可实现搜索、分析、可视化及数据导出,助力精准决策。
|
2月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的台风灾害分析及预测系统
针对台风灾害预警滞后、精度不足等问题,本研究基于Python与大数据技术,构建多源数据融合的台风预测系统。利用机器学习提升路径与强度预测准确率,结合Django框架实现动态可视化与实时预警,为防灾决策提供科学支持,显著提高应急响应效率,具有重要社会经济价值。
|
2月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的青少年网络使用情况分析及预测系统
本研究基于Python大数据技术,构建青少年网络行为分析系统,旨在破解现有防沉迷模式下用户画像模糊、预警滞后等难题。通过整合多平台亿级数据,运用机器学习实现精准行为预测与实时干预,推动数字治理向“数据驱动”转型,为家庭、学校及政府提供科学决策支持,助力青少年健康上网。
|
3月前
|
缓存 监控 算法
苏宁item_get - 获得商品详情接口深度# 深度分析及 Python 实现
苏宁易购item_get接口可实时获取商品价格、库存、促销等详情,支持电商数据分析与竞品监控。需认证接入,遵守调用限制,适用于价格监控、销售分析等场景,助力精准营销决策。(238字)
|
3月前
|
监控 算法 数据安全/隐私保护
唯品会 item_get - 获得 VIP 商品详情接口深度分析及 Python 实现
唯品会item_get接口通过商品ID获取商品详情,支持价格、库存、促销等数据抓取,适用于电商分析、竞品监控与价格追踪,结合Python实现可高效完成数据获取、分析与可视化,助力精准营销决策。
|
3月前
|
JSON 缓存 供应链
电子元件 item_search - 按关键字搜索商品接口深度分析及 Python 实现
本文深入解析电子元件item_search接口的设计逻辑与Python实现,涵盖参数化筛选、技术指标匹配、供应链属性过滤及替代型号推荐等核心功能,助力高效精准的电子元器件搜索与采购决策。
|
3月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。

推荐镜像

更多