随笔 - 105  文章 - 36 评论 - 4 trackbacks - 0

管理 mysql 最让人困扰的就是如何有效的掌握 MySQL 的健康状况,因为 MySQL 虽然有提供许多系统变量值供您参考,但这些零散的数据若要手动搜集与过滤将会是一件十分没有效率的事情(除非您写 Scripts 去分析)。而接下来要介绍的这套 “工具” 其实是由 hackmysql.com 的站长所撰写的 perl Scritps,旨在协助 MySQL DBA 搜集与分析 MySQL 的运作状况。

官方网站: http://hackmysql.com/
软件下载: http://hackmysql.com/mysqlreport

mysqlreport以很友好的方式显示 MySQL状态变。事实上,它几乎报告了所有的状态。不像 SHOW STATUS 只是在显示了100多个状态值,mysqlreport 则以人性化的方式阐释和格式化了这些状态值,大大增加了其可读性。

mysqlreport 的好处是可以快速的查看各种状态参数组,从而了解服务器的运行状态情况,而无需从 SHOW STATUS 的结果中人工计算。例如索引读取比率是个重要的参数,但是 SHOW STATUS 中并没有显示;它是一个推断值(key_reads 和 key_read_requests 的比值)。

mysql命令行中精彩使用下面的指令来获取当前数据库的实时状态:

mysql>show status;
mysql>show innodb status;

但是他们的显示结果不太友好,我们需要更好的更加人性化的分析结果,而不是堆出来一堆数字。mysqlreport是一个第三方的Mysql状态报告工具,它把mysql的show status 和 show innodb status的结果进行一系列的后期处理,让可读性更强,更友好。 下面是mysqlreport的安装过程:

MySQLReport 是用perl语言编写,所以想要运行它首先需要安装perl环境;它还要与MySQL数据库连接,所以还需要安装数据库接口 DBI 和 数据库驱动 DBD-MySQL 。

# perl -v    //如果显示perl版本说明perl环境已经安装

安装DBI

1 yum -y install perl-DBI

或者

1 # wget http://ftp.cuhk.edu.hk/pub/packages/perl/CPAN/authors/id/T/TI/TIMB/DBI-1.616.tar.gz
2 # tar zxvf DBI-1.616.tar.gz
3 # cd DBI-1.616
4 # perl Makefile.PL
5 # make
6 # make test
7 # make
8 # make install

安装DBD-mysql

1   yum -y install perl-DBD-MySQL

或者

1 # wget http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.020.tar.gz
2 # tar zxvf DBD-mysql-4.020.tar.gz
3 # cd DBD-mysql-4.020
4 # perl Makefile.PL --mysql_config=/usr/local/mysql/bin/mysql_config
5 # make
6 # make test

如果报错:

PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/Arch')" t/*.t t/00base....................ok 1/6
# Failed test 'use DBD::mysql;' t/00base....................NOK 2
# in t/00base.t at line 21.
# Tried to use 'DBD::mysql'.
# Error: Can't load '/usr/local/src/DBD-mysql-4.020/blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: libmysqlclient.so.16: cannot open shared object file: No such file or directory at /usr/lib64/perl5/5.8.8/x86_64-Linux-thread-multi/DynaLoader.pm line 230.
# at (eval 6) line 2 # Compilation failed in require at (eval 6) line 2.
# BEGIN failed--compilation aborted at t/00base.t line 21.
FAILED--Further testing stopped: Unable to load DBD::mysql make: *** [test_dynamic] Error 9 

 解决办法:

1 # cp /usr/local/mysql/lib/mysql/* /usr/lib
2 # cp /usr/local/mysql/lib/mysql/* /usr/lib64/ (如果64位 否则是lib)
3 
4 # make
5 # make install

安装mysqlreport

1 http://pkgs.fedoraproject.org/repo/pkgs/mysqlreport/mysqlreport-3.5.tgz/33a345f5e2c89b083a9ff0423f7fd7b4/mysqlreport-3.5.tgz

参数的说明:

 1  mysqlreport --help
 2 
 3 mysqlreport v3.5 Apr 16 2008 
 4 mysqlreport makes an easy-to-read report of important MySQL status values.
 5 
 6 Command line options (abbreviations work): 
 7 --user USER       Connect to MySQL as USER 
 8 --password PASS   Use PASS or prompt for MySQL user's password 
 9 --host ADDRESS    Connect to MySQL at ADDRESS 
