Aquesta secció mostra les instruccions per actualitzar manualment les taules d'històric existents cap 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 claus primàries s'utilitzen 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.
Les instruccions són disponibles per a:
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 requerir fins a 2,5 vegades l'espai que empren actualment les taules d'historial.
Per fer l'actualització de la base de dades:
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).
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.
La exportació i importació s'hauran de fer a tmux/screen per assegurar que la sessió no es perd pas.
Veieu també: Notes importants
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
.
Connecteu via mysqlsh. Si empreu una connexió socket, és necessari especificar la ruta.
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" });
Aquest mètode d'actualització pren més temps i s'ha d'emprar només si l'actualització amb mysqlsh no fos possible.
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
:
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.
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.
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
history_pk_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;
Veieu els consells per millorar el rendiment d'INSERT: PostgreSQL: Bulk Loading Huge Amounts of Data, Checkpoint Distance and Amount of 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ó 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
history_pk_prepare.sql
.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.
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
Veieu els consells de rendiment de l'Oracle Data Pump a la documentació.
history_pk_prepare.sql
.cd /usr/share/zabbix/zabbix-sql-scripts/database/oracle
sqlplus zabbix/password@oracle_host/service
sqlplus> @history_pk_prepare.sql
Data Pump ha de tindre permisos de lectura i escriptura a aquests directoris.
Exemple:
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
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
Exemple:
mkdir -pv /export/history /export/history_uint /export/history_str /export/history_log /export/history_text
chown -R oracle:oracle /export
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;
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
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: