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

Vista general

Des de la versió 6.0 de Zabbix, les claus primàries s'empren a totes les taules de les noves instal·lacions.

Aquesta secció mostra les instruccions per actualitzar manualment les taules d'històric existents cap a les claus primàries.

Les instruccions són disponibles per a:

Les instruccions mostrades aquí són pensades per a usuaris avançats. Penseu que aquestes instruccions s'hauran d'ajustar per al vostre entorn específic.

Notes importants

  • Assegureu-vos de fer una còpia de seguretat de la base de dades abans de l'actualització.
  • Si la vostra base de dades empra particions, contacteu amb l'administrador de la base de dades o l'equip de suport de Zabbix per obtindre ajut.
  • Es recomana aturar el servidor al moment de l'actualització. Però, si és estrictament necessari, hi ha una manera d'actualitzar mentre el servidor és en marxa (només per a MySQL, MariaDB i PostgreSQL sense TimescaleDB).
  • Els arxius CSV es podran esborrar després de l'actualització correcta cap a claus primàries.
  • De manera opcional, la interfície de Zabbix es pot canviar cap a mode de manteniment
  • L'actualització cap a claus primàries s'ha de fer després de l'actualització del servidor cap a la versió 6.0.
  • Amb un proxy, history_pk_prepare.sql es pot executar per posar les taules d'històric (que no s'empren) en claus primàries.

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.

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.
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_prepare.sql

La ruta cap a history_pk_prepare.sql ha canviat des de Zabbix 6.0.9. Per versions més antigues que la 6.0.9, haureu d'emprar la comanda següent:

sudo -u zabbix psql zabbix < /usr/share/doc/zabbix-sql-scripts/postgresql/history_pk_prepare.sql
  • Executeu els scripts de migració d'hipertaula TimescaleDB (compatible amb les versions v2.x i v1.x de TSDB) 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/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 compressió és desactivada, executeu els scripts des 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

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

Oracle

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

Veieu també: Notes importants

Actualització de la taula

Veieu els consells de rendiment de l'Oracle Data Pump a la documentació.

  • Reanomeneu les taules emprant history_pk_prepare.sql.
cd /usr/share/zabbix/zabbix-sql-scripts/database/oracle
       sqlplus zabbix/password@oracle_host/service
       sqlplus> @history_pk_prepare.sql

Migració amb Batch de les taules d'històric

  • Prepareu els directoris per Data Pump.

Data Pump ha de tindre permisos de lectura i escriptura a aquests directoris.

Exemple:

mkdir -pv /export/history
       chown -R oracle:oracle /export
  • Creeu un objecte directori i doneu-hi permisos de lectura i escriptura a l'usuari d'autenticació de Zabbix ('zabbix', a l'exemple de més avall). Amb el rol sysdba, executeu:
create directory history as '/export/history';
       grant read,write on directory history to zabbix;
  • Exporteu les taules. Substituïu N amb el comptador que vulgueu.
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
  • Importeu les taules. Substituïu N amb el comptador que vulgueu.
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

Migració individual de la taula d'històric

  • Prepareu els directoris per Data Pump per cada taula d'històric. Data Pump ha de tindre permisos de lectura i escriptura en aquests directoris.

Exemple:

mkdir -pv /export/history /export/history_uint /export/history_str /export/history_log /export/history_text
       chown -R oracle:oracle /export
  • Creeu un directori i doneu-hi permisos de lectura i escriptura a l'usuari que empreu per l'autenticació de Zabbix ('zabbix', a l'exemple de més avall). Sota el rol sysdba, executeu:
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;
  • Exporteu i importeu cada taula. Substituïu N amb el comptador que empreu.
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-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;