This is a translation of the original English documentation page. Help us make it better.

3 データベースの主キーのアップグレード

概要

Zabbix 6.0以降、新規インストールではすべてのテーブルに主キーが使用されます。

このセクションでは既存の履歴テーブルを主キー使用に手動でアップグレードする手順について説明します。

手順は次のとおりです。

The instructions provided on this page are designed for advanced users. Note that these instructions might need to be adjusted for your specific configuration.

重要事項

  • アップグレードの前に、必ずデータベースをバックアップしてください。
  • データベースがパーティションを使用している場合は、DB 管理者または Zabbix サポート チームにお問い合わせください。
  • アップグレード中は Zabbix サーバーを停止することを強くお勧めします。 ただし、どうしても必要な場合には、サーバー実行中にアップグレードを実行する方法があります (TimescaleDB を使用しない MySQL、MariaDB、および PostgreSQL のみ)。
  • CSV ファイルは、プライマリ キーへのアップグレードが成功した後に削除できます。
  • 必要に応じて、Zabbix フロントエンドを メンテナンス モード に切り替えることができます。
  • Zabbix サーバーを 6.0 にアップグレードした後、主キーへのアップグレードを行う必要があります。
  • プロキシでは、使用されていない履歴テーブルは history_pk_prepare.sql を実行してアップグレードできます。

MySQL

セッションがドロップされないように、エクスポートとインポートは tmux/screen で実行する必要があります。

参照: 重要事項

mysqlsh を使用した MySQL 8.0+

この方法は実行中の Zabbix サーバーで使用できますが、アップグレード中はサーバーを停止することをお勧めします。 MySQL シェル (mysqlsh) が インストールされ、DB に接続できる必要があります。

  • root (推奨) または FILE 権限を持つ任意のユーザーとして MySQL コンソールにログインします。

  • local_infile 変数を有効にして MySQL を起動します。

  • history_pk_prepare.sql を実行して、古いテーブルの名前を変更し、新しいテーブルを作成します。

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
  • データのエクスポートとインポート

mysqlsh 経由で接続します。 ソケット接続を使用している場合は、パスの指定が必要になる場合があります。

sudo mysqlsh -uroot -S /run/mysqld/mysqld.sock --no-password -Dzabbix