10 --port PORT       Connect to MySQL at PORT 
11 --socket SOCKET   Connect to MySQL at SOCKET 
12 --no-mycnf        Don't read ~/.my.cnf 
13 --infile FILE     Read status values from FILE instead of MySQL 
14 --outfile FILE    write report to FILE 
15 --email ADDRESS   Email report to ADDRESS (doesn't work on Windows) 
16 --flush-status    Issue FLUSH STATUS; after getting current values 
17 --relative X      Generate relative reports. If X is an integer, 
18 reports are live from the MySQL server X seconds apart. 
19 If X is a list of infiles (file1 file2 etc.), 
20 reports are generated from the infiles in the order 
21 that they are given. 
22 --report-count N  Collect N number of live relative reports (default 1) 
23 --detach          Fork and detach from terminal (run in background) 
24 --help            Prints this 
25 --debug           Print debugging information

以下是mysqlreport的命令选项:

 1 命令行选项的格式是 --选项,不过 -选项 的格式也可以。所有的选项都有其缩写,只要是唯一的。例如,选项 --host 可以缩写成 --ho,不过不能写成 --h,因为 --h 有歧义,可能是 --host 或者 --help。
 2 
 3 选项列表
 4 
 5 --user USER
 6 --password
 7 --host ADDRESS
 8 --port PORT
 9 --socket SOCKET
10 --no-mycnf
11 
12 --help 这些选项是模拟其他标准应用程序的。从 2.3 版本开始,--password 可以在后面加上参数,如 "--password FOO"。如果命令行中只指定了选项
13 
14 --password 则会提示输入密码。--no-mycnf 告诉 mysqlreport 不要读取 ~/.my.cnf,默认会去读取这个文件。--user 和 --password 总是覆盖从 ~/.my.cnf 中取得的结果。 
15 
16 --infile FILE 直接从文件中读取状态文件,而不是从MySQL的 SHOW STATUS 中读取。文件内容通常是从 SHOW STATUS 的结果中取得,并且包含格式化字符(|, +, -)。mysqlreport 认为这样的文件"状态名 数值"格式的,状态包含字符和下划线(A-Z 和 _),数值则是非负整数。在状态名和数值之间的任何内容都会被忽略。mysqlreport 也需要以下MySQL服务器系统变量:version, table_cache, max_connections, key_buffer_size, query_cache_size, thread_cache_size。
17 
18 INFILE 的格式也可以是 "名字 = 数值"这样的,名字可以使是上面提到的各种变量名,数值是非负整数,可能后面带有M或者其他单位(根据版本不同而定)。例如,想要指定 18M 的 key_buffer_size:key_buffer_size = 18M。或者,256 个 table_cache:table_cache = 256。M 指兆字节,而非百万。因此 18M 是 18,874,368,而非 18,000,000。如果这些服务器变量没有指定,则使用默认以下默认值:0.0.0, 64, 100, 8M, 0, 0,就可能会让报告结果看起来很奇怪。
19 
20 注意:MySQL 服务器版本在 5.1.3 或更新时,尽管系统变量 table_cache 改成了 table_open_cache,但是读取本地文件时仍采用 table_cache。
21 
22 --outfile FILE 在屏幕显示完报告结果后,将结果写入文件中。mysqlreport 的内部机制总是先将结果写入临时文件中。然后将该临时文件里的内容打印到屏幕上。然后,如果指定了 --outfile 选项,则将临时文件拷贝成 OUTFILE。如果指定选项 --email,则会删除临时文件。 
23 
24 --email ADDRESS 在屏幕显示完结果后,将结果发送到邮件地址 ADDRESS 中去。欲该选项,需要在 /usr/sbin/ 目录下有 sendmail 程序,因此无法在 windows 平台下使用。/usr/sbin/sendmail 可以符号链接到 qmail,或者任何其他能模拟 sendmail -t 方式的 MTA 程序。邮件来源是:mysqlreport,主题是:MySQL status report on HOST,HOST 是 mysqlreport所在的主机名,可能是读取到的 --host 值,默认是 localhost。
25 
26 --flush-status 显示完报告后,执行 "FLUSH STATUS;" 语句。如果没有权限,则 DBD::mysql 会显示返回值。 
27 
28 --relative (-r) X mysqlreport 通常情况下报告的是自从 MySQL 服务器启动以来的状态信息。--relative 选项则是令 mysqlreport 产生一份自从上次报告以来的相关报告。
29 
30 如果 --relative X 的 X 值是一个整数,则 mysqlreport 会在隔 X 秒后再次产生一份 MySQL 服务器的状态报告。产生报告的次数是由 --report-count 选项来控制的。默认是产生 1 份相关的报告。例如,指定 --relative 的值为 60,则会产生 2 份报告:第一份会马上生成,第二份会在 60 秒后再次生成。第二份报告中的数值会和前面的那份相关。例如,前面那份中总共有 10.00k 次查询,在这 60 秒的间隔时间里接受了新的 1.00k 次查询,则第二份的报告中的总查询次数是 1.00k 而非 11.00k 次。
31 
32 如果 --relative 选项的值也可以是本地文件(类似 --infile 选项的用法),那么 mysqlreport 会按照参数值中文件的顺序来依次产生状态报告。因此,根据这些文件产生的时间来指定选项的值非常重要:较早产生的文件放在参数的前面。第一个文件中必须有手工添加的系统变量,例如:key_buffer_size、table_cache 等。每个文件中可以有多组 "SHOW STATUS" 的结果。注意:通过 "mysqladmin -r -i N extended" 产生的状态文件无法使用,因为 mysqladmin 的 -r 参数已经令其产生了具有相对性的状态值了。
33 
34 由于 mysqlreport 首先会把状态报告写到临时文件中,如果 --relative 的值是 整数(而非 本地文件)时,mysqlreport 会显示它把文件写到哪了。那么就可以直接通过查看这些文件内容来观察服务器的状况了。
35 
36 --report-count (-c) N 生成 N 份相关的报告。本选项只有在同时启用 --relative 选项后才有效。mysqlreport 会自动产生 N+1 份报告:第一份基本报告,以及后面的 N 份相关报告。
37 
38 --detach  若指定本选项,则 mysqlreport 会派生出进程来,不只是在屏幕显示结果,还会转入后台继续运行。派生新进程后,mysqlreport 会报告它把结果写入哪个临时文件了。本选项还可以指定 --outfile 或 --email 的一个。如果没有指定 --outfile 或 --email 的值,则产生的临时文件会被删除,因为 mysqlreport 派生出新进程后,无法再将结果打印到终端屏幕上了。本选项如果和 --relative 一起使用的话就更有意义了,这样 mysqlreport 就能定时报告信息,而无需人工登录等方式在中断执行了。使用如下的命令,就能让 mysqlrepot 隔一个小时再次产生一次报告,并将结果发送到自己的信箱中去:
39 
40 # mysqlreport -r 3600 -detach -email host@domain.com
41 
42 一个小时候后,mysqlreport 通过email发送报告,删除临时文件,并且干净地终止。
43 
44 --debug  显示调试信息。
45 
46 --dtq (Questions 报告的 Total 部分中) 显示所有的查询分布报告。这些查询主要包括以下四部分:DMS (见下面)、COM_ (见下面)、COM_QUIT(见 COM_QUIT and Questions)、以及其他未知。每部分根据其总数倒序显示。
47 
48 --dms (Questions 报告的 DMS 部分中) 显示所有的数据维护语句(DMS)报告。DMS是下面文档 13.2. Data Manipulation Statements 中提到的那些(当前主要有:SELECT, INSERT, REPLACE, UPDATE, and DELETE)。每个 DMS 根据其总数倒序显示。
49 
50 --com N (Questions 报告之后) 以降序显示最多 N 个 非DMS Com_ 状态值。如果没有指定 N 的值,则默认是 3。所谓的非DMS Com_ 状态值,包括:Com_change_db、Com_show_tables、Com_rollback 等。
51 
52 --sas (Questions 报告之后) 显示所有的 Select_ 和 Sort_ 报告。详情请看 MySQL Select and sort Status Variables。
53 
54 --qcache 如果打开查询缓存的话,则显示查询缓存状态报告
55 
56 --tab (Create Temp 报告之后) 显示 线程、放弃的、流量 等状态报告。从 mysqlreport v2.3 开始,线程状态是从 Threads_ 状态值读取。
57 
58 --innodb 显示 InnoDB 状态报告,包括MySQL 5.0.2以后才支持的InnoDB 缓冲池,以及5.0.3以后才支持的InnoDB锁状态报告。
59 
60 --innodb-only 只显示 InnoDB 报告;不显示其他报告。
61 
62 --dpr 显示 InnoDB 数据,页,行报告。
63 
64 --all 如果可能,则显示所有的状态报告。一些报告,比如查询缓存、InnoDB等需要特定版本的MySQL或者其他特性才能支持。例如,尽管服务器支持查询缓存,但是它被禁用了,则不管是否指定了 --qcache 或者 --all,都不会显示查询缓存的报告。

 最终产生的结果:

  1 [root@localhost mysqlreport-3.5]# ./mysqlreport --user root --password sina.com --socket /tmp/mysqld.sock 
  2 Use of uninitialized value $is in multiplication (*) at ./mysqlreport line 829.
  3 Use of uninitialized value in formline at ./mysqlreport line 1227.
  4 Use of uninitialized value in formline at ./mysqlreport line 1235.
  5 MySQL 5.5.41-log         uptime 6 22:50:53      Fri Jul 24 10:29:33 2015
  6 
  7 __ Key _________________________________________________________________
  8 Buffer used         0 of 512.00M  %Used:   0.00
  9   Current      93.36M            %Usage:  18.24
 10 Write hit       0.00%
 11 Read hit        0.00%
 12 
 13 __ Questions ___________________________________________________________
 14 Total         421.97M   702.5/s
 15   QC Hits     302.51M   503.6/s  %Total:  71.69
 16   Com_         71.56M   119.1/s           16.96
 17   DMS          47.48M    79.1/s           11.25
 18   COM_QUIT    411.49k     0.7/s            0.10
 19   +Unknown      8.83k     0.0/s            0.00
 20 Slow 1 s        1.12k     0.0/s            0.00  %DMS:   0.00  Log: OFF
 21 DMS            47.48M    79.1/s           11.25
 22   SELECT       46.66M    77.7/s           11.06         98.27
 23   INSERT      817.56k     1.4/s            0.19          1.72
 24   DELETE        1.37k     0.0/s            0.00          0.00
 25   UPDATE          926     0.0/s            0.00          0.00
 26   REPLACE           0       0/s            0.00          0.00
 27 Com_           71.56M   119.1/s           16.96
 28   change_db    69.87M   116.3/s           16.56
 29   set_option    1.29M     2.2/s            0.31
 30   commit      373.13k     0.6/s            0.09
 31 
 32 __ SELECT and Sort _____________________________________________________
 33 Scan           23.90k     0.0/s %SELECT:   0.05
 34 Range           1.17k     0.0/s            0.00
 35 Full join           0       0/s            0.00
 36 Range check         0       0/s            0.00
 37 Full rng join       0       0/s            0.00
 38 Sort scan          28     0.0/s
 39 Sort range          0       0/s
 40 Sort mrg pass       0       0/s
 41 
 42 __ Query Cache _________________________________________________________
 43 Memory usage  352.62M of 512.00M  %Used:  68.87
 44 Block Fragmnt   0.00%
 45 Hits          302.51M   503.6/s
 46 Inserts        46.65M    77.7/s
 47 Insrt:Prune  46.65M:1    77.7/s
 48 Hit:Insert     6.48:1
 49 
 50 __ Table Locks _________________________________________________________
 51 Waited              0       0/s  %Total:   0.00
 52 Immediate      47.48M    79.1/s
 53 
 54 __ Tables ______________________________________________________________
 55 Open               53 of   64    %Cache:  82.81
 56 Opened             99     0.0/s
 57 
 58 __ Connections _________________________________________________________
 59 Max used           13 of  151      %Max:   8.61
 60 Total         411.50k     0.7/s
 61 
 62 __ Created Temp ________________________________________________________
 63 Disk table      2.36k     0.0/s
 64 Table          23.95k     0.0/s    Size:  16.0M
 65 File                6     0.0/s
 66 
 67 __ Threads _____________________________________________________________
 68 Running             5 of    5
 69 Cached              0 of    0      %Hit:      0
 70 Created       411.49k     0.7/s
 71 Slow                0       0/s
 72 
 73 __ Aborted _____________________________________________________________
 74 Clients             0       0/s
 75 Connects            1     0.0/s
 76 
 77 __ Bytes _______________________________________________________________
 78 Sent           74.58G  124.2k/s
 79 Received       41.33G   68.8k/s
 80 
 81 __ InnoDB Buffer Pool __________________________________________________
 82 Usage         320.58M of   2.00G  %Used:  15.65
 83 Read hit      100.00%
 84 Pages
 85   Free        110.55k            %Total:  84.35
 86   Data         17.89k                     13.65 %Drty:   0.00
 87   Misc           2622                      2.00
 88   Latched                                  0.00
 89 Reads           3.07G    5.1k/s
 90   From file    12.54k     0.0/s            0.00
 91   Ahead Rnd         0       0/s
 92   Ahead Sql                 0/s
 93 Writes          7.10M    11.8/s
 94 Flushes       124.23k     0.2/s
 95 Wait Free           0       0/s
 96 
 97 __ InnoDB Lock _________________________________________________________
 98 Waits               3     0.0/s
 99 Current             0
100 Time acquiring
101   Total             5 ms
102   Average           1 ms
103   Max               5 ms
104 
105 __ InnoDB Data, Pages, Rows ____________________________________________
106 Data
107   Reads        15.13k     0.0/s
108   Writes        1.84M     3.1/s
109   fsync        85.88k     0.1/s
110   Pending
111     Reads           0
112     Writes          0
113     fsync           0
114 
115 Pages
116   Created       2.90k     0.0/s
117   Read         14.99k     0.0/s
118   Written     124.23k     0.2/s
119 
120 Rows
121   Deleted       7.32k     0.0/s
122   Inserted    817.55k     1.4/s
123   Read        800.52M    1.3k/s
124   Updated       1.58k     0.0/s

 

posted on 2015-07-24 10:38 shangzekai 阅读(...) 评论(...) 编辑 收藏