3 Actualització de la base de dades envers les claus primàries

Vista general

Aquesta secció proporciona instruccions per actualitzar manualment les taules de les instal·lacions existents a les claus primàries.

L'actualització a claus primàries optimitza la manera com s'indexen i s'accedeix a les dades, cosa que pot accelerar les consultes i estalviar espai. També millora la gestió de dades i la sincronització en configuracions en clúster, ajudant a escalar i garantir que el sistema segueixi sent fiable encara que alguns servidors fallin.

Les instruccions proporcionades en aquesta pàgina estan dissenyades per a usuaris avançats i és possible que s'hagin d'ajustar a la vostra configuració específica. L'actualització a les claus primàries pot suposar un consum de temps i de recursos. Assegureu-vos que hi ha prou espai lliure disponible al disc; depenent de la mida de la base de dades i de les dades emmagatzemades, el procés pot menester fins a 2,5 vegades l'espai que empren actualment les taules d'historial.

Les claus primàries s'empren per a totes les taules en instal·lacions noves des de Zabbix 6.0.

No hi ha cap actualització automàtica de la base de dades a les claus primàries; tanmateix, les instal·lacions existents es poden actualitzar manualment després d'actualitzar el servidor Zabbix a 6.0 o posterior.

Des de Zabbix 7.0, l'actualització manual de les taules a claus primàries també actualitza les taules per emprar tipus de dades de doble precisió.

Si teniu Zabbix 7.0, les taules ja empren doble precisió. Tanmateix, encara es poden seguir les instruccions d'aquesta pàgina per actualitzar les taules a claus primàries sense afectar les taules que ja empren doble precisió.

Si teniu Zabbix 6.4 (o anterior), primer considereu actualitzar les taules per duplicar la precisió. Per obtindre més informació, veieu Actualització a valors numèrics d'interval estès.

Les instruccions són disponibles per a:

Notes importants

Per fer l'actualització de la base de dades:

  1. Atureu el servidor Zabbix.

Es recomana aturar el servidor Zabbix durant el moment de l'actualització. Tanmateix, si és absolutament necessari, podeu fer l'actualització mentre el servidor és engegat (només per a MySQL, MariaDB i PostgreSQL sense TimescaleDB).

  1. Feu una còpia de seguretat de la vostra base de dades.
  2. Executeu els scripts de la vostra base de dades.
  3. Inicieu el servidor Zabbix.

Executeu els scripts només per a la base de dades del servidor. El proxy no es beneficiarà d'aquesta actualització.

Si la base de dades té particions, poseu-vos en contacte amb l'administrador de la base de dades o amb el suport de Zabbix per obtindre ajuda.

Els fitxers CSV es poden esborrar després d'una actualització correcta a les claus primàries.

Opcionalment, la interfície Zabbix es pot canviar a mode de manteniment.

MySQL

La exportació i importació s'hauran de fer a tmux/screen per assegurar que la sessió no es perd pas.

Veieu també: Notes importants

MySQL 8.0+ amb mysqlsh

Aques mètode es pot emprar amb un servidor Zabbix en marxa, però es recomana aturar el servidor mentre s'actualitza. La MySQL Shell (mysqlsh) ha d'ésser instal·lada i poder-se connectar amb la DB.

  • Entreu a la consola de MySQL com a root (recomanat) o qualsevol altre usuari amb privilegis FILE.

  • Inicieu MySQL amb la variable local_infile activa.

  • Reanomeneu les taules antigues i creeu taules noves executant history_pk_prepare.sql.

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
  • Exporteu i importeu la informació.

Connecteu via mysqlsh. Si empreu una connexió socket, és necessari especificar la ruta.

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

Executeu (CSVPATH es pot canviar, si cal):

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+ sense mysqlsh

Aquest mètode d'actualització pren més temps i s'ha d'emprar només si l'actualització amb mysqlsh no fos possible.

Actualització de la taula
  • Entreu a la consola de MySQL com a root (recomanat) o qualsevol altre usuari amb privilegis FILE.

  • Engegueu MySQL amb la variable local_infile activa.

  • Reanomeneu les taules antigues i creeu les noves executant history_pk_prepare.sql:

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
Migració amb el servidor aturat

S'ha de deshabilitar el max_execution_time abans de migrar la informació, per evitar que s'esgoti el temps d'espera durant la migració.

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;

Seguiu les instruccions de post-migració per buidar les taules antigues.

Migració amb el servidor en marxa

Reviseu per quines rutes import/export és activat:

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

Si el valor secure_file_priv és una ruta cap a un directori, export/import es farà per als arxius d'aquell directori. En aquest cas, editeu les rutes als arxius en consultes segons el valor secure_file_priv cap a una cadena buida per al temps d'actualització.

Si el valor secure_file_priv és buit, export/import pot fer-se des de qualsevol ubicació.

Si el valor secure_file_priv és NULL, establiu la ruta que conté la informació de la taula exportada ('/var/lib/mysql-files/' a l'exemple de més amunt).

Per tindre més informació, veieu la documentació de MySQL.

S'ha de deshabilitar el max_execution_time abans d'exportar informació, per evitar que s'esgoti el temps d'espera durant la exportació.

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

Seguiu les instruccions de post-migració per buidar les taules antigues.

PostgreSQL

Exportar i importar s'ha de fre des de la tmux/screen, per assegurar-nos que la sessió no es perd. Per instal·lacions amb TimescaleDB, salteu aquesta secció i procediu amb PostgreSQL + TimescaleDB.

Veieu també: Notes importants

Actualització de la taula

  • Reanomeneu les taules emprant history_pk_prepare.sql:
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_prepare.sql

Migració amb el servidor aturat

  • Exporteu l'historial actual, importeu-lo a la taula temporal, i després inseriu la informació a noves taules ignorant duplicitats:
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;

Veieu els consells per millorar el rendiment d'INSERT: PostgreSQL: Bulk Loading Huge Amounts of Data, Checkpoint Distance and Amount of WAL.

Seguiu les instruccions de post-migració per buidar les taules antigues.

Migrció amb el servidor en marxa

  • Exporteu l'historial actual, importeu-lo a la taula temporal, i inseriu la informació a les noves taules ignorant duplicitats:
\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

La exportació i importació s'ha de fer amb tmux/screen per assegurar que la sessió no es tanca. El servidor de Zabbix ha d'ésser aturat durant l'actualització.

Veieu també: Notes importants

  • Reanomeneu les taules emprant history_pk_prepare.sql.
    • Si la compressió és activa (instal·lació per defecte), correu l'script des de /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
    • Si la compressió és desactivada, correu l'script des de /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
  • Executeu els scripts de migració d'hipertaula TimescaleDB en base a la configuració de compressió:
    • Si la compressió és activa (a les instal·lacions per defecte), executeu els scripts des de database/postgresql/tsdb_history_pk_upgrade_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 compressió és desactivada, executeu els scripts des de database/postgresql/tsdb_history_pk_upgrade_no_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

Veieu també: Consells per millorar el rendiment de l'INSERT.

Post-migració

Per a totes les bases de dades, una vegada hagueu enllestit la migració, procediu així:

  • Verifiqueu que tot funciona com hagueu previst.

  • Esborreu les taules antigues:

DROP TABLE history_old;
       DROP TABLE history_uint_old;
       DROP TABLE history_str_old;
       DROP TABLE history_log_old;
       DROP TABLE history_text_old;
  • Per a TimescaleDB, també dropeu la taula antiga següent:
DROP TABLE trends_old;

Veieu també