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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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

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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
Python
【python】爬楼梯—递归分析(超级详细)
【python】爬楼梯—递归分析(超级详细)
|
7天前
|
机器学习/深度学习 人工智能 算法
图像处理与分析:Python中的计算机视觉应用
【4月更文挑战第12天】Python在计算机视觉领域广泛应用,得益于其丰富的库(如OpenCV、Pillow、Scikit-image)和跨平台特性。图像处理基本流程包括获取、预处理、特征提取、分类识别及重建生成。示例代码展示了面部和物体检测,以及使用GAN进行图像生成。
|
1天前
|
机器学习/深度学习 算法 数据可视化
python用支持向量机回归(SVR)模型分析用电量预测电力消费
python用支持向量机回归(SVR)模型分析用电量预测电力消费
24 7
机器学习/深度学习 算法 Python
13 0
|
2天前
|
算法 数据可视化 Python
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
10 0
|
2天前
|
机器学习/深度学习 数据采集 数据可视化
Python数据处理与分析
【4月更文挑战第13天】Python在数据处理与分析中扮演重要角色,常用库包括Pandas(数据处理)、NumPy(数值计算)、Matplotlib和Seaborn(数据可视化)、SciPy(科学计算)、StatsModels(统计建模)及Scikit-learn(机器学习)。数据处理流程涉及数据加载、清洗、探索、特征工程、模型选择、评估与优化,以及结果展示。选择哪个库取决于具体需求和数据类型。
13 1
|
3天前
|
数据采集 NoSQL 搜索推荐
五一假期畅游指南:Python技术构建的热门景点分析系统解读
五一假期畅游指南:Python技术构建的热门景点分析系统解读
|
3天前
|
机器学习/深度学习 人工智能 分布式计算
R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
R和Python机器学习:广义线性回归glm,样条glm,梯度增强,随机森林和深度学习模型分析
|
4天前
|
算法 数据可视化 Python
使用Python实现主成分分析(PCA)
使用Python实现主成分分析(PCA)
22 4
|
17天前
|
人工智能 机器人 数据挖掘
【python】电影评分数据集的分析(python实现)(源码+报告)【独一无二】
【python】电影评分数据集的分析(python实现)(源码+报告)【独一无二】

热门文章

最新文章