管理 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