天天看點

基于Python實作自動慢查詢分析,郵件自動發送

由兩個程式檔案組成,第一個程式實作慢查詢分析,檔案上傳

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 &gt;'</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>&gt;'</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 &lt;%s&gt;'</code> <code>%</code> <code>from_addr)</code>

<code>msg[</code><code>'To'</code><code>] </code><code>=</code> <code>_format_addr(u</code><code>'管理者 &lt;%s&gt;'</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>'&lt;html&gt;&lt;body&gt;&lt;h3&gt;mysql-read:從庫讀慢查詢&lt;/h3&gt;'</code> <code>+</code>

<code>    </code><code>'&lt;p&gt;&lt;h3&gt;mysql-write:主庫讀寫慢查詢&lt;/h3&gt;&lt;/p&gt;'</code>

<code>    </code><code>'&lt;p&gt;&lt;h3&gt;mysql-quliao:外部程式庫讀寫慢查詢&lt;/h3&gt;&lt;/p&gt;'</code>

<code>    </code><code>'&lt;p&gt;&lt;img src="cid:1"&gt;&lt;/p&gt;'</code> <code>+</code>

<code>    </code><code>'&lt;/body&gt;&lt;/html&gt;'</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>'&lt;0&gt;'</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>'&lt;1&gt;'</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