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

3 Mise à niveau de la base de données vers les clés primaires

Aperçu

Depuis Zabbix 6.0, les clés primaires sont utilisées pour toutes les tables dans les nouvelles installations.

Cette section fournit des instructions pour mettre à niveau manuellement les tables d'historique des installations existantes vers les clés primaires.

Des instructions sont disponibles pour :

Les instructions fournies sur cette page sont destinées aux utilisateurs avancés. Notez que ces instructions doivent être adaptées à votre configuration spécifique.

Notes importantes

  • Assurez-vous de sauvegarder la base de données avant la mise à jour.
  • Si votre base de données utilise des partitions, contactez votre administrateur de base de données ou l'équipe de support Zabbix pour obtenir de l'aide.
  • L'arrêt du serveur Zabbix au moment de la mise à niveau est fortement recommandé. Cependant, si cela est absolument nécessaire, il existe un moyen d'effectuer une mise à niveau pendant que le serveur est en cours d'exécution (uniquement pour MySQL, MariaDB et PostgreSQL sans TimescaleDB).
  • Les fichiers CSV peuvent être supprimés après une mise à jour réussie vers les clés primaires.
  • En option, l'interface Zabbix peut être basculée en mode maintenance
  • La mise à jour vers les clés primaires ne doit être effectuée qu'après la mise à niveau du serveur Zabbix vers la version 6.0.
  • Sur un proxy, history_pk_prepare.sql peut être exécuté pour mettre à jour les tables d'historique (qui ne sont pas utilisées) en clés primaires.

MySQL

L'exportation et l'importation doivent être effectuées dans tmux/screen pour s'assurer que la session n'est pas abandonnée.

Voir également : Notes importantes

MySQL 8.0+ avec mysqlsh

Cette méthode peut être utilisée avec un serveur Zabbix en cours d'exécution, mais il est recommandé d'arrêter le serveur pendant la mise à niveau. Le Shell MySQL (mysqlsh) doit être installé et capable de se connecter à la BDD.

  • Se connecter à la console MySQL en tant que root (recommandé) ou en tant qu'utilisateur disposant des privilèges FILE.

  • Démarrer MySQL avec la variable local_infile activée.

  • Renommer les anciennes tables et créer de nouvelles tables en exécutant history_pk_prepare.sql.

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
  • Exporter et importer des données.

Se connecter via mysqlsh. Si vous utilisez une connexion socket, il peut être nécessaire de spécifier le chemin.

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

Exécuter (CSVPATH peut être modifié si nécessaire) :

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

MariaDB/MySQL 8.0+ sans mysqlsh

Cette méthode de mise à niveau prend plus de temps et ne doit être utilisée que si une mise à niveau avec mysqlsh n'est pas possible.

Mise à niveau des tables
  • Connectez vous à la console MySQL en tant que root (recommandé) ou tout utilisateur disposant des privilèges FILE.

  • Démarrez MySQL avec la variable local_infile activée.

  • Renommez les anciennes tables et créer de nouvelles tables en exécutant history_pk_prepare.sql :

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
Migration avec serveur arrêté

max_execution_time doit être désactivé avant la migration des données pour éviter l'expiration du délai pendant la migration.

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;

Suivez les instructions post-migration pour supprimer les anciennes tables.

Migration avec serveur en cours d'exécution

Vérifiez pour quels chemins l'import/export est activé :

mysql> SELECT @@secure_file_priv;
       +-----------------------+
       | @@secure_file_priv    |
       +-----------------------+
       | /var/lib/mysql-files/ |
       +-----------------------+

Si la valeur secure_file_priv est un chemin d'accès à un répertoire, l'exportation/importation sera effectuée pour les fichiers de ce répertoire. Dans ce cas, modifiez les chemins d'accès aux fichiers dans les requêtes en conséquence ou définir la valeur secure_file_priv sur une chaîne vide pour la mise à niveau.

Si la valeur secure_file_priv est vide, l'exportation/importation peut être effectuée à partir de n'importe quel emplacement.

