Esta sección proporciona instrucciones para actualizar manualmente las tablas en instalaciones existentes a claves principales.
La actualización a claves principales optimiza la forma en que se indexan y se accede a los datos, lo que puede acelerar las consultas y ahorrar espacio. También mejora la gestión y sincronización de datos en configuraciones en clúster, lo que ayuda con el escalado y garantiza que el sistema siga siendo confiable incluso si fallan algunos servidores.
Las instrucciones proporcionadas en esta página están diseñadas para usuarios avanzados y es posible que deban ajustarse para su configuración específica. La actualización a claves principales puede llevar mucho tiempo y consumir muchos recursos. Asegúrese de que haya suficiente espacio libre en el disco; según el tamaño de su base de datos y los datos almacenados, el proceso puede requerir hasta 2,5 veces el espacio que utilizan actualmente las tablas de historial.
Las claves principales se utilizan para todas las tablas en las nuevas instalaciones desde Zabbix 6.0.
No hay una actualización automática de la base de datos a claves principales; Sin embargo, las instalaciones existentes se pueden actualizar manualmente después de actualizar el servidor Zabbix a la versión 6.0 o posterior.
Desde Zabbix 7.0, la actualización manual de las tablas a claves primarias también actualiza las tablas para usar tipos de datos de doble precisión. Para obtener instrucciones sobre la actualización a tipos de datos de doble precisión únicamente, consulte Actualización a valores numéricos de rango extendido.
Hay instrucciones disponibles para:
Para realizar la actualización de la base de datos:
Se recomienda encarecidamente detener el servidor Zabbix durante el tiempo de la actualización. Sin embargo, si es absolutamente necesario, puede realizar la actualización mientras el servidor está en ejecución (solo para MySQL, MariaDB y PostgreSQL sin TimescaleDB).
Si utiliza PostgreSQL/TimescaleDB, consulte los problemas conocidos para restaurar una copia de seguridad de PostgreSQL/TimescaleDB creada en Zabbix 7.0.0-7.0.4.
Ejecute los scripts solo para la base de datos del servidor. El proxy no se beneficiará de esta actualización.
Si la base de datos utiliza particiones, comuníquese con el administrador de la base de datos o con el soporte de Zabbix para obtener ayuda.
Los archivos CSV se pueden eliminar después de una actualización exitosa a las claves principales.
De manera opcional, la interfaz de Zabbix se puede cambiar al modo de mantenimiento.
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
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_upgrade_prepare.sql
.
mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
Conéctese mediante mysqlsh. Si utiliza una conexión de socket, es posible que sea necesario especificar la ruta.
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" });
Este método de actualización tarda más tiempo y debe usarse sólo si no es posible realizar una actualización con mysqlsh.
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_upgrade_prepare.sql
:
mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
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.
Compruebe qué rutas están habilitadas para la importación/exportación:
mysql> SELECT @@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 de los 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.
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';
Siga las instrucciones posteriores a la migración para eliminar las tablas antiguas.
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
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;
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.
\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;
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
history_upgrade_prepare.sql
.
Si la compresión está habilitada (en la instalación predeterminada), ejecute el script desde /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/with-compression
:
Si la compresión está deshabilitada, ejecute el script desde /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/without-compression
:
Si la compresión está habilitada (en la instalación predeterminada), ejecute scripts desde /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
Si la compresión está deshabilitada, ejecute scripts desde /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
Consulte también: Consejos para mejorar el rendimiento de INSERT.
Para todas las bases de datos, una vez completada la migración, haga lo siguiente:
Verificar que todo funcione como se esperaba.
Elimine tablas antiguas:
DROP TABLE history_old;
DROP TABLE history_uint_old;
DROP TABLE history_str_old;
DROP TABLE history_log_old;
DROP TABLE history_text_old;