KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

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のバージョンアップも含めて実施する必要があったので、今回のようにデータ移行の手順が必要であった。