1. #!/usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. #脚本需要和 pt-table-checksum一起使用
    4. #通过监控pt-table-checksum生产的checksums表来确认表是否一致
    5. #脚本要在主库执行
    6. import smtplib
    7. from email.mime.text import MIMEText
    8. import time,datetime
    9. import os,sys
    10. import MySQLdb as mdb
    11. mail_host = ''
    12. mail_user = ''
    13. mail_postfix = ''
    14. def check_info():
    15. try:
    16. #这里要连接从库
    17. con = mdb.connect(host='',user='',passwd='',db='test',port=3306)
    18. cur = con.cursor()
    19. sql = "select * from checksums where this_crc not in (select master_crc from checksums )"
    20. cur.execute(sql)
    21. res = cur.fetchall()
    22. con.close()
    23. return res
    24. except Exception,e:
    25. print e
    26. def send_mail(mail_to,subject,content):
    27. me = mail_user+"<"+mail_user+"@"+mail_postfix+">"
    28. msg = MIMEText(content,'html','utf-8')
    29. msg["subject"] = subject
    30. msg["From"] = me
    31. global sendstatus
    32. global senderr
    33. try:
    34. smtp = smtplib.SMTP()
    35. smtp.connect(mail_host)
    36. smtp.login(mail_user,mail_pass)
    37. smtp.sendmail(me,mail_to,msg.as_string())
    38. smtp.close()
    39. sendstatus = True
    40. print 'send ok'
    41. except Exception,e:
    42. senderr = str(e)
    43. print senderr
    44. endstatus = False
    45. if __name__ == "__main__":
    46. cmd = "pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums h='',u='',p='',P=3306,S=/tmp/mysql3306.sock -d test "
    47. os.system(cmd)
    48. mail_to = ['573242930@qq.com']
    49. subject = '主从表数据不一致'
    50. result = check_info()
    51. nowtime = time.strftime( '%Y-%m-%d %X', time.localtime() )
    52. output = ''
    53. if result:
    54. for m in result:
    55. output += "库名:%s </br>" %m[0]
    56. output += "表名:%s </br>" %m[1]
    57. content = "%s </br>%s" % (nowtime,output)
    58. send_mail(mail_to,subject,content)