Áú»¢¶Ä²©

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 Áú»¢¶Ä²© 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 »å±ð²õ±è°ù¨¦²õ d'actualitzar el servidor Áú»¢¶Ä²© a 6.0 o posterior.

Des de Áú»¢¶Ä²© 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 Áú»¢¶Ä²© 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 Áú»¢¶Ä²© 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 Áú»¢¶Ä²©.

Es recomana aturar el servidor Áú»¢¶Ä²© 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. Instal¡¤leu el darrer paquet zabbix-sql-scripts compatible amb la vostra versi¨® de Áú»¢¶Ä²© (p. ex., per a RHEL: dnf install zabbix-sql-scripts).
  3. Executeu els scripts de la vostra base de dades.
  4. Inicieu el servidor Áú»¢¶Ä²©.

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 Áú»¢¶Ä²© per obtindre ajuda.

Els fitxers CSV es poden esborrar »å±ð²õ±è°ù¨¦²õ d'una actualitzaci¨® correcta a les claus prim¨¤ries.

Opcionalment, la interf¨ªcie Áú»¢¶Ä²© 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 Áú»¢¶Ä²© en marxa, per¨° es recomana aturar el servidor mentre s'actualitza. La MySQL Shell (mysqlsh) ha d'¨¦sser 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 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 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 .

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 »å±ð²õ±è°ù¨¦²õ 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: , .

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 Áú»¢¶Ä²© 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¨¦: per millorar el rendiment de l'INSERT.

±Ê´Ç²õ³Ù-³¾¾±²µ°ù²¹³¦¾±¨®

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¨¦