5年ほど運用している、検証開発環境のZabbixのDBが肥大化していたので、メンテナンスしました。
この環境とは別に、本番環境でも運用しているZabbixがあるので、今回のメンテナンスの結果次第で本番環境でも実施しようと考えての事前検証の意味も含めてのメンテナンスです。
そして、実行する前と後で、各テーブルのサイズがどのくらい小さくなったかを比較してみたいと思います。
メンテナンスの方法
具体的に何をしたか?というと、肥大化していたテーブルに対して、ALTER TABLE を使って肥大化しているテーブルを再構成しました。ただこれだけ。
ALTER TABLE の動作としては以下。
1.テーブルをTL_WRITE_ALLOW_READロックする。このロックは特殊なロックで、テーブルロックの一種であるが、
他のセッションからのREADを許可し、WRITEをブロックする。
2.新しいテーブル定義を使って空のテンポラリテーブルを作成する。
3.古いテーブルから新しいテーブルへデータをコピーする。
4.テーブルの名前を付け替えて、新しいテーブルを古いテーブルと同じ名前にする。古いテーブルは破棄する。
5.新しいテーブルへブロックしていたWRITEをリダイレクトする。
引用:http://nippondanji.blogspot.com/2009/05/alter-table.html
注意する点としては、以下。
- 元テーブルのサイズと同じくらいのディスク空き容量が必要
- 実行時はWRITEがブロックされる(readは可能)
ですので、肥大化したテーブルのサイズ以上のディスクの空き領域がない場合は、単純にALTER TABLEするだけでは対処できないようです。
では、実際にやってみた結果です。
ALTER TABLE の実行
まず、ZabbixのDB全体でどのくらいのディスク容量を使っているのかを確認しておきます。
1 2 3 4 5 |
]# pwd /var/lib/mysql ]# du ./zabbix/ -sh 7.8G ./zabbix/ |
なんだ、たいして使ってないじゃん、と思った方。
その通りです。開発検証環境用として構築したものなので、超節約スペックで構成しているのです。
次に、肥大化しているテーブルのサイズを確認しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
]# pwd /var/lib/mysql/zabbix ]# ll *.ibd -hS|head -rw-rw---- 1 mysql mysql 2.4G 8月 1 15:35 history_uint.ibd -rw-rw---- 1 mysql mysql 1.7G 8月 1 15:35 history.ibd -rw-rw---- 1 mysql mysql 1.4G 8月 1 15:35 auditlog.ibd -rw-rw---- 1 mysql mysql 1.4G 8月 1 15:35 history_log.ibd -rw-rw---- 1 mysql mysql 400M 8月 1 15:35 history_str.ibd -rw-rw---- 1 mysql mysql 236M 8月 1 15:34 history_text.ibd -rw-rw---- 1 mysql mysql 232M 8月 1 15:35 trends_uint.ibd -rw-rw---- 1 mysql mysql 152M 8月 1 15:34 trends.ibd -rw-rw---- 1 mysql mysql 92M 8月 1 15:33 events.ibd -rw-rw---- 1 mysql mysql 16M 7月 28 14:17 alerts.ibd |
ここから、ALTER TABLEを実行してどのくらい減るかですよね。楽しみ楽しみ。
では実行していきます。実行コマンドとしては、こんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
]# mysql -uroot -p > use zabbix; > alter table history_uint engine=InnoDB; Query OK, 24070075 rows affected (5 min 21.70 sec) Records: 24070075 Duplicates: 0 Warnings: 0 > alter table history engine=InnoDB; Query OK, 13706914 rows affected (3 min 17.11 sec) Records: 13706914 Duplicates: 0 Warnings: 0 > alter table auditlog engine=InnoDB; Query OK, 919703 rows affected (14.58 sec) Records: 919703 Duplicates: 0 Warnings: 0 > alter table history_log engine=InnoDB; Query OK, 137771 rows affected (4.95 sec) Records: 137771 Duplicates: 0 Warnings: 0 > alter table history_text engine=InnoDB; Query OK, 106420 rows affected (14.28 sec) Records: 106420 Duplicates: 0 Warnings: 0 |
余談ですが、コマンドラインから直接実行する場合は以下のように実行すればよいので、スクリプト化してcronで回すことで定期的なメンテナンスもできそうです。
1 |
# mysql -uroot -pxxxxxxxx -Dzabbix -e "alter table history_uint ENGINE=InnoDB;" |
では、テーブルサイズがどのくらい減ったかを確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
]# pwd /var/lib/mysql/zabbix ]# ll *.ibd -hS|head 合計 4.7G -rw-rw---- 1 mysql mysql 1.9G 8月 1 16:31 history_uint.ibd -rw-rw---- 1 mysql mysql 1.1G 8月 1 16:31 history.ibd -rw-rw---- 1 mysql mysql 188M 8月 1 16:31 trends_uint.ibd -rw-rw---- 1 mysql mysql 164M 8月 1 16:31 history_text.ibd -rw-rw---- 1 mysql mysql 124M 8月 1 16:31 auditlog.ibd -rw-rw---- 1 mysql mysql 96M 8月 1 16:31 history_str.ibd -rw-rw---- 1 mysql mysql 92M 8月 1 16:31 trends.ibd -rw-rw---- 1 mysql mysql 60M 8月 1 16:29 history_log.ibd -rw-rw---- 1 mysql mysql 11M 8月 1 16:29 events.ibd |
実行前 7.8GB → 実行後 4.8GB と、割合としてはかなり減ったのではないでしょうか?!
わかりやすいように比較してみると。。。
テーブル名 | ビフォー | アフター |
history_uint | 2.4GB | 1.9GB |
history | 1.7GB | 1.1GB |
trends_uint | 232MB | 188MB |
history_text | 236MB | 164MB |
auditlog | 1.4GB | 124MB |
history_str | 400MB | 96MB |
trends | 152MB | 92MB |
history_log | 1.4GB | 60MB |
events | 92MB | 11MB |
auditlog と history_log がびっくりするくらい減っていますね。
history_log のサイズが減っているのは、以前はログの監視もしていましたが、現在ではしていません。そのため、設定していた保存期間を過ぎたヒストリのデータが削除されたと考えられます。
auditlogのテーブルはなぜこんなにへっているのでしょう。。。そもそも、なんのデータなんでしょう。Zabbixへのログイン/ログアウトなどのログなのでしょうか。それであればなぜこんなに変化があるのか不思議です。どこかで保存期間を設定していて、どこかのタイミングで短く設定したのか?はて。。。
とまぁ、謎な部分は残りますが、とりあえず効果はありそうです。
途中でデータの保存期間を変更(短く)していたり、監視の設定を追加したり削除したりを繰り返している場合には特に効果が見られるようですね。
まとめ
長く運用していると、いろいろ問題がでてくることもありますが、こうやってメンテナンスしていくことで、そのシステムに対しての愛情が芽生えてきます。。。よね?
途中で引き継いだサーバの設定なんかを見ていると、 これ ひでぇな おぃ・・・ということもよくありますが、反面教師として丁寧なシゴトを心がけたいものです。
では。
↓↓↓ 持っていると便利な一冊 ↓↓↓