由兩個程式檔案組成,第一個程式實作慢查詢分析,檔案上傳
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
<code>#!/usr/local/python27/bin/python2.7</code>
<code>from</code> <code>fabric.api </code><code>import</code> <code>*</code>
<code>from</code> <code>fabric.context_managers </code><code>import</code> <code>*</code>
<code>from</code> <code>fabric.contrib.console </code><code>import</code> <code>confirm</code>
<code>import</code> <code>sys</code>
<code>import</code> <code>os</code>
<code>import</code> <code>time</code>
<code>import</code> <code>datetime</code>
<code>sdir </code><code>=</code> <code>'/alidata/server/mysql/data/'</code>
<code>ddir </code><code>=</code> <code>'/root/'</code>
<code>env.user</code><code>=</code><code>'root'</code>
<code>env.roledefs </code><code>=</code> <code>{</code>
<code> </code><code>'master_db'</code><code>:[</code><code>'192.168.1.2'</code><code>],</code>
<code> </code><code>'slave_db'</code><code>:[</code><code>'192.168.1.3'</code><code>],</code>
<code> </code><code>'quliao_db'</code><code>:[</code><code>'192.168.1.4'</code><code>]</code>
<code>}</code>
<code>env.passwords </code><code>=</code> <code>{</code>
<code> </code><code>'[email protected]:22'</code><code>:</code><code>'123456'</code><code>,</code>
<code> </code><code>'[email protected]:22'</code><code>:</code><code>'123456'</code><code>,</code>
<code> </code><code>'[email protected]:22'</code><code>:</code><code>'123456'</code>
<code>#慢查詢分析函數,這個函數會調用服務端本地的工具分析慢查詢,之後會清空慢查詢檔案。</code>
<code>def</code> <code>my_slow(ori_log,save_log,result_log):</code>
<code> </code><code>run(</code><code>'cp '</code><code>+</code><code>sdir</code><code>+</code><code>ori_log</code><code>+</code><code>' '</code><code>+</code><code>save_log)</code>
<code> </code><code>run(</code><code>'/usr/local/bin/mysqlsla -lt slow '</code><code>+</code><code>ddir</code><code>+</code><code>save_log</code><code>+</code><code>' -sort c_sum -top 10 >'</code><code>+</code><code>'/root/'</code><code>+</code><code>result_log)</code>
<code> </code><code>run(</code><code>'echo '</code><code>+</code><code>'</code><code>'+'</code><code>>'</code><code>+</code><code>sdir</code><code>+</code><code>ori_log)</code>
<code>#用于下載下傳服務端分析好的慢查詢檔案儲存到本地建立的目錄中</code>
<code>def</code> <code>my_get(fname):</code>
<code> </code><code>with lcd(</code><code>'/alidata/slow_log'</code><code>):</code>
<code> </code><code>dname </code><code>=</code> <code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code>
<code> </code><code>with cd(</code><code>'/root/'</code><code>):</code>
<code> </code><code>get(fname,dname</code><code>+</code><code>'/'</code><code>)</code>
<code>#定義檔案删除函數,接受兩個參數,用于删除拷貝出來的慢查詢檔案和分析之後的慢查詢檔案。</code>
<code>def</code> <code>remove(f1,f2):</code>
<code> </code><code>with cd(</code><code>'/root'</code><code>):</code>
<code> </code><code>run(</code><code>'rm -f '</code><code>+</code><code>f1</code><code>+</code><code>' '</code><code>+</code><code>f2 )</code>
<code>#在用戶端機器建立一個以目前日期為名稱的檔案夾,用于儲存分析好的慢查詢檔案</code>
<code>@runs_once</code>
<code>def</code> <code>mk_dir():</code>
<code> </code><code>local(</code><code>'mkdir '</code><code>+</code><code>dname)</code>
<code>@roles</code><code>(</code><code>'slave_db'</code><code>)</code>
<code>def</code> <code>sdb():</code>
<code> </code><code>print</code> <code>(</code><code>"run slave db pro"</code><code>)</code>
<code> </code><code>run(</code><code>"ls /alidata/server/mysql/data"</code><code>)</code>
<code> </code><code>my_slow(</code><code>'slow.log'</code><code>,</code><code>'mysql-r-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>,</code><code>'mysql-read-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code> </code><code>my_get(</code><code>'mysql-read-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code> </code><code>remove(</code><code>'mysql-r-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>,</code><code>'mysql-read-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code>@roles</code><code>(</code><code>'master_db'</code><code>)</code>
<code>def</code> <code>mdb():</code>
<code> </code><code>print</code> <code>(</code><code>'run master db pro'</code><code>)</code>
<code> </code><code>my_slow(</code><code>'AY131008162509536ef1Z-slow.log'</code><code>,</code><code>'mysql-w-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>,</code><code>'mysql-write-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code> </code><code>my_get(</code><code>'mysql-write-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code> </code><code>remove(</code><code>'mysql-w-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>,</code><code>'mysql-write-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code>@roles</code><code>(</code><code>'quliao_db'</code><code>)</code>
<code>def</code> <code>ldb():</code>
<code> </code><code>print</code> <code>(</code><code>'run quliao db pro'</code><code>)</code>
<code> </code><code>my_slow(</code><code>'slow.log'</code><code>,</code><code>'mysql-q-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>,</code><code>'mysql-quliao-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code> </code><code>my_get(</code><code>'mysql-quliao-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code> </code><code>remove(</code><code>'mysql-q-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>,</code><code>'mysql-quliao-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code>def</code> <code>deploy():</code>
<code> </code><code>mk_dir()</code>
<code> </code><code>execute(sdb)</code>
<code> </code><code>execute(mdb)</code>
<code> </code><code>execute(ldb)</code>
<code>#最後這裡是調用用戶端本地的郵件發送程式把剛剛抓回來的慢查詢日志以郵件附件的形式發送給管理者。</code>
<code> </code><code>local(</code><code>'/root/tuchao/sendma.py'</code><code>)</code>
第二個程式負責把分析好的日志以郵件附件的形式發送給管理者
<code># coding=utf8</code>
<code>import</code> <code>smtplib</code>
<code>from</code> <code>email.mime.text </code><code>import</code> <code>MIMEText</code>
<code>from</code> <code>email </code><code>import</code> <code>encoders</code>
<code>from</code> <code>email.header </code><code>import</code> <code>Header</code>
<code>from</code> <code>email.utils </code><code>import</code> <code>parseaddr, formataddr</code>
<code>from</code> <code>email.MIMEMultipart </code><code>import</code> <code>MIMEMultipart</code>
<code>from</code> <code>email.MIMEBase </code><code>import</code> <code>MIMEBase</code>
<code>from_addr </code><code>=</code> <code>'[email protected]'</code>
<code>password </code><code>=</code> <code>'111111'</code>
<code>smtp_server </code><code>=</code> <code>'114.234.116.2'</code>
<code>to_addr </code><code>=</code> <code>[</code><code>'[email protected]'</code><code>,</code><code>'[email protected]'</code><code>]</code>
<code>slow_log_path </code><code>=</code> <code>'/alidata/slow_log/'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'/'</code>
<code>def</code> <code>_format_addr(s):</code>
<code> </code><code>name,addr </code><code>=</code> <code>parseaddr(s)</code>
<code> </code><code>return</code> <code>formataddr((Header(name,</code><code>'utf-8'</code><code>).encode(),addr.encode(</code><code>'utf-8'</code><code>) </code><code>if</code> <code>isinstance</code><code>(addr, </code><code>unicode</code><code>) </code><code>else</code> <code>addr))</code>
<code>#需要将多個對象組合起來,在這裡建構一個MIMEMultipart對象。 </code>
<code>msg </code><code>=</code> <code>MIMEMultipart()</code>
<code>msg[</code><code>'From'</code><code>] </code><code>=</code> <code>_format_addr(u</code><code>'來自運維技術XX <%s>'</code> <code>%</code> <code>from_addr)</code>
<code>msg[</code><code>'To'</code><code>] </code><code>=</code> <code>_format_addr(u</code><code>'管理者 <%s>'</code> <code>%</code> <code>to_addr)</code>
<code>msg[</code><code>'Subject'</code><code>] </code><code>=</code> <code>Header(u</code><code>'MySQL慢查詢日志'</code><code>, </code><code>'utf-8'</code><code>).encode()</code>
<code>msg.attach(MIMEText(</code><code>'<html><body><h3>mysql-read:從庫讀慢查詢</h3>'</code> <code>+</code>
<code> </code><code>'<p><h3>mysql-write:主庫讀寫慢查詢</h3></p>'</code>
<code> </code><code>'<p><h3>mysql-quliao:外部程式庫讀寫慢查詢</h3></p>'</code>
<code> </code><code>'<p><img src="cid:1"></p>'</code> <code>+</code>
<code> </code><code>'</body></html>'</code><code>, </code><code>'html'</code><code>, </code><code>'utf-8'</code><code>))</code>
<code>with </code><code>open</code><code>(slow_log_path</code><code>+</code><code>'mysql-read-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>,</code><code>'rb'</code><code>) as f:</code>
<code> </code><code>mime </code><code>=</code> <code>MIMEBase(</code><code>'text/plain'</code><code>,</code><code>'txt'</code><code>,filename</code><code>=</code><code>'mysql-read-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code> </code><code>mime.add_header(</code><code>'Content-Disposition'</code><code>,</code><code>'attachment'</code><code>,filename</code><code>=</code><code>'mysql-read-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code> </code><code>mime.add_header(</code><code>'Content-ID'</code><code>,</code><code>'<0>'</code><code>)</code>
<code> </code><code>mime.add_header(</code><code>'X-Attachment-Id'</code><code>,</code><code>'0'</code><code>)</code>
<code> </code><code>mime.set_payload(f.read())</code>
<code> </code><code>encoders.encode_base64(mime)</code>
<code> </code><code>msg.attach(mime)</code>
<code>with </code><code>open</code><code>(slow_log_path</code><code>+</code><code>'mysql-write-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>,</code><code>'rb'</code><code>) as f:</code>
<code> </code><code>mime </code><code>=</code> <code>MIMEBase(</code><code>'text/plain'</code><code>,</code><code>'txt'</code><code>,filename</code><code>=</code><code>'mysql-write-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code> </code><code>mime.add_header(</code><code>'Content-Disposition'</code><code>,</code><code>'attachment'</code><code>,filename</code><code>=</code><code>'mysql-write-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code>with </code><code>open</code><code>(slow_log_path</code><code>+</code><code>'mysql-quliao-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>,</code><code>'rb'</code><code>) as f:</code>
<code> </code><code>mime </code><code>=</code> <code>MIMEBase(</code><code>'text/plain'</code><code>,</code><code>'txt'</code><code>,filename</code><code>=</code><code>'mysql-quliao-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code> </code><code>mime.add_header(</code><code>'Content-Disposition'</code><code>,</code><code>'attachment'</code><code>,filename</code><code>=</code><code>'mysql-quliao-'</code><code>+</code><code>time.strftime(</code><code>'%Y%m%d'</code><code>,time.localtime(time.time()))</code><code>+</code><code>'.log'</code><code>)</code>
<code>with </code><code>open</code><code>(</code><code>'/alidata/slow_log/aamy.jpg'</code><code>,</code><code>'rb'</code><code>) as f:</code>
<code> </code><code>mime </code><code>=</code> <code>MIMEBase(</code><code>'image'</code><code>,</code><code>'jpg'</code><code>,filename</code><code>=</code><code>'aamy.jpg'</code><code>)</code>
<code> </code><code>mime.add_header(</code><code>'Content-Disposition'</code><code>,</code><code>'attachment'</code><code>,filename</code><code>=</code><code>'aamy.jpg'</code><code>)</code>
<code> </code><code>mime.add_header(</code><code>'Content-ID'</code><code>,</code><code>'<1>'</code><code>)</code>
<code>server </code><code>=</code> <code>smtplib.SMTP(smtp_server,</code><code>25</code><code>)</code>
<code>server.set_debuglevel(</code><code>0</code><code>)</code>
<code>server.login(from_addr,password)</code>
<code>server.sendmail(from_addr,to_addr,msg.as_string())</code>
<code>server.quit()</code>
構造一個郵件對象就是一個<code>Messag</code>對象
構造一個<code>MIMEText</code>對象,就表示一個文本郵件對象
構造一個<code>MIMEImage</code>對象,就表示一個作為附件的圖檔
要把多個對象組合起來,就用<code>MIMEMultipart</code>對象
<code>MIMEBase</code>可以表示任何對象
本文轉自qw87112 51CTO部落格,原文連結:
http://blog.51cto.com/tchuairen/1707669