Se encuentra viendo la documentación de la versión en desarrollo, puede estar incompleta.
Únase a nuestro proyecto de traducción y ayude a traducir la documentación de Zabbix a su lengua materna.

3 Actualización de la base de datos a claves primarias

Descripción general

A partir de Zabbix 6.0, las claves primarias se utilizan para todas las tablas en nuevas instalaciones.

Esta sección proporciona instrucciones para actualizar manualmente las tablas de historial en instalaciones existentes a claves primarias.

Las instrucciones están disponibles para:

Notas importantes

  • Asegúrese de hacer una copia de seguridad de la base de datos antes de la actualización.
  • Si la base de datos utiliza particiones, comuníquese con el administrador de la base de datos o con el equipo de soporte de Zabbix para obtener ayuda.
  • Se recomienda encarecidamente detener el servidor Zabbix durante la actualización. Sin embargo, si es absolutamente necesario, existe una manera de realizar una actualización mientras el servidor está en ejecución (solo para MySQL, MariaDB y PostgreSQL sin TimescaleDB).
  • Los archivos CSV se pueden eliminar después de una actualización exitosa a claves primarias.
  • Opcionalmente, la interfaz de Zabbix se puede cambiar al modo de mantenimiento.
  • La actualización a claves primarias debe realizarse después de actualizar el servidor Zabbix a 6.0.
  • En el proxy, las tablas de historial que no se utilizan se pueden actualizar ejecutando history_pk_prepare.sql.

MySQL

La exportación y la importación se deben realizar en tmux/screen para garantizar que la sesión no se interrumpa.

Ver también: Notas importantes

MySQL 8.0+ con mysqlsh

Este método se puede utilizar con un servidor Zabbix en ejecución, pero se recomienda detener el servidor durante la actualización. MySQL Shell (mysqlsh) debe estar instalado y poder conectarse a la base de datos.

  • Inicie sesión en la consola MySQL como root (recomendado) o como cualquier usuario con privilegios de FILE.

  • Inicie MySQL con la variable local_infile habilitada.

  • Cambie el nombre de las tablas antiguas y cree tablas nuevas ejecutando history_pk_prepare.sql.

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
  • Exportar e importar datos.

Conéctese a través de mysqlsh. Si utiliza una conexión de socket, es posible que sea necesario especificar la ruta.

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

