Zabbix 4.0からZabbix 6.0にデータを移行する手順について(その2):mariadb(zabbix)のデータリストアする手順(データエクスポートとインポート)
| 登録日 | :2024/03/27 04:03 |
|---|---|
| カテゴリ | :Linux |
Zabbix4.0からZabbix6.0にデータを移行するにあたり、mariadbのバージョンが5.5から10.5に上がる。このため、Zabbix4.0のデータをZabbix5.0へアップグレードしてから、Zabbix6.0へのアップグレードが必要となる。
0. 新しい環境の既存データ削除
Zabbixサーバを停止する。
systemctl stop zabbix-server.service
Zabbix6.0でデータベースの構築まで実施していたら、Zabbix4.0からデータを読み込むために一旦既存のデータベースを削除する。
データベースへログイン
[root@rockylinux_test_zabbix ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2225
Server version: 10.5.22-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
zabbixデータベースの削除
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| zabbix |
+--------------------+
4 rows in set (0.002 sec)
MariaDB [(none)]> drop database zabbix;
Query OK, 191 rows affected (1.819 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.000 sec)
MariaDB [(none)]>
zabbixユーザの削除。
MariaDB [(none)]> select user, host from mysql.user;
+-------------+-----------+
| User | Host |
+-------------+-----------+
| mariadb.sys | localhost |
| mysql | localhost |
| root | localhost |
| zabbix | localhost |
+-------------+-----------+
4 rows in set (0.043 sec)
MariaDB [(none)]> drop user zabbix@localhost;
Query OK, 0 rows affected (0.011 sec)
MariaDB [(none)]> select user, host from mysql.user;
+-------------+-----------+
| User | Host |
+-------------+-----------+
| mariadb.sys | localhost |
| mysql | localhost |
| root | localhost |
+-------------+-----------+
3 rows in set (0.003 sec)
MariaDB [(none)]> quit
Bye
[root@rockylinux_test_zabbix ~]#
1. Zabbixデータのエクスポート
旧サーバのデータベースをエクスポートする
passwordなし。gzipで圧縮あり。
mysqldump --opt --flush-logs --single-transaction --databases zabbix | gzip -9 > /root/zabbix.sql.gz
rootのパスワードを設定している場合(--password)
mysqldump --password --opt --flush-logs --single-transaction --databases
zabbix | gzip -9 > /root/zabbix.sql.gz
圧縮しない場合
mysqldump --password --opt --flush-logs --single-transaction --databases zabbix > /root/dump/zabbix.sql
2. zabbixデータ転送
旧サーバのデータを、新しいサーバへ転送する。
[root@localhost dump]# scp zabbix.sql.gz root@192.168.56.109:/root/share/
root@192.168.56.109's password:
zabbix.sql.gz
3. データベースのインポート
新しいサーバで、旧サーバのデータをインポートする。
データをインポートするには、innodb_strict_modeをOFFにする必要がある。
デフォルトでは、確認すると、OFFになっていない。
[root@localhost my.cnf.d]# mysql -uroot -p
MariaDB [(none)]> show variables like 'innodb_strict_mode';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| innodb_strict_mode | ON |
+--------------------+-------+
1 row in set (0.001 sec)
MariaDB [(none)]>
そこで、以下の手順でOFFにする
vi /etc/my.cnf.d/mariadb-server.cnf
以下の記述を追記する
[mariadb-10.5]
#2024.3.26
innodb_strict_mode=0
修正したら、mariadbをリスタートする
[root@localhost my.cnf.d]# systemctl restart mariadb
innodb_strict_modeがOFFになっていることを確認する。
[root@localhost my.cnf.d]# mysql -uroot -p
MariaDB [(none)]> show variables like 'innodb_strict_mode';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| innodb_strict_mode | OFF |
+--------------------+-------+
1 row in set (0.002 sec)
MariaDB [(none)]> quit
Bye
Zabbixユーザを作成する。(既存のデータベースがある場合は、削除する必要なかったようである)
[root@rockylinux_test_zabbix share]# mysql -u root -p
MariaDB [(none)]> create database zabbix character set utf8mb4 collate utf8mb4_bin;
MariaDB [(none)]> create user zabbix@localhost identified by 'password';
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost;
MariaDB [(none)]> set global log_bin_trust_function_creators = 1;
MariaDB [(none)]> quit;
Zabbix4.0のサーバからエクスポートしたデータベースを、Zabbix6.0のサーバでインポートする。
[root@localhost share]# zcat zabbix.sql.gz | mysql -u zabbix -p
Enter password:
[root@localhost share]#
4. データの変換
4.1 Zabbix5.0のデータに変換する
下記公式サイトから、Zabbix5.0に変換するスクリプト(utf8_convert.sql)を取得
https://www.zabbix.com/documentation/5.0/en/manual/appendix/install/db_charset_coll
DELIMITER $$
CREATE PROCEDURE zbx_convert_utf8 (
)
BEGIN
declare cmd varchar(255) default "";
declare finished integer default 0;
declare cur_command cursor for
SELECT command
FROM
(/* This 'select' statement deals with 'text' type columns to prevent
their automatic conversion into 'mediumtext' type.
The goal is to produce statements like
ALTER TABLE zabbix.hosts MODIFY COLUMN description text CHARACTER SET utf8 COLLATE utf8_bin not null;
*/
SELECT table_name AS sort1,
'A' AS sort2,
CONCAT('ALTER TABLE ', table_schema, '.', table_name,
' MODIFY COLUMN ', column_name, ' ', column_type,
' CHARACTER SET utf8 COLLATE utf8_bin',
case
when column_default is null then ''
else concat(' default ', column_default, ' ')
end,
case
when is_nullable = 'no' then ' not null '
else ''
end,
';') AS command
FROM information_schema.columns
WHERE table_schema = @ZABBIX_DATABASE
AND column_type = 'text'
UNION
/* This 'select' statement deals with setting character set and collation for
each table and converting varchar fields on a per-table basis.
It is necessary to process all tables (even those with numeric-only columns)
otherwise in future Zabbix upgrades text (e.g. varchar) columns may be added
to these tables or numeric columns can be turned into text ones and
the old character set/collation can reappear again.
The goal is to produce statements like
ALTER TABLE zabbix.hosts CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
*/
SELECT table_name AS sort1,
'B' AS sort2,
CONCAT('ALTER TABLE ', table_schema, '.', table_name,
' CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;') AS command
FROM information_schema.tables
WHERE table_schema = @ZABBIX_DATABASE) s
/* Sorting is important: 'MODIFY COLUMN' statements should precede 'CONVERT TO' ones
for each table. */
ORDER BY sort1, sort2;
declare continue handler for not found set finished = 1;
open cur_command;
cmd_loop: loop
fetch cur_command into cmd;
if finished = 1 then
leave cmd_loop;
end if;
SET @value = cmd;
PREPARE stmt FROM @value;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
end loop cmd_loop;
close cur_command;
END$$
DELIMITER ;
スクリプトを読み込んで、データの変換する。
[root@localhost share]# sudo mysql zabbix < utf8_convert.sql
[root@localhost share]# sudo mysql zabbix
MariaDB [zabbix]> SET @ZABBIX_DATABASE = 'zabbix';
MariaDB [zabbix]> CALL zbx_convert_utf8();
MariaDB [zabbix]> drop procedure zbx_convert_utf8;
MariaDB [zabbix]> quit
Bye
この時点で一度Zabbixサーバーを起動します。ログを確認して、データベースのマイグレーションが完了することを確認する。
[root@rockylinux_test_zabbix share]# sudo systemctl start zabbix-server
[root@rockylinux_test_zabbix share]# sudo tail -f /var/log/zabbix/zabbix_server.log
確認できたら、一旦zabbixを止める。
sudo systemctl stop zabbix-server
4.2 データベースとテーブルのutf8mb4化
Zabbix 6.0の以下の手順にしたがって、データベースとテーブルの文字コードをutf8mb4、参照順序をutf8mb4_binに変更する。
下記公式サイトの手順を行う。
https://www.zabbix.com/documentation/6.0/en/manual/appendix/install/db_charset_coll
確認したところ、私が今回実行したときは既にutf8mb4_binになっていたので、alterテーブルの手順はスキップする
[root@localhost share]# sudo mysql zabbix
MariaDB [zabbix]> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4 | utf8mb4_bin |
+--------------------------+----------------------+
1 row in set (0.000 sec)
MariaDB [zabbix]>
公式サイトからスクリプト(utf8mb4_convert.sql)をダウンロード
/* ChangeLog:
2020.08.19 - initial release
2020.09.04 - fixed syntax for running on MySQL
2022.01.13 - updated the script to use standard UTF8 instead of utf8mb3
*/
DELIMITER $$
CREATE PROCEDURE zbx_convert_utf8 (
)
BEGIN
declare cmd varchar(255) default "";
declare finished integer default 0;
declare cur_command cursor for
SELECT command
FROM
(/* This 'select' statement deals with 'text' type columns to prevent
their automatic conversion into 'mediumtext' type.
The goal is to produce statements like
ALTER TABLE zabbix.hosts MODIFY COLUMN description text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin not null;
*/
SELECT table_name AS sort1,
'A' AS sort2,
CONCAT('ALTER TABLE ', table_schema, '.', table_name,
' MODIFY COLUMN ', column_name, ' ', column_type,
' CHARACTER SET utf8mb4 COLLATE utf8mb4_bin',
case
when column_default is null then ''
else concat(' default ', column_default, ' ')
end,
case
when is_nullable = 'no' then ' not null '
else ''
end,
';') AS command
FROM information_schema.columns
WHERE table_schema = @ZABBIX_DATABASE
AND column_type = 'text'
UNION
/* This 'select' statement deals with setting character set and collation for
each table and converting varchar fields on a per-table basis.
It is necessary to process all tables (even those with numeric-only columns)
otherwise in future Zabbix upgrades text (e.g. varchar) columns may be added
to these tables or numeric columns can be turned into text ones and
the old character set/collation can reappear again.
The goal is to produce statements like
ALTER TABLE zabbix.hosts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
*/
SELECT table_name AS sort1,
'B' AS sort2,
CONCAT('ALTER TABLE ', table_schema, '.', table_name,
' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;') AS command
FROM information_schema.tables
WHERE table_schema = @ZABBIX_DATABASE) s
/* Sorting is important: 'MODIFY COLUMN' statements should precede 'CONVERT TO' ones
for each table. */
ORDER BY sort1, sort2;
declare continue handler for not found set finished = 1;
open cur_command;
cmd_loop: loop
fetch cur_command into cmd;
if finished = 1 then
leave cmd_loop;
end if;
SET @value = cmd;
PREPARE stmt FROM @value;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
end loop cmd_loop;
close cur_command;
END$$
DELIMITER ;
スクリプトを読み込んで、データベースを修正する。
[root@rockylinux_test_zabbix share]# sudo mysql zabbix < utf8mb4_convert.sql
[root@rockylinux_test_zabbix share]# sudo mysql zabbix
MariaDB [zabbix]> SET @ZABBIX_DATABASE = 'zabbix';
MariaDB [zabbix]> CALL zbx_convert_utf8();
MariaDB [zabbix]> drop procedure zbx_convert_utf8;
MariaDB [zabbix]> quit
Bye
変化とインポートが完了したら、mariadbの「log_bin_trust_function_creators = 0」に戻しておく。
[root@manage zabbix]# mysql -u root -p
Enter password:
MariaDB [(none)]> set global log_bin_trust_function_creators = 0;
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> quit;
Bye
[root@manage zabbix]#
5. Zabbixサーバ起動
Zabbix6.0サーバーを起動して、正常に起動することを確認する
$ sudo systemctl start zabbix-server
$ sudo tail -f /var/log/zabbix/zabbix_server.log
14697:20240325:203402.412 server #38 started [alert syncer #1]
14698:20240325:203402.413 server #39 started [history poller #1]
14699:20240325:203402.415 server #40 started [history poller #2]
14700:20240325:203402.416 server #41 started [history poller #3]
14701:20240325:203402.418 server #42 started [history poller #4]
14702:20240325:203402.420 server #43 started [history poller #5]
14703:20240325:203402.422 server #44 started [availability manager #1]
14704:20240325:203402.424 server #45 started [trigger housekeeper #1]
14705:20240325:203402.425 server #46 started [odbc poller #1]
14696:20240325:203402.432 server #37 started [icmp pinger #1]
WebでZabbixサーバにログインできること、およびデータが引き継がれていることを確認する。
私のテストではこれで成功した。
5 Appendix
本番環境でZabbix4.0のデータベースをZabbix6.0へ移行したときに苦戦した点を忘備録としてメモしておく。
5.1 データの移行は圧縮なしSQLがよい
本番環境のデータベースは1年以上、ネットワークスイッチのトラフィックなどを収集しており、およそ4.3GBほどであった。
このデータを読み込むためには、上記手順のようにzcatで圧縮ファイルを解凍しながら読み込ませる手順ではうまくいかずフリーズしてしまった。
そのため、一旦解凍を手動で行って圧縮なしのsqlファイルとして読み込ませるとよい。
この時、データの読み込みに時間がかかるため、pvコマンドを使うと、データの読み込み時間を視覚化できてよかった。
pvコマンドのインストールは以下の通り。
pvインストールサイト
wget https://www.ivarch.com/programs/sources/pv-1.8.5.tar.gz
tar xzf pv-1.8.5.tar.gz
cd pv-1.8.5
sh ./configure
make
sudo make install
pvコマンドを介してsqlを読み込ませるコマンドは以下の通り
pv zabbix.sql | mysql -u zabbix -p
56.6GB 1:07:32 [14.3MB/s] [========================>] 100%
5.2 ディスク容量を拡張する
私は、Vmwareを使ってRockyLinux8をインストールしてZabbixの環境構築を行っている。
インポートするZabbixのデータベースが大きすぎて、Vmwareで当初割り当てていたディスク領域では足りないことがわかった。
そこで、Vmwareで割り当てる領域を拡張し、Linux側のパーティションおよび論理ボリュームを拡張する必要があった。その手順は以下の通りで実施することができた。
VMWare Player とCentOS 8 の組み合わせを例にして、VMWare仮想マシン上のLinux LVM で使うディスク容量の増設の仕方
5.3 mariadbの再インストール
データベースの移行をして、何度か移行先のmariadbをクラッシュさせてしまい、にっちもさっちも行かなくなってしまった。
結果的に、原因として考えられたのは、旧Zabbix4.0で作成していたguestアカウントで、データ移行先のZabbix6.0にアクセスすることがきっかけのようであった。そのため旧Zabbix4.0でguestアカウントを無効化して再度データのダウンプおよび、Zabbix6.0への取り組みを行うことで安定して稼働する状況となった。
この時、mariadbを復旧するために再インストールをする必要があったので忘備録として手順をメモする。
先ず、mariadbのアンインストール。以下のコマンドで依存関係を含めていったん削除
dnf remove mariadb-server
パッケージをアンインストールしても、データファイルが残っている。
# cd /var/lib/mysql/
# ls -l
合計 188528
-rw-rw----. 1 mysql mysql 73728 3月 26 03:14 aria_log.00000001
-rw-rw----. 1 mysql mysql 52 3月 26 03:14 aria_log_control
-rw-rw----. 1 mysql mysql 9628 3月 25 16:51 ib_buffer_pool
-rw-rw----. 1 mysql mysql 100663296 3月 26 08:53 ib_logfile0
-rw-rw----. 1 mysql mysql 79691776 3月 25 20:32 ibdata1
-rw-rw----. 1 mysql mysql 12582912 3月 25 16:51 ibtmp1
-rw-rw----. 1 mysql mysql 0 3月 3 09:30 multi-master.info
drwx------. 2 mysql mysql 4096 3月 3 09:30 mysql
srwxrwxrwx. 1 mysql mysql 0 3月 25 16:51 mysql.sock
-rw-rw----. 1 mysql mysql 16 3月 3 09:30 mysql_upgrade_info
drwx------. 2 mysql mysql 20 3月 3 09:30 performance_schema
drwx------. 2 mysql mysql 12288 3月 25 20:32 zabbi
これらのフォルダは丸ごとリネームして退避する。(データ量が大きい場合は、当該フォルダを削除、もしくはib*ファイルのみを削除してもよい)
# rm -rf ib*
# mv /var/lib/mysql /var/lib/mysql.old
これで既存のmariadb環境の削除はできたので、以下の手順でmariadbの再インストールおよび10.5へのアップグレードを行う。
mariadbのインストール手順
mariadbの再インストール完了。
あとは、手順0に戻って、Zabbix4.0のデータベースをZabbix6.0にインストールする。
5.4 既存環境をダイレクトにアップグレードもできるらしい。
今更ながら、このようにデータ移行の手順をまとめておきながら、実は既存環境をそのままZabbix4.0からZabbix6.0へのアップグレードもできるらしい。以下の手順は試していないので確認はできていないけれども情報としてメモする。
Zabbix を 4.0 から 6.0 にアップグレードする
一方で、私の場合は、既存環境がCentOS7.9でありZabbixだけをバックアップしても問題があった。
そのため、OSのバージョンアップも含めて実施する必要があったので、今回のようにデータ移行の手順が必要であった。