MySQL こういう監視は可能でしょうか?

お世話になっております。
最近はZabbix1.8から2.2に進化しまして、日々グラフを見ながらニヤニヤ楽しんでおります。

MySQLの監視で、お教え頂きたいことがあります。
下記のような監視というのはZabbixで可能でしょうか?

■データベース毎に、どのMySQLユーザがどのくらいコネクションしてきているのか?
■一番多いSQL文(selectなのか?deleteなのか?とか。)は何か?

グーグル検索で真っ先に引っかかってくるのはCactiであったりKibanaというものであったりします。
自分はZabbixが好きなので、出来ればZabbixを使ってMySQLの監視を行いたいとおもっているのですが
可能でしょうか?

SQL構文解析は無理だとしても、データベース毎にどこからコネクションがきていて、どこが重い(多数接続、スロークエリーとか。)のか
原因の切り分けをしたいです。

ZabbixでMySQLを監視されているような方がいらっしゃいましたら、おすすめ方法を教えて頂けないでしょうか?
よろしくお願い致します。

以上

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー KAZ の写真

ezrealさん

■データベース毎に、どのMySQLユーザがどのくらいコネクションしてきているのか?
↓これをzabbix_agentd.confにユーザパラメータ定義すれば監視可能ですよ。
echo "show status;"|mysql -u root -proot! zabbix|grep Connections|awk '{print $2}'

アイテムの「保存時の計算」ですが、Connectionsは起動してからの累積接続数なので、
「差分」で監視間隔間の接続数が、「差分/時間」で平均値が求められます。

grep Connectionsをgrep Max_used_connectionsに変えると「起動してからの最大同時接続数」が取れます。
その場合、アイテムの「保存時の計算」は「なし」で