Ejecute (CSVPATH se puede cambiar según sea necesario):

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" });
  • Siga las [instrucciones posteriores a la migración] (#post-migration) para eliminar las tablas antiguas.

MariaDB/MySQL 8.0+ sin mysqlsh

Este método de actualización lleva más tiempo y debe usarse sólo si no es posible realizar una actualización con mysqlsh.

Actualización de tablas
  • Inicie sesión en la consola MySQL como root (recomendado) o cualquier usuario con privilegios de FILE.

  • Inicie MySQL con la variable local_infile habilitada.

  • Cambie el nombre de las tablas antiguas y cree tablas nuevas ejecutando history_pk_prepare.sql:

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
Migración con servidor detenido

max_execution_time debe estar deshabilitado antes de migrar datos para evitar el tiempo de espera durante la migración.

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;

Siga las instrucciones posteriores a la migración para eliminar las tablas antiguas.

Migración con el servidor en ejecución

Compruebe qué rutas están habilitadas para la importación/exportación:

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

Si el valor secure_file_priv es una ruta a un directorio, se realizará la exportación/importación para archivos en ese directorio. En este caso, edite las rutas a los archivos en las consultas en consecuencia o establezca el valor secure_file_priv en una cadena vacía durante el tiempo de actualización.

Si el valor secure_file_priv está vacío, exporte/importe se puede realizar desde cualquier lugar.

Si el valor de secure_file_priv es NULL, configúrelo en la ruta que contiene los datos de la tabla exportados ('/var/lib/mysql-files/' en el ejemplo anterior).

Para más información, ver Documentación de MySQL.

max_execution_time debe estar deshabilitado antes de exportar datos para evitar el tiempo de espera durante la exportación.

ESTABLECER @@max_execution_time=0;
       
       SELECCIONE * EN OUTFILE '/var/lib/mysql-files/history.csv' CAMPOS TERMINADOS POR ',' ESCAPADOS POR '"' LÍNEAS TERMINADAS POR '\n' FROM historial_old;
       CARGAR ARCHIVO DE DATOS '/var/lib/mysql-files/history.csv' IGNORAR EN LA TABLA CAMPOS del historial TERMINADOS POR ',' ESCAPADOS POR '"' LÍNEAS TERMINADAS POR '\n';
       
       SELECCIONE * EN OUTFILE '/var/lib/mysql-files/history_uint.csv' CAMPOS TERMINADOS POR ',' ESCAPADOS POR '"' LÍNEAS TERMINADAS POR '\n' FROM history_uint_old;
       CARGAR ARCHIVO DE DATOS '/var/lib/mysql-files/history_uint.csv' IGNORAR EN LA TABLA History_uint CAMPOS TERMINADOS POR ',' ESCAPADOS POR '"' LÍNEAS TERMINADAS POR '\n';
       
       SELECCIONE * EN OUTFILE '/var/lib/mysql-files/history_str.csv' CAMPOS TERMINADOS POR ',' ESCAPADOS POR '"' LÍNEAS TERMINADAS POR '\n' FROM history_str_old;
       CARGAR ARCHIVO DE DATOS '/var/lib/mysql-files/history_str.csv' IGNORAR EN LA TABLA History_str CAMPOS TERMINADOS POR ',' ESCAPADOS POR '"' LÍNEAS TERMINADAS POR '\n';
       
       SELECCIONE * EN OUTFILE '/var/lib/mysql-files/history_log.csv' CAMPOS TERMINADOS POR ',' ESCAPADOS POR '"' LÍNEAS TERMINADAS POR '\n' FROM history_log_old;
       CARGAR ARCHIVO DE DATOS '/var/lib/mysql-files/history_log.csv' IGNORAR EN LA TABLA History_log CAMPOS TERMINADOS POR ',' ESCAPADOS POR '"' LÍNEAS TERMINADAS POR '\n';
       
       SELECCIONE * EN OUTFILE '/var/lib/mysql-files/history_text.csv' CAMPOS TERMINADOS POR ',' ESCAPADOS POR '"' LÍNEAS TERMINADAS POR '\n' FROM historial_text_old;
       CARGAR ARCHIVO DE DATOS '/var/lib/mysql-files/history_text.csv' IGNORAR EN LA TABLA History_text CAMPOS TERMINADOS POR ',' ESCAPADOS POR '"' LÍNEAS TERMINADAS POR '\n';

Siga las instrucciones posteriores a la migración para eliminar las tablas antiguas.

PostgreSQL

La exportación y la importación se deben realizar en tmux/screen para garantizar que la sesión no se interrumpa. Para instalaciones con TimescaleDB, omita esta sección y continúe con PostgreSQL + TimescaleDB.

Ver también: Notas importantes

Actualización de tablas

  • Cambiar el nombre de las tablas usando history_pk_prepare.sql:
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_prepare.sql

Migración con servidor detenido

  • Exportar el historial actual, importarlo a la tabla temporal, luego inserte los datos en nuevas tablas ignorando los duplicados:
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;

Vea sugerencias para mejorar el rendimiento de INSERT: PostgreSQL: carga masiva de enormes cantidades de datos, Distancia del punto de control y cantidad de WAL.

  • Siga las [instrucciones posteriores a la migración] (#post-migration) para eliminar las tablas antiguas.

Migración con el servidor en ejecución

  • Exportar el historial actual, importarlo a la tabla temporal, luego inserte los datos en nuevas tablas ignorando los duplicados:
\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;
  • Siga las [instrucciones posteriores a la migración] (#post-migration) para eliminar las tablas antiguas.

PostgreSQL + Escala de tiempoDB

La exportación y la importación se deben realizar en tmux/screen para garantizar que la sesión no se interrumpa. El servidor Zabbix debería estar inactivo durante la actualización.

Ver también: Notas importantes

  • Cambiar el nombre de las tablas usando history_pk_prepare.sql.
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_prepare.sql
  • Ejecute scripts de migración hipertables de TimescaleDB (compatibles con las versiones TSDB v2.x y v1.x) según la configuración de compresión:
    • Si la compresión está habilitada (en la instalación predeterminada), ejecute scripts desde /usr/share/zabbix-sql-scripts/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 compresión está deshabilitada, ejecute scripts desde /usr/share/zabbix-sql-scripts/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

Consulte también: Consejos para mejorar el rendimiento de INSERT.

  • Siga las [instrucciones posteriores a la migración] (#post-migration) para eliminar las tablas antiguas.

Post-migración

Para todas las bases de datos, una vez completada la migración, haga lo siguiente:

  • Verificar que todo funcione como se esperaba.

  • Elimine tablas viejas:

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

See also