実行(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" });

mysqlsh を使用しない MariaDB/MySQL 8.0+

このアップグレード方法は時間がかかるため、mysqlsh によるアップグレードが不可能な場合にのみ使用してください。

テーブルアップグレード
  • root (推奨) または FILE 権限を持つ任意のユーザーとして MySQL コンソールにログインします。

  • local_infile 変数を有効にして MySQL を起動します。

  • history_pk_prepare.sql を実行して、古いテーブルの名前を変更し、新しいテーブルを作成します。

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
停止したサーバーで移行

移行中のタイムアウトを避けるために、データを移行する前に max_execution_time を無効にする必要があります。

SET @@max_execution_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 ドキュメント を参照してください。

エクスポート中のタイムアウトを避けるため、データをエクスポートする前に max_execution_time を無効にする必要があります。

SET @@max_execution_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_pk_prepare.sql を使用してテーブルの名前を変更します。
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_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: 膨大な量のデータの一括読み込みチェックポイント距離 および 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_pk_prepare.sql を使用してテーブルの名前を変更します。
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_prepare.sql
  • 圧縮設定に基づいて、TimescaleDB ハイパーテーブル移行スクリプト (TSDB v2.x と v1.x の両方のバージョンと互換性があります) を実行します。
    • 圧縮が有効になっている場合 (デフォルトインストール)database/postgresql/tsdb_history_pk_upgrade_with_compression からスクリプトを実行します。
    cat /usr/share/zabbix-sql-scripts/postgresql/tsdb_history_pk_upgrade_with_compression/history_pk.sql | sudo -u zabbix psql zabbix
           cat /usr/share/zabbix-sql-scripts/postgresql/tsdb_history_pk_upgrade_with_compression/history_pk_uint.sql | sudo -u zabbix psql zabbix
           cat /usr/share/zabbix-sql-scripts/postgresql/tsdb_history_pk_upgrade_with_compression/history_pk_log.sql | sudo -u zabbix psql zabbix
           cat /usr/share/zabbix-sql-scripts/postgresql/tsdb_history_pk_upgrade_with_compression/history_pk_str.sql | sudo -u zabbix psql zabbix
           cat /usr/share/zabbix-sql-scripts/postgresql/tsdb_history_pk_upgrade_with_compression/history_pk_text.sql | sudo -u zabbix psql zabbix
  • 圧縮が無効になっている場合は、database/postgresql/tsdb_history_pk_upgrade_no_compression からスクリプトを実行します {.bash} cat /usr/share/zabbix-sql-scripts/postgresql/tsdb_history_pk_upgrade_no_compression/history_pk.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix-sql-scripts/postgresql/tsdb_history_pk_upgrade_no_compression/history_pk_uint.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix-sql-scripts/postgresql/tsdb_history_pk_upgrade_no_compression/history_pk_log.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix-sql-scripts/postgresql/tsdb_history_pk_upgrade_no_compression/history_pk_str.sql | sudo -u zabbix psql zabbix cat /usr/share/zabbix-sql-scripts/postgresql/tsdb_history_pk_upgrade_no_compression/history_pk_text.sql | sudo -u zabbix psql zabbix

INSERT のパフォーマンスを向上させるための ヒント も参照してください。

Oracle

セッションがドロップされないように、エクスポートとインポートは tmux/screen で実行する必要があります。 アップグレード中は、Zabbix サーバーがダウンしている必要があります。

参照:重要事項

テーブルのアップグレード

パフォーマンスのヒントについては、Oracle Data Pump ドキュメントを参照してください。

  • history_pk_prepare.sql を使用してテーブルの名前を変更します。
cd /usr/share/zabbix/zabbix-sql-scripts/database/oracle
       sqlplus zabbix/password@oracle_host/service
       sqlplus> @history_pk_prepare.sql

ヒストリテーブルの一括移行

  • Data Pump 用のディレクトリを準備します。

Data Pump には、これらのディレクトリに対する読み取り権限と書き込み権限が必要です。

例:

mkdir -pv /export/history
       chown -R oracle:oracle /export
  • ディレクトリ オブジェクトを作成し、Zabbix 認証に使用するユーザー (以下の例では'zabbix') に、このオブジェクトへの読み取りと書き込みのアクセス許可を付与します。 sysdba ロールの下で、次を実行します。
create directory history as '/export/history';
       grant read,write on directory history to zabbix;
  • テーブルをエクスポートします。 N を目的のスレッド数に置き換えます。
expdp zabbix/password@oracle_host/service \
           DIRECTORY=history \
           TABLES=history_old,history_uint_old,history_str_old,history_log_old,history_text_old \
           PARALLEL=N
  • テーブルをインポートします。 N を目的のスレッド数に置き換えます。
impdp zabbix/password@oracle_host/service \
           DIRECTORY=history \
           TABLES=history_uint_old \
        REMAP_TABLE=history_old:history,history_uint_old:history_uint,history_str_old:history_str,history_log_old:history_log,history_text_old:history_text \
           data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND  PARALLEL=N CONTENT=data_only

ヒストリテーブルの個別移行

  • ヒストリテーブルごとにData Pump用のディレクトリを用意してください。 Data Pump には、これらのディレクトリに対する読み取り権限と書き込み権限が必要です。

例:

mkdir -pv /export/history /export/history_uint /export/history_str /export/history_log /export/history_text
       chown -R oracle:oracle /export
  • ディレクトリ オブジェクトを作成し、Zabbix 認証に使用するユーザー (以下の例では'zabbix') に、このオブジェクトへの読み取りおよび書き込み権限を付与します。 sysdba ロールの下で、次を実行します。
create directory history as '/export/history';
       grant read,write on directory history to zabbix;
       
       create directory history_uint as '/export/history_uint';
       grant read,write on directory history_uint to zabbix;
       
       create directory history_str as '/export/history_str';
       grant read,write on directory history_str to zabbix;
       
       create directory history_log as '/export/history_log';
       grant read,write on directory history_log to zabbix;
       
       create directory history_text as '/export/history_text';
       grant read,write on directory history_text to zabbix;
  • 各テーブルをエクスポートおよびインポートします。 N を目的のスレッド数に置き換えます。
expdp zabbix/password@oracle_host:1521/xe DIRECTORY=history TABLES=history_old PARALLEL=N
       
       impdp zabbix/password@oracle_host:1521/xe DIRECTORY=history TABLES=history_old REMAP_TABLE=history_old:history data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND PARALLEL=N CONTENT=data_only
       
       expdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_uint TABLES=history_uint_old PARALLEL=N
       
       impdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_uint TABLES=history_uint_old REMAP_TABLE=history_uint_old:history_uint data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND PARALLEL=N CONTENT=data_only
       
       expdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_str TABLES=history_str_old PARALLEL=N
       
       impdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_str TABLES=history_str_old REMAP_TABLE=history_str_old:history_str data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND PARALLEL=N CONTENT=data_only
       
       expdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_log TABLES=history_log_old PARALLEL=N
       
       impdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_log TABLES=history_log_old REMAP_TABLE=history_log_old:history_log data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND PARALLEL=N CONTENT=data_only
       
       expdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_text TABLES=history_text_old PARALLEL=N
       
       impdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_text TABLES=history_text_old REMAP_TABLE=history_text_old:history_text data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND PARALLEL=N CONTENT=data_only

移行後の手順

すべてのデータベースで、移行完了後に次の手順を実施します。

  • すべてが想定どおりに機能することを確認します。

  • 古いテーブルを削除:

DROP TABLE history_old;
       DROP TABLE history_uint_old;
       DROP TABLE history_str_old;
       DROP TABLE history_log_old;
       DROP TABLE history_text_old;