■一番多いSQL文(selectなのか?deleteなのか?とか。)は何か?
ぱっと思いつかないですが、できそうですよ。A(^^;


グーグル検索で真っ先に引っかかってくるのはCactiであったりKibanaというものであったりします。
自分はZabbixが好きなので、出来ればZabbixを使ってMySQLの監視を行いたいとおもっているのですが
可能でしょうか?

私Cacti使い(初心者)でもあるんですが、監視においてはCactiでできるならZabbixでできないこと無いと思いますよ。
CactiにできてZabbixできないのはCacti Plug-inのメール送信機能で閾値超えた時にグラフの画像を添付する機能とかですね。A(^^;


SQL構文解析は無理だとしても、データベース毎にどこからコネクションがきていて、どこが重い(多数接続、スロークエリーとか。)のか原因の切り分けをしたいです。

SQL構文解析はZabbixでは無理ですが、PostgreSQLとかだとpgFouineやpg_stat_repoterをテキストベースで出力させて、キーワード監視するってこともできますね。

mytopレベルならzabbixで監視してましたね、昔。
cronで解析するシェルを実行してログに吐かせて、zabbixエージェントでキーワード指定すると値読むシェルをユーザパラメータに指定して、グラフ化してました。
※:もちろん接続数とかも監視してましたよ。

ユーザー KAZ の写真

ezrealさん


■一番多いSQL文(selectなのか?deleteなのか?とか。)は何か?

昔作ったシェルを掘り起こしてみました。A(^^;

↓show statusのここら辺見ればいいんじゃないですかね?
Com_insert
Com_update
Com_delete
Com_select

↓innoDBはこっち見たいです。
Innodb_rows_read
Innodb_rows_deleted
Innodb_rows_updated
Innodb_rows_inserted

ユーザー ezreal の写真

KAZ さん

詳しい説明ありがとうございます!
早速、週末に試してみようと思います。

>監視においてはCactiでできるならZabbixでできないこと無いと思いますよ。
おぉぉー!すばらしぃぃ!

ユーザー KAZ の写真

ezrealさん


詳しい説明ありがとうございます!
早速、週末に試してみようと思います。

頑張ってみてください。
私はawkとか多用しましたがperlとかphpの方がパフォーマンス良いです。
1)cronでphpやperlアプリがMySQLに接続し、情報取得し計算して1行を"キーワード 値"形式でログに出力
2)ログをキーワードでgrepして、cutで値のみ取り出すユーザパラメータを登録

上記の形で行けます。
Zabbix1.4の時に考えた方法です。A(^^;
DBへの接続回数が少ない方が負荷が少ないので一回の起動では一回しかDB見ないようにするのがポイントです。
当たり前か…A(^^;


>監視においてはCactiでできるならZabbixでできないこと無いと思いますよ。
おぉぉー!すばらしぃぃ!

5年位CactiとZabbix使ってますが今までの経験上ではCactiできる監視はZabbixでできます。A(^^;

ちなみにCactiのテンプレートはZabbixのテンプレートに移行できますよ。
今のところハンドメイドですが…A(^^;

私の環境ではYAMAHA RX1500テンプレートとかCactiのYAMAHA RX1200のテンプレートをZabbix用に作り替えて使ってます。

ユーザー ezreal の写真

KAZさん
ユーザーパラメータの書き方についてなのですが・・・

これを書くとしたら如何様になるのでしょうか・・・?
echo "show status;"|mysql -u root -proot! zabbix|grep Connections|awk '{print $2}'

たとえば、バージョンの確認等の簡単なやつならば
UserParameter=mysql.version,mysql -V
uptime情報取得ならば
UserParameter=mysql.uptime,HOME=/var/lib/zabbix mysqladmin status | tr ' ' , |cut -f2 -d

こんな感じでいいと思うのですが、上記のecho~を導入するとなるとどのようにしたらいいでしょうか?

ユーザー ezreal の写真

KAZさん
ユーザーパラメータの書き方についてなのですが・・・

これを書くとしたら如何様になるのでしょうか・・・?
echo "show status;"|mysql -u root -proot! zabbix|grep Connections|awk '{print $2}'

たとえば、バージョンの確認等の簡単なやつならば
UserParameter=mysql.version,mysql -V
uptime情報取得ならば
UserParameter=mysql.uptime,HOME=/var/lib/zabbix mysqladmin status | tr ' ' , |cut -f2 -d

こんな感じでいいと思うのですが、上記のecho~を導入するとなるとどのようにしたらいいでしょうか?

ユーザー KAZ の写真

ezrealさん

ちなみにDB接続ユーザとパスワードはその環境の物に変えてください。A(^^
echo "show status;"|mysql -u {ユーザ} -p{パスワード} {データベース}|grep Connections|awk '{print $2}'

↓これを環境にあった物に変えてください。
{ユーザ}{パスワード}{データベース}

で、シェルを作って…
↓こんなの
#!/bin/sh
echo "show status;"|mysql -u {ユーザ} -p{パスワード} {データベース}|grep Connections|awk '{print $2}'

シェル名をhoge.shにしたとすると↓これで良いはずです。
UserParameter=hoge,{シェルの置いた場所}/hoge.sh

例えば、こんな感じです。
UserParameter=hoge,/etc/zabbix/hoge.sh

ユーザー ezreal の写真

KAZさん回答ありがとうございます!

ユーザーパラメータは以下のように設定致しました。
UserParameter=hoge,/tmp/hoge.sh

[root@local]# /tmp/hoge.sh
403103
[root@local]# /tmp/hoge.sh
403106

これをキー(hoge)で 差分/時間 で設定してあげればいいんですよね?
アイテム一覧で確認すると、取得不可となっているのですが、他に何かやらねばならない作業はありますでしょうか;?
ステータス ⇒ 取得付加
赤い□×欄 ⇒ not supported zabbix agent

ユーザー ezreal の写真

[root@zabbixserver ~]# zabbix_get -s 対象ホスト -k hoge
403706
[root@zabbixserver ~]#

ゲットはできてるのに・・・なんででしょうか;う・・・う・・・

ユーザー ezreal の写真

KAZさん

出来ました(><)b

agent再起動したら、取得可になりました!
お騒がせいたしました。
誠にありがとうございます!

これで監視がより具体的なものとなりました!

ユーザー KAZ の写真

ezrealさん

Zabbixエージェント再起動必要ですね。A(^^;
書くの忘れてましたすいません。

参考になるか分かりませんが、昔作ったMySQL監視シェルを添付します。

mysql_monitor_sh.txt … /usr/local/shellというディレクトリ作ってmysql_monitor.shという名前で配置して下さい。
getValue_sh.txt … Zabbixのユーザパラメータから呼べるところにgetValue.shで配置してください。

シェル内の下記を環境に合わせて書き換えてください。

#database account
ACCOUNT=zabbix


#database password
PASSWD=zabbix!

cronで5分間隔で実行すると下記のファイルが/usr/local/shellに出力されます。(2回動作する必要があるので10分待ってください)
showstatus.log
showstatus.log.1
result.csv
result.csv.1

で、result.csvはこんな感じで出力されます。
Qcache_free_blocks,0
Qcache_free_memory,0
Qcache_hits,0
Qcache_inserts,0
Qcache_not_cached,
Qcache_lowmem_prunes,0
Qcache_queries_in_cache,0
CAL_Qcache_hit_rate,0
CAL_Qcache_lowmem_prunes,0
Open_tables,246
CAL_Opened_tables,0
Threads_connected,17
Threads_cached,13
Threads_running,1
CAL_Threads_created,0
CAL_Key_Efficiency,99.99
Created_tmp_disk_tables,0
Created_tmp_files,5
Created_tmp_tables,1
Sort_merge_passes,0
Sort_range,0
Sort_rows,0
Sort_scan,0
CAL_Table_Scan,100.00
saved time, 03/04/14 19:25:01

で、getValue.shで指定の値を読みだします。
↓こんな感じで定義します。
UserParameter=mysql_atai_tottado[*],/hoge/getValue.sh $1 $2

アイテムのキーは↓こんな感じで指定します。
mysql_atai_tottado[/usr/local/shell/result.csv,Threads_running]

まぁ、こんな感じでできるよと言う…
※1:awkなので重いです。A(^^;
※2:cronの間隔を変える場合はcron intervalの値(秒数)を変えてください。5分以下はお勧めできないです。A(^^;

ユーザー ezreal の写真

KAZさん

ありがとうございます!
さっそく取り組んでみます!