当前位置: 首页 > 工具软件 > orzdba > 使用案例 >

监控mysql之orzdba和orztop

公冶鸣
2023-12-01
这两款工具都是基于perl,由淘宝DBA朱旭编写。

Orzdba

MySQL性能统计信息进行计算,统计MySQL/INNODB层面的各种指标(QPS/TPS/thread/buffer/log等), 将OSMySQL统计参数放在一个屏幕中展现

可选项

   -L,--logfile        Print to Logfile.

   -l,--load           Print Load Info.

   -c,--cpu            Print Cpu  Info.

   -s,--swap           Print Swap Info.

   -d,--disk           Print Disk Info.

   -n,--net            Print Net  Info.

   -com                Print MySQL Status(Com_select,Com_insert,Com_update,Com_delete).

   -hit                Print Innodb Hit%.

   -innodb_rows        Print Innodb Rows Status(Innodb_rows_inserted/updated/deleted/read).

   -innodb_pages       Print Innodb Buffer Pool Pages Status(Innodb_buffer_pool_pages_data/free/dirty/flushed)

   -innodb_data        Print Innodb Data Status(Innodb_data_reads/writes/read/written)

   -innodb_log         Print Innodb Log  Status(Innodb_os_log_fsyncs/written)

   -innodb_status      Print Innodb Status from Command: 'Show Engine Innodb Status'

                       (history list/ log unflushed/uncheckpointed bytes/ read views/ queries inside/queued)

   -T,--threads        Print Threads Status(Threads_running,Threads_connected,Threads_created,Threads_cached).


—com为例查看源码

登录mysql,执行show global status并过滤出候选状态变量

my $mysql = qq{$MYSQL -e 'show global status where Variable_name in ("Com_select","Com_insert","Com_update","Com_delete","Innodb_buffer_pool_read_requests","Innodb_buffer_pool_reads","Innodb_rows_inserted","Innodb_rows_updated","Innodb_rows_deleted","Innodb_rows_read","Threads_running","Threads_connected","Threads_cached","Threads_created","Bytes_received","Bytes_sent","Innodb_buffer_pool_pages_data","Innodb_buffer_pool_pages_free","Innodb_buffer_pool_pages_dirty","Innodb_buffer_pool_pages_flushed","Innodb_data_reads","Innodb_data_writes","Innodb_data_read","Innodb_data_written","Innodb_os_log_fsyncs","Innodb_os_log_written")'};

将两次运行结果相减并除以时间间隔,即可得出每秒的数据

my $insert_diff = ( $mystat2{"Com_insert"} - $mystat1{"Com_insert"} ) / $interval;

my $update_diff = ( $mystat2{"Com_update"} - $mystat1{"Com_update"} ) / $interval;

my $delete_diff = ( $mystat2{"Com_delete"} - $mystat1{"Com_delete"} ) / $interval;

my $select_diff = ( $mystat2{"Com_select"} - $mystat1{"Com_select"} ) / $interval;

打印输出

if ($com) {

  # Com_insert # Com_update # Com_delete

  print $LOG_OUT WHITE();

  printf $LOG_OUT "%5d %5d %5d",$insert_diff,$update_diff,$delete_diff;

  print $LOG_OUT YELLOW();

  # Com_select

  printf $LOG_OUT " %6d",$select_diff;

  # Total TPS

  printf $LOG_OUT " %5d",$insert_diff+$update_diff+$delete_diff;

  print $LOG_OUT GREEN(),"|",RESET();

}

可以运行Orzdba持续监控mysql并把结果输出到日志,这样当非工作时间系统运行慢的时候可以回头查看历史信息,通过com_select等指标同时配合OS cpu/mem/io信息,可以快速做出一个大致判断,

http://code.taobao.org/p/orzdba/src/trunk/orzdba

Orztop

可即时显示mysql当前query list,以及每秒的DML/select以及逻辑读等指标,用于即时的系统调优;

逻辑读的计算来源于innodb_buffer_pool_read_requests,而innodb_buffer_pool_reads则是须从磁盘读取的逻辑读次数; 


该工具选项比较少

-h,–host Hostname/Ip to use for mysql connection.

-u,–user User to use for mysql connection.

-p,–pwd Password to use for mysql connection.

-P,–port Port to use for mysql connection(default 3306).

-S,–socket Socket to use for mysql connection.

-t Time(second) Interval.

代码片段

my $sql_processlist  = qq{show full processlist};

my @processlist = &hashes($sql_processlist);

@mysql_processlist = @processlist;

@mysql_processlist = sort{ $a->{time} <=> $b->{time} } @mysql_processlist;

show full processlist的结果进行封装,然后遍历

foreach (@mysql_processlist) {

  next if ($_->{command} eq "Sleep" or $_->{command} eq "Binlog Dump" or $_->{command} eq "Connect") and not $mysql_processlist_idle;

  next if ($_->{db}   !~ $mysql_processlist_filter_db);

  next if ($_->{user} !~ $mysql_processlist_filter_user);

  next if ($_->{info} !~ $mysql_processlist_filter_sql);

  if ( 1 ) {

    printf "%8s %20s %15s %15s %15s %10s", $_->{id},$_->{host}, $_->{user}, $_->{db}, $_->{command},$_->{time} ;

    print color('magenta') ;

    printf "    %-50s\n",$_->{state};

                        

    if ($_->{info} ne '') {

      if ( $mysql_filter ) {

      $_->{info} =~ /$mysql_filter/i ;

      print color('yellow') ;

      print " ==> [ SQL ] ".$`;

      print color('bold red') ;

      print $& ;

      print color('reset yellow') ;

      print $'."\n" ;

    } else {

      print color('yellow') ;

      print " ==> [ SQL ] ".$_->{info}."\n";

   }

 }

}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-1425464/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15480802/viewspace-1425464/

 类似资料: