2017年6月1日木曜日

ZabbixのMySQLのDBをバックアップして、リストアする方法

自宅の検証環境の監視用にZabbixを構築しており、DBはMySQLを選択しているが、たまにはDBのバックアップを取得したいと思い実施方法を調べてみた。

バックアップ方法

mysqldumpコマンドでバックアップは実行できるようだ。構文は以下の通り。

# mysqldump -u <ユーザー名> -p <DB名> > <出力ファイル名>.sql

試しに実行してみよう。

# mysqldump -u zabbix -p zabbix > mysqldump_zabbix_`date +"%Y%m%d"`.sql
------------------------------
Enter password:   ←★MySQLの"zabbix"ユーザーのパスワードを入力
------------------------------

ファイルを確認してみると、以下のようにファイルが出力されている。

# ls -l
------------------------------
-rw-r--r--  1 root root 1525531580  5月 28 21:33 2017 mysqldump_zabbix_20170528.sql
------------------------------

ちなみに、mysqldumpは、MySQLのDBの中身をひたすらSQL文としてテキスト出力するコマンドとなっており、出力ファイルの中身はテキストデータになっている。テキストデータなので、圧縮するとファイルサイズがだいぶ小さくなるので、容量効率の観点からは圧縮するのもおすすめとなる。

試しに私の環境のバックアップファイルをzipで圧縮したら、7割以上の容量が削減できた。

# zip mysqldump_zabbix_20170528.sql.zip mysqldump_zabbix_20170528.sql
------------------------------
  adding: mysqldump_zabbix_20170528.sql
 (deflated 73%)   ←★73%の容量が削減された、という意味
------------------------------

以上のように簡単に使えるmysqldumpであるが、1点問題があって、実行中はDBがロックされるため、バックアップ中はZabbixのGUI操作ができなくなり、監視にも影響がでるものと考えられる。

上記問題を回避するために、DBをロックさせないオプションとして、"--single-transaction"を付与することで、ロックを掛けずにバックアップを取得可能となる。

# mysqldump -u zabbix -p --single-transaction zabbix > mysqldump_zabbix_`date +"%Y%m%d"`.sql

上記コマンドであれば、バックアップ取得中であっても、ZabbixのGUI操作は継続して実施可能となる。

リストア方法

バックアップファイルからリストアを行う場合、mysqldumpはSQL文のテキストファイルなので、そのままSQL文としてMySQLに流してしまえばよい。

以下に簡単にリストアの手順を記載する。

1. zabbix-serverの停止

リストア中はDBが使えなくなるため、zabbix-serverを停止しておく。
# service zabbix-server stop
------------------------------
Shutting down zabbix server:                               [  OK  ]
------------------------------

2. ZabbixのDBを削除

MySQLにログインし、リストア対象のDBを削除する。

まずは、MySQLにログインする。

# mysql -u root -p

事前にDBの一覧を確認しておく。今回の削除対象は"zabbix"となる。

mysql> show databases ;
------------------------------
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
| zabbix             |   ←★削除対象
+--------------------+
4 rows in set (0.00 sec)
------------------------------

DBを削除する。

mysql> drop database zabbix ;
------------------------------
Query OK, 108 rows affected (0.07 sec)
------------------------------

削除後のDB一覧を確認し、問題なく削除されていることを確認する。

mysql> show databases ;
------------------------------
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.00 sec)
------------------------------

MySQLからログオフする。

mysql> quit

3. MySQLを停止し不要ファイルを削除

DB削除後に不要なファイルの削除を行うため、一度MySQLを停止する。

# service mysqld stop
------------------------------
mysqld を停止中:                                           [  OK  ]
------------------------------

削除前にファイルを確認する。ib_logfile*とibdata1を削除する。これらはInnoDBの更新用のファイルらしいが、リストアしてMySQL起動時に再作成されるとのことなので、削除して問題ないようだ。

# ls -l /var/lib/mysql/
------------------------------
-rw-rw----  1 mysql mysql 268435456  5月 29 14:53 2017 ib_logfile0   ←★削除対象
-rw-rw----  1 mysql mysql 268435456  5月 28 21:33 2017 ib_logfile1   ←★削除対象
-rw-rw----  1 mysql mysql  35651584  5月 29 14:53 2017 ibdata1       ←★削除対象
drwx------. 2 mysql mysql      4096  3月 19 23:04 2016 mysql
drwx------. 2 mysql mysql      4096  3月 19 23:04 2016 test
------------------------------

以下コマンドで不要ファイルを削除する。

# rm -f /var/lib/mysql/ibdata1
# rm -f /var/lib/mysql/ib_logfile*

4. MySQLを起動

# service mysqld start
------------------------------
mysqld を起動中:                                           [  OK  ]
------------------------------

5. Zabbix用のDBを再作成

DBを作り直し、zabbixユーザーに権限を付与しておく。

mysql> create database zabbix ;
------------------------------
Query OK, 1 row affected (0.00 sec)
------------------------------

mysql> grant all privileges on zabbix.* to zabbix@localhost ;
------------------------------
Query OK, 0 rows affected (0.00 sec)
------------------------------

6. リストア実施

mysqldumpのバックアップファイルをSQL文として、DBに流し込む。

# mysql -u root -p zabbix < /root/mysqldump_zabbix_20170528.sql

7. zabbix-serverの起動

zabbix-serverを起動する。

# service zabbix-server start
------------------------------
Starting zabbix server:                                    [  OK  ]
------------------------------

以上でリストアは完了。問題なくZabbixのGUIにログインできるはず。

以下はリストア後のグラフの表示となる。当たり前だが、バックアップ取得からリストアまでのデータは失われてしまうが、グラフが描画が正常に再開していることがわかる。