3 データベースのアップグレードを主キーへ
概要
このセクションでは、既存のインストール環境において、テーブルを手動で主キー対応にアップグレードするための手順を説明します。
主キーへのアップグレードにより、データのインデックス作成およびアクセス方法が最適化され、クエリの高速化や容量の節約につながる場合があります。 また、クラスタ構成におけるデータ管理と同期も改善されるため、スケーリングが容易になり、一部のサーバーに障害が発生した場合でもシステムの信頼性を維持しやすくなります。
このページで提供される手順は上級ユーザー向けに設計されており、環境固有の設定に応じて調整が必要になる場合があります。 主キーへのアップグレードは、時間がかかり、多くのリソースを消費する可能性があります。 十分な空きディスク容量があることを確認してください。データベースのサイズや保存されているデータ量によっては、この処理に履歴テーブルで現在使用している容量の最大2.5倍の空き領域が必要になる場合があります。
Zabbix 6.0以降、新規インストールではすべてのテーブルで主キーが使用されています。
データベースを主キー対応に自動アップグレードする機能はありませんが、既存のインストール環境では、Zabbixサーバーを6.0以降にアップグレードした後に手動でアップグレードできます。
Zabbix 7.0以降では、テーブルを主キー対応にアップグレードすると、テーブルは倍精度浮動小数点データ型を使用するようにもアップグレードされます。
Zabbix 7.0(またはそれ以降)を使用している場合、テーブルはすでに倍精度浮動小数点を使用しています。
ただし、このページの手順に従って、すでに倍精度浮動小数点を使用しているテーブルに影響を与えることなく、主キー対応へのアップグレードを実行できます。
Zabbix 6.4(またはそれ以前)を使用している場合は、まずテーブルを倍精度浮動小数点対応にアップグレードすることを検討してください。
詳細については、Zabbix 7.0ドキュメントの拡張範囲の数値へのアップグレードを参照してください。
以下の手順を利用できます。
重要な注意事項
データベースのアップグレードを実行するには、次の手順に従ってください。
- Zabbixサーバーを停止します。
アップグレード中はZabbixサーバーを停止することを強く推奨します。 ただし、どうしても必要な場合は、サーバーの稼働中にアップグレードを実行することもできます(MySQL、MariaDB、および TimescaleDB を使用しない PostgreSQL の場合のみ)。
- データベースをバックアップします。
- ご利用の Zabbix バージョンと互換性のある最新の zabbix-sql-scripts パッケージをインストールします(例: RHEL の場合:
dnf install zabbix-sql-scripts)。 - 使用しているデータベース用のスクリプトを実行します。
- Zabbixサーバーを起動します。
スクリプトはサーバーデータベースに対してのみ実行してください。 このアップグレードによるメリットはプロキシにはありません。
データベースでパーティションを使用している場合は、DB 管理者または Zabbix サポートに問い合わせてください。
プライマリキーへのアップグレードが正常に完了した後、CSV ファイルは削除できます。
必要に応じて、Zabbix Webインターフェースをメンテナンスモードに切り替えることができます。
MySQL
セッションがドロップされないように、エクスポートとインポートは tmux/screen で実行する必要があります。
参照: 重要事項
mysqlsh を使用した MySQL 8.0+
この方法は稼働中のZabbixサーバーでも使用できますが、アップグレード中はサーバーを停止することを推奨します。
MySQL Shell (mysqlsh) はインストールされており、DB に接続できる必要があります。
-
root として(推奨)、または FILE 権限を持つ任意のユーザーとして MySQL コンソールにログインします。
-
local_infile 変数を有効にして MySQL を起動します。
-
history_upgrade_prepare.sqlを実行して、古いテーブルの名前を変更し、新しいテーブルを作成します。
mysql -uzabbix -p<password> zabbix < /usr/share/zabbix/sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
- データをエクスポートしてインポートします。
mysqlsh 経由で接続します。ソケット接続を使用する場合は、パスの指定が必要になることがあります。
sudo mysqlsh -uroot -S /run/mysqld/mysqld.sock --no-password -Dzabbix
次のコマンドで JavaScript モードに切り替えます。
\js
次に、以下のコードを実行します(CSVPATH は必要に応じて変更できます)。
CSVPATH="/var/lib/mysql-files";
util.exportTable("history_old", CSVPATH + "/history.csv", { dialect: "csv" });
util.importTable(CSVPATH + "/history.csv", {"dialect": "csv", "table": "history" });
util.exportTable("history_uint_old", CSVPATH + "/history_uint.csv", { dialect: "csv" });
util.importTable(CSVPATH + "/history_uint.csv", {"dialect": "csv", "table": "history_uint" });
util.exportTable("history_str_old", CSVPATH + "/history_str.csv", { dialect: "csv" });
util.importTable(CSVPATH + "/history_str.csv", {"dialect": "csv", "table": "history_str" });
util.exportTable("history_log_old", CSVPATH + "/history_log.csv", { dialect: "csv" });
util.importTable(CSVPATH + "/history_log.csv", {"dialect": "csv", "table": "history_log" });
util.exportTable("history_text_old", CSVPATH + "/history_text.csv", { dialect: "csv" });
util.importTable(CSVPATH + "/history_text.csv", {"dialect": "csv", "table": "history_text" });
"JavaScript is not supported" というメッセージが表示される場合は、MySQL Shell のインストールに JS サポートが含まれていません。
その場合は、JavaScript モードが有効になるように、Oracle の公式 MySQL Shell package をインストールするか(またはソースからビルドしてください)。
- 古いテーブルを削除するには、移行後の手順 に従ってください。
mysqlsh を使用しない MariaDB/MySQL 8.0+
このアップグレード方法はより時間がかかるため、mysqlsh を使用したアップグレードが不可能な場合にのみ使用してください。
テーブルのアップグレード
-
root(推奨)または FILE 権限を持つ任意のユーザーとして MySQL コンソールにログインします。
-
実行中の Zabbix サーバーで移行を実施する場合は、local_infile 変数を有効にして MySQL を起動します。
-
history_upgrade_prepare.sqlを実行して、古いテーブルの名前を変更し、新しいテーブルを作成します。
mysql -uzabbix -p<password> zabbix < /usr/share/zabbix/sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
サーバー停止中の移行
移行中のタイムアウトを回避するため、データを移行する前に max_execution_time(MySQL の場合)または max_statement_time(MariaDB の場合)を無効にする必要があります。
MySQL の場合:
SET @@max_execution_time=0;
MariaDB の場合:
SET @@max_statement_time=0;
INSERT IGNORE INTO history SELECT * FROM history_old;
INSERT IGNORE INTO history_uint SELECT * FROM history_uint_old;
INSERT IGNORE INTO history_str SELECT * FROM history_str_old;
INSERT IGNORE INTO history_log SELECT * FROM history_log_old;
INSERT IGNORE INTO history_text SELECT * FROM history_text_old;
古いテーブルを削除するには、移行後の手順 に従ってください。
サーバー実行中の移行
インポート/エクスポートがどのパスで有効になっているかを確認します。
mysql> SELECT @@secure_file_priv;
+-----------------------+
| @@secure_file_priv |
+-----------------------+
| /var/lib/mysql-files/ |
+-----------------------+
secure_file_priv の値がディレクトリへのパスである場合、そのディレクトリ内のファイルに対してエクスポート/インポートが実行されます。
この場合は、クエリ内のファイルパスをそれに応じて編集するか、アップグレード中のみ secure_file_priv の値を空文字列に設定してください。
secure_file_priv の値が空の場合、任意の場所からエクスポート/インポートを実行できます。
secure_file_priv の値が NULL の場合は、エクスポートされたテーブルデータを含むパスに設定してください(上記の例では '/var/lib/mysql-files/')。
詳細については、MySQL documentation または MariaDB documentation を参照してください。
エクスポート中のタイムアウトを回避するため、データをエクスポートする前に max_execution_time(MySQL の場合)または max_statement_time(MariaDB の場合)を無効にする必要があります。
MySQL の場合:
SET @@max_execution_time=0;
MariaDB の場合:
SET @@max_statement_time=0;
SELECT * INTO OUTFILE '/var/lib/mysql-files/history.csv' FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n' FROM history_old;
LOAD DATA INFILE '/var/lib/mysql-files/history.csv' IGNORE INTO TABLE history FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n';
SELECT * INTO OUTFILE '/var/lib/mysql-files/history_uint.csv' FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n' FROM history_uint_old;
LOAD DATA INFILE '/var/lib/mysql-files/history_uint.csv' IGNORE INTO TABLE history_uint FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n';
SELECT * INTO OUTFILE '/var/lib/mysql-files/history_str.csv' FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n' FROM history_str_old;
LOAD DATA INFILE '/var/lib/mysql-files/history_str.csv' IGNORE INTO TABLE history_str FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n';
SELECT * INTO OUTFILE '/var/lib/mysql-files/history_log.csv' FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n' FROM history_log_old;
LOAD DATA INFILE '/var/lib/mysql-files/history_log.csv' IGNORE INTO TABLE history_log FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n';
SELECT * INTO OUTFILE '/var/lib/mysql-files/history_text.csv' FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n' FROM history_text_old;
LOAD DATA INFILE '/var/lib/mysql-files/history_text.csv' IGNORE INTO TABLE history_text FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n';
古いテーブルを削除するには、移行後の手順 に従ってください。
PostgreSQL
セッションが切断されないようにするため、エクスポートおよびインポートは tmux/screen 上で実行する必要があります。 TimescaleDB を使用するインストールでは、このセクションをスキップして PostgreSQL + TimescaleDB に進んでください。
参照: 重要な注意事項
テーブルのアップグレード
history_upgrade_prepare.sqlを使用してテーブル名を変更します:
sudo -u zabbix psql zabbix < /usr/share/zabbix/sql-scripts/postgresql/option-patches/history_upgrade_prepare.sql
サーバー停止中の移行
- 現在の履歴をエクスポートし、一時テーブルにインポートしてから、重複を無視しながら新しいテーブルにデータを挿入します:
INSERT INTO history SELECT * FROM history_old ON CONFLICT (itemid,clock,ns) DO NOTHING;
INSERT INTO history_uint SELECT * FROM history_uint_old ON CONFLICT (itemid,clock,ns) DO NOTHING;
INSERT INTO history_str SELECT * FROM history_str_old ON CONFLICT (itemid,clock,ns) DO NOTHING;
INSERT INTO history_log SELECT * FROM history_log_old ON CONFLICT (itemid,clock,ns) DO NOTHING;
INSERT INTO history_text SELECT * FROM history_text_old ON CONFLICT (itemid,clock,ns) DO NOTHING;
INSERT のパフォーマンス向上に関するヒントも参照してください: PostgreSQL: Bulk Loading Huge Amounts of Data, Checkpoint Distance and Amount of WAL.
- 古いテーブルを削除するには、移行後の手順 に従ってください。
実行中のサーバーでの移行
- 現在の履歴をエクスポートし、一時テーブルにインポートしてから、重複を無視して新しいテーブルにデータを挿入します:
\copy history_old TO '/tmp/history.csv' DELIMITER ',' CSV
CREATE TEMP TABLE temp_history (
itemid bigint NOT NULL,
clock integer DEFAULT '0' NOT NULL,
value DOUBLE PRECISION DEFAULT '0.0000' NOT NULL,
ns integer DEFAULT '0' NOT NULL
);
\copy temp_history FROM '/tmp/history.csv' DELIMITER ',' CSV
INSERT INTO history SELECT * FROM temp_history ON CONFLICT (itemid,clock,ns) DO NOTHING;
\copy history_uint_old TO '/tmp/history_uint.csv' DELIMITER ',' CSV
CREATE TEMP TABLE temp_history_uint (
itemid bigint NOT NULL,
clock integer DEFAULT '0' NOT NULL,
value numeric(20) DEFAULT '0' NOT NULL,
ns integer DEFAULT '0' NOT NULL
);
\copy temp_history_uint FROM '/tmp/history_uint.csv' DELIMITER ',' CSV
INSERT INTO history_uint SELECT * FROM temp_history_uint ON CONFLICT (itemid,clock,ns) DO NOTHING;
\copy history_str_old TO '/tmp/history_str.csv' DELIMITER ',' CSV
CREATE TEMP TABLE temp_history_str (
itemid bigint NOT NULL,
clock integer DEFAULT '0' NOT NULL,
value varchar(255) DEFAULT '' NOT NULL,
ns integer DEFAULT '0' NOT NULL
);
\copy temp_history_str FROM '/tmp/history_str.csv' DELIMITER ',' CSV
INSERT INTO history_str (itemid,clock,value,ns) SELECT * FROM temp_history_str ON CONFLICT (itemid,clock,ns) DO NOTHING;
\copy history_log_old TO '/tmp/history_log.csv' DELIMITER ',' CSV
CREATE TEMP TABLE temp_history_log (
itemid bigint NOT NULL,
clock integer DEFAULT '0' NOT NULL,
timestamp integer DEFAULT '0' NOT NULL,
source varchar(64) DEFAULT '' NOT NULL,
severity integer DEFAULT '0' NOT NULL,
value text DEFAULT '' NOT NULL,
logeventid integer DEFAULT '0' NOT NULL,
ns integer DEFAULT '0' NOT NULL
);
\copy temp_history_log FROM '/tmp/history_log.csv' DELIMITER ',' CSV
INSERT INTO history_log SELECT * FROM temp_history_log ON CONFLICT (itemid,clock,ns) DO NOTHING;
\copy history_text_old TO '/tmp/history_text.csv' DELIMITER ',' CSV
CREATE TEMP TABLE temp_history_text (
itemid bigint NOT NULL,
clock integer DEFAULT '0' NOT NULL,
value text DEFAULT '' NOT NULL,
ns integer DEFAULT '0' NOT NULL
);
\copy temp_history_text FROM '/tmp/history_text.csv' DELIMITER ',' CSV
INSERT INTO history_text SELECT * FROM temp_history_text ON CONFLICT (itemid,clock,ns) DO NOTHING;
- 古いテーブルを削除するには、移行後の手順 に従ってください。
PostgreSQL + TimescaleDB
セッションが切断されないようにするため、エクスポートおよびインポートは tmux/screen で実行する必要があります。 アップグレード中はZabbixサーバーを停止しておく必要があります。
参照: 重要な注意事項
-
history_upgrade_prepare.sqlを使用してテーブル名を変更します。- 圧縮が有効な場合(デフォルトのインストール)、
/usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compressionのスクリプトを実行します:cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_prepare.sql | sudo -u zabbix psql zabbix - 圧縮が無効な場合は、
/usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compressionのスクリプトを実行します:cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_prepare.sql | sudo -u zabbix psql zabbix
- 圧縮が有効な場合(デフォルトのインストール)、
-
圧縮設定に応じて TimescaleDB の hypertable 移行スクリプトを実行します:
- 圧縮が有効な場合(デフォルトのインストール)、
/usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compressionのスクリプトを実行します:cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_uint.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_log.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_str.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_text.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression/trends_upgrade.sql | sudo -u zabbix psql zabbix - 圧縮が無効な場合は、
/usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compressionのスクリプトを実行します:cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_uint.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_log.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_str.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_text.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression/trends_upgrade.sql | sudo -u zabbix psql zabbix
- 圧縮が有効な場合(デフォルトのインストール)、
参照: INSERT パフォーマンスを改善するための ヒント。
- 古いテーブルを削除するには、移行後の手順 に従ってください。
移行後
すべてのデータベースについて、移行が完了したら次の作業を行ってください。
-
すべてが想定どおりに動作することを確認します。
-
古いテーブルを削除します。
DROP TABLE history_old;
DROP TABLE history_uint_old;
DROP TABLE history_str_old;
DROP TABLE history_log_old;
DROP TABLE history_text_old;
- TimescaleDB の場合は、次の古いテーブルも削除します。
DROP TABLE trends_old;