インフィニットループ 技術ブログ

2017年03月16日 (木)

著者 : nob

phpMyAdmin の赤い警告もこれで怖くない!MySQL 状態変数の徹底ガイド

こんにちはデーターベースがお仕事ですが人工知能も大好きな nobuh です。今回は phpMyAdmin のお話しです。

働き者 phpMyAdmin

MySQL 上のテーブルを操作したり参照したりする GUI 管理ツールで特にポピュラーなのが php で書かれた phpMyAdmin だと思います。
長い歴史のあるコミュニティに支えられたオープンソースのツールですが、この phpMyAdmin 本当に機能が豊富です。特に 状態 メニューの中は「え、こんなのもあったの!」という面白機能が目白押しです。

クエリの統計

どんなクエリがどれくらいの割合で実行されているかのデータです

モニタ

Cacti, Munin, Zabbix をはじめ Prometheus & Grafana などパフォーマンスなどのデータを可視化してくれるソフトは色々ありますが、phpMyAdmin にも実はグラフ化機能があります。デフォルトは CPU などサーバーっぽいメトリックのものが入っていますが、メニューから自分でも好みのシステム変数に関するグラフを追加することが可能です。

アドバイザ

おすすめの設定値を教えてくれます。ここに出てくるものは、「スロークエリログが無効になっています」など文章を読むとすんなり納得出来るものが多いです。

すべての状態変数

今回本題の機能です。MySQL の STATUS コマンドで参照出来る、システムの状態を示す 状態変数 に関するページです。問題となっているところを 赤く 警告してくれています。

MySQL の運用管理に情熱を傾けているインフラエンジニアの方々の皆さまはこの 赤い数値 を見ると、きっといてもたってもいられない気持ちになることと思います。放置しておくことは出来ません!撲滅せねば!

赤い警告を見てみると

実際には「無いに越したことはないけど、警告するほどでは。。。」という物が沢山みつかります。また phpMyAdmin にとって「一体いくつまでなら正常なんだろう」という疑問も沸き上がります。一例をあげますと、

  • Aborted Connects
  • 87
  • MySQLサーバへの接続を試みて失敗した回数

エラーなので無い方がいいですが、いくつまで OK なのでしょう?ドキュメントに記載もありません。気になって睡眠も不足しがちになったためソースを見て確認しました!その結果がこちらです!

$alert 配列

一生懸命ソースを掘っていきますと、、、ありました!

  • phpMyAdmin をインストールしたディレクトリ/libraries/server_status_variables.lib.php

PMA_getHtmlForVariablesList 関数というのがありますが、そこの中の $alert 配列に

  • 「これより大きくなったら赤字にする数値ないし条件式」

として定義されていました。

/**
 * Returns a table with variables information
 *
 * @param PMA_ServerStatusData $ServerStatusData Server status data
 *
 * @return string
 */
function PMA_getHtmlForVariablesList($ServerStatusData)
{
    $retval  = '';
    $strShowStatus = PMA_getStatusVariablesDescriptions();
    /**
     * define some alerts
     */
    // name => max value before alert
    $alerts = array(
        // lower is better
        // variable => max value
        'Aborted_clients' => 0,
        'Aborted_connects' => 0,
以下省略

表にしてまとめました

変数 閾値
Aborted_clients 0
Aborted_connects 0
Binlog_cache_disk_use 0
Created_tmp_disk_tables 0
Handler_read_rnd 0
Handler_read_rnd_next 0
Innodb_buffer_pool_pages_dirty 0
Innodb_buffer_pool_reads 0
Innodb_buffer_pool_wait_free 0
Innodb_log_waits 0
Innodb_row_lock_time_avg 10
Innodb_row_lock_time_max 50
Innodb_row_lock_waits 0
Slow_queries 0
Delayed_errors 0
Select_full_join 0
Select_range_check 0
Soft_merge_passes 0
Opened_tables 0
Table_locks_waited 0
Qcache_lowmem_prunes 0
Qcache_free_blocks Qcache_total_blocks の値があればその 1/5、なければ 0
Slow_launch_threads 0
Key_reads Key_read_requests の値あればその 0.01倍、なければ 0
Key_writes Key_write_requests の値があればその 0.9倍、なければ 0
Key_buffer_fraction 0.5
Threads_cached thread_cache_size の値があればその 0.95倍、なければ 0

しくみが分かったので改造しよう!

中をみてみると、たとえばキーでピンポイントのルックアップを行った場合に記録される Handler_read_rnd の閾値が 0 になっていたりなど、微妙な味付けになっているところが多々あります。せっかくのオープンソースです。自分好みに変更してみましょう。
さきほど 87 で赤くなっていた Aborted_connects のところを 100 にしてみます。

        'Aborted_connects' => 100,

これだけです。ブラウザでアクセスしてみると・・・同じ 87 で無事 緑色 になりました!

OK は緑、ではは何?
カンのいい方はすでにお気づきかもしれません。MySQL のステータス変数は MySQL 5.7.17 でも 356 個  ありますが、ソース上で設定されている閾値は 27 個しかありません。残りの項目はどうなっているかといいますと。。。大部分を占める黒い数字は何も判定していない数値です!

(ちょうど 、黒、3色のっている箇所がありましたのでサンプルとして)
大部分の黒い変数は OK とも NG とも判定してないだけです!赤くないと言って油断しないように!

まとめ

  • phpMyAdmin はスキーマやデータを触る以外の機能も豊富!
  • 「すべての状態変数」の赤い警告の閾値は PMA_getHtmlForVariablesList 関数の $alert 配列で定義されている
  • 自分で変更できて楽しいよ!
  • 大部分の黒字のところは何も判定していないだけなので注意

インフィニットループでは PHP も MySQL も大好きなエンジニアを募集しています。詳しくは 採用情報 まで

ブログ記事検索

このブログについて

このブログは、札幌市・仙台市の「株式会社インフィニットループ」が運営する技術ブログです。 お仕事で使えるITネタを社員たちが発信します!