現在位置: ホーム / みらくるブログ / 長期間使用しているとDBの実使用量が増えます【MIRACLE ZBX 1.8, 2.0, 2.2】

長期間使用しているとDBの実使用量が増えます【MIRACLE ZBX 1.8, 2.0, 2.2】

Housekeeperプロセスが不要データを削除しても、DBの実使用量は減りません。

Housekeeperプロセスの役割

MIRACLE ZBXを長期間使用していると、ヒストリ、トレンドデータが蓄積されていきます。
個々のアイテムによって、それらの保存する日数を決めることができ、それに応じてHousekeeperプロセスが一時間毎に不要となったデータを削除します。
しかしながら、あくまで削除されるのはDB内のデータであり、OS上のデータ使用量は変わりません。

 

DBの簡単な仕組みの話

上記のようなOS上のデータ使用量が変わらない仕組みを簡単に説明します。(DBの実装に依るので正確ではありません。)

  1. DBは個々のテーブルに対してある程度の領域をOS上にブロックとして確保します。
  2. 書き込み続けて確保した領域が足りなくなると、再度ある程度の領域をブロックとして確保します。
  3. 削除があったときは、そのブロック内で不要となったフラグ立てをします。
  4. うまい具合にブロック内全てのデータが不要となった場合、ブロックが削除、再利用されます。

 

つまり、Housekeeperがいくら不要データを削除しても、実使用量が減りません。

確認方法

まずは、個々のテーブルのデータ使用量を確認してみましょう。
(参考 http://d.hatena.ne.jp/sho-yamasaki/20120405/1333640589)

$ mysql -u root zabbix
mysql> select
-> table_name, engine, table_rows as tbl_rows, avg_row_length as rlen,  
-> floor((data_length+index_length)/1024/1024) as allMB,
-> floor((data_length)/1024/1024) as dMB,
-> floor((index_length)/1024/1024) as iMB
-> from information_schema.tables  
-> where table_schema=database()  
-> order by (data_length+index_length) desc;
+-----------------------+--------+----------+-------+-------+------+------+
| table_name            | engine | tbl_rows | rlen  | allMB | dMB  | iMB  |
+-----------------------+--------+----------+-------+-------+------+------+
| history               | InnoDB |  1123517 |    70 |   103 |   75 |   28 |
| trends                | InnoDB |   291508 |    75 |    21 |   21 |    0 |
| history_uint          | InnoDB |   226836 |    64 |    21 |   14 |    7 |
| trends_uint           | InnoDB |   202549 |    77 |    15 |   15 |    0 |
...

 

historyテーブルが一番使用されており、103MB程使用しています。

次に、実際のディスク容量を見てみましょう。

# ls -al /var/lib/mysql/zabbix/history.*
-rw-rw---- 1 mysql mysql      8654  3月  5 09:16 2013 /var/lib/mysql/zabbix/history.frm
-rw-rw---- 1 mysql mysql 541065216  3月 18 09:50 2015 /var/lib/mysql/zabbix/history.ibd


OS上では540MB程使用しています。

 

OS上の使用量を減らす

OS上の使用量を減らす一番の方法は、mysqldumpにてフルダンプを取得した後に、全てを戻すことです。ただし、この方法ですとDBのダウンタイムが発生してしまいます。
そこで、当社がMIRACLE ZBXサーバを構築するときに、当社が推奨する設定を行っている場合※1に限りますが、下記の方法で行うことができます。

$ mysql -u root zabbix -e "alter table history type=InnoDB;"


※1 具体的には、my.cnfの[mysqld]セクションにinnodb_file_per_tableを設定することです。

実際に行った後の実使用量は下記のように変化します。

# ls -al /var/lib/mysql/zabbix/history.*
-rw-rw---- 1 mysql mysql     8654  3月 18 09:58 2015 /var/lib/mysql/zabbix/history.frm
-rw-rw---- 1 mysql mysql 96468992  3月 18 09:59 2015 /var/lib/mysql/zabbix/history.ibd


96MB程度に減少しています。

下記のようなスクリプトを定期的に動かすのが良いと思いますが、できればZabbixサーバを停止した状態で行ってください。

#!/bin/sh
cd /var/lib/mysql/zabbix
for i in *.ibd
do
db=${i%.ibd}
mysql -u root zabbix -e "alter table ${db} type=InnoDB;"
done

 

注意) 上記は既に古い書式でした。現在では下記が推奨となります。

$ mysql -u root zabbix -e "alter table history ENGINE=InnoDB;"