Chinaunix首页 | 论坛 | 博客
  • 博客访问: 520748
  • 博文数量: 78
  • 博客积分: 995
  • 博客等级: 准尉
  • 技术积分: 1462
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-15 20:22
个人简介

技术中沉思的时候最快乐,问题得到完美解决的时候最有成就感!

文章分类

全部博文(78)

文章存档

2013年(39)

2012年(37)

2011年(2)

分类: Mysql/postgreSQL

2012-05-23 15:50:06

项目中用mysql做最为最终的存储,主要还是觉得mysql稳定,
且一直用mysql做存储,运维经验比较丰富;且主从备份基本还算是比较安全的;
但 mysql 有时看起来效率比较低(这也是n多项目选择nosql做存储的原因,
之所以没选择nosql是因为项目中没人熟悉,没人用过,吃螃蟹是需要勇气和责任的);
有时竟然对这种慢无能无力,比如经常查问题,最后查到是mysql,哦,然后就没了,最多解释一句
“mysql 操作超时了”;不知道为什么慢,不知道慢在哪里,更没有一些监控之类的;
于是想怎样监控 mysql 的慢查询,发现mysql有自己的 slow log;哦,那就ok了,搞个 perl 脚本
定时去分析日志,加上 mysqlslowdump,可以比较完美的监控 mysql 的slow log;
现在附上这个 perl;


点击(此处)折叠或打开

  1. #!/usr/bin/perl

  2. use List::Util qw(first);
  3. use Time::Local;

  4. $minutes = @ARGV ? shift @ARGV : 2;

  5. open MYSQL_CONF, " or die "cant find my.conf";

  6. $_ = first { /^\s*log-slow-queries\s*=\s*([\w.\/]+)/ } <MYSQL_CONF>
  7.                 or die "cant find log-slow-qureis";
  8. /=\s*([\w.\/]+)/;
  9. my $slow_log = $1;

  10. my $from_time = time() - $minutes * 60;

  11. my $mtime = (stat("$slow_log"))[9];
  12. print "$mtime vs from_time=$from_time\n";

  13. if ($mtime < $from_time)
  14. {
  15.  print "no slow log in recent $minutes minutes\n";
  16.  exit;
  17. }


  18. `tail -5000 $slow_log > /tmp/slow_log.txt`;

  19. open SELECT_LOG, ">/tmp/.last.txt" or die "cant open last log txt";
  20. open TMP_LOG, " or die "open tmp log failed";

  21. select SELECT_LOG;
  22. my $new_log = 0;
  23. while (<TMP_LOG>)
  24. {
  25.  if ($new_log) {
  26.         print;
  27.         next;
  28.  }
  29.  if (/^# Time: (\d\d)(\d\d)(\d\d) (\d\d):(\d\d):(\d\d)$/) {
  30.         $time_s = timelocal($6, $5, $4, $3, $2-1, 2000+$1);
  31.         if ($time_s >= $from_time) {
  32.                 $new_log = 1;
  33.                 print;
  34.         }
  35.  }
  36. }

  37. exit if $new_log == 0;

  38. select STDOUT;

  39. `/usr/local/mysql/bin/mysqldumpslow -s t /tmp/.last.txt > /tmp/.sloww`;

  40. open SELECT_LOG, " or die "cant open slow log";
  41. undef$/;
  42. $content = <SELECT_LOG>;
  43. print $content;

  44. &send_mail("mysql slow log monitor", $content);

  45. sub send_mail {
  46.         my ($subject, $message) = @_;
  47. }

使用:
加入crontab 即可:
*/2 * * * * /usr/local/bin/mysql_slow_monitor.perl 2 > /tmp/mysql_slow_monitor.log 2>&1 &
阅读(2455) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~