Si la valeur secure_file_priv est NULL, la définir sur le chemin contenant les données de table exportées ('/var/lib/mysql-files/' dans l'exemple ci-dessus).

Pour plus d'informations, consulter la documentation MySQL.

max_execution_time doit être désactivé avant d'exporter des données pour éviter un délai d'attente lors de l'exportation.

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';

Suivez les instructions post-migration pour supprimer les anciennes tables.

PostgreSQL

L'exportation et l'importation doivent être effectuées dans tmux/screen pour s'assurer que la session n'est pas abandonnée. Pour les installations avec TimescaleDB, ignorez cette section et passez à PostgreSQL + TimescaleDB.

Voir également : Notes importantes

Mise à niveau des tables

  • Renommer les tables en utilisant history_pk_prepare.sql :
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_prepare.sql

Migration avec serveur arrêté

  • Exporter l'historique actuel, importez-le dans la table temporaire, puis insérer les données dans de nouvelles tables en ignorant les doublons :
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;

Consulter les conseils pour améliorer les performances d'INSERT : PostgreSQL: Bulk Loading Huge Amounts of Data, Checkpoint Distance and Amount of WAL.

Migration avec serveur en cours d'exécution

  • Exporter l'historique actuel, importez le dans la table temporaire, puis insérez les données dans de nouvelles tables en ignorant les doublons :
\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

L'exportation et l'importation doivent être effectuées dans tmux/screen pour s'assurer que la session n'est pas abandonnée. Le serveur Zabbix devrait être en panne pendant la mise à niveau.

Voir également: Notes importantes

  • Renommer les tables en utilisant history_pk_prepare.sql.
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_prepare.sql
  • Exécuter les scripts de migration d'hypertables TimescaleDB (compatibles avec les versions TSDB v2.x et v1.x) en fonction des paramètres de compression :
    • Si la compression est activée (sur l'installation par défaut), exécuter les scripts à partir de 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
    • Si la compression est désactivée exécuter les scripts à partir de database/postgresql/tsdb_history_pk_upgrade_no_compression:

      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

Voir également : Astuces pour améliorer les performances d'INSERT.

Oracle

L'exportation et l'importation doivent être effectuées dans tmux/screen pour s'assurer que la session n'est pas abandonnée. Le serveur Zabbix doit être arrêté pendant la mise à niveau.

Voir également : Notes importantes

Mise à niveau des tables

Voir la documentation Oracle Data Pump pour obtenir des conseils sur les performances.

  • Renommer les tables en utilisant history_pk_prepare.sql.
cd /usr/share/zabbix/zabbix-sql-scripts/database/oracle
       sqlplus zabbix/password@oracle_host/service
       sqlplus> @history_pk_prepare.sql

Migration par lots des tables d'historique

  • Préparez les répertoires pour le Data Pump.

Le Data Pump doit disposer d'autorisations de lecture et d'écriture sur ces répertoires.

Exemple:

mkdir -pv /export/history
       chown -R oracle:oracle /export
  • Créez un objet répertoire et accordez des autorisations de lecture et d'écriture sur cet objet à l'utilisateur utilisé pour l'authentification Zabbix ('zabbix' dans l'exemple ci-dessous). Sous le rôle sysdba, exécutez :
create directory history as '/export/history';
       grant read,write on directory history to zabbix;
  • Exportez les tables. Remplacez N par le nombre de fils souhaité.
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
  • Importer les tableaux. Remplacez N par le nombre de fils souhaité.
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

Migration individuelle des tables d'historique

  • Préparer des répertoires pour Data Pump pour chaque table d'historique. Data Pump doit disposer d'autorisations de lecture et d'écriture sur ces répertoires.

Exemple :

mkdir -pv /export/history /export/history_uint /export/history_str /export/history_log /export/history_text
       chown -R oracle:oracle /export
  • Créer un objet répertoire et accorder des autorisations de lecture et d'écriture sur cet objet à l'utilisateur utilisé pour l'authentification Zabbix ("zabbix" dans l'exemple ci-dessous). Sous le rôle sysdba, exécuter :
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;
  • Exporter et importer chaque table. Remplacer N par le nombre de thread souhaité.
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

Post-migration

Pour toutes les bases de données, une fois la migration terminée, procéder comme suit :

  • Vérifier que tout fonctionne comme prévu.

  • Supprimer les anciennes tables :

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