This is a translation of the original English documentation page. Help us make it better.

#3 Database-upgrade naar primaire sleutels

Overzicht

Vanaf Zabbix 6.0 worden primaire sleutels gebruikt voor alle tabellen in nieuwe installaties.

Dit gedeelte biedt instructies voor het handmatig upgraden van de geschiedenistabellen in bestaande installaties naar primaire sleutels.

Instructies zijn beschikbaar voor:

Belangrijke opmerkingen

  • Zorg ervoor dat u een back-up maakt van de database voordat u de upgrade uitvoert.
  • Als de database partities gebruikt, neem dan contact op met de DB-beheerder of het Zabbix ondersteuningsteam voor hulp.
  • Het wordt sterk aanbevolen om de Zabbix-server tijdens de upgrade te stoppen. Als dit echter absoluut noodzakelijk is, is er een manier om de upgrade uit te voeren terwijl de server actief is (alleen voor MySQL, MariaDB en PostgreSQL zonder TimescaleDB).
  • CSV-bestanden kunnen na een succesvolle upgrade naar primaire sleutels worden verwijderd.
  • Optioneel kan de Zabbix-frontend worden overgeschakeld naar onderhoudsmodus.
  • De upgrade naar primaire sleutels moet worden uitgevoerd nadat de Zabbix-server is geüpgraded naar versie 6.0.
  • Op een proxy kunnen geschiedenistabellen die niet worden gebruikt, worden geüpgraded door het bestand history_pk_prepare.sql uit te voeren.

MySQL

Export en import moeten worden uitgevoerd in tmux/screen om ervoor te zorgen dat de sessie niet wordt afgebroken.

Zie ook: Belangrijke opmerkingen

MySQL 8.0+ met mysqlsh

Deze methode kan worden gebruikt met een actieve Zabbix-server, maar het wordt aanbevolen om de server gedurende de upgrade te stoppen. De MySQL Shell (mysqlsh) moet geïnstalleerd zijn en in staat zijn om verbinding te maken met de database.

  • Log in op de MySQL-console als root (aanbevolen) of als een willekeurige gebruiker met FILE-rechten.

  • Start MySQL met de local_infile-variabele ingeschakeld.

  • Hernoem oude tabellen en maak nieuwe tabellen aan door history_pk_prepare.sql uit te voeren.

mysql -uzabbix -p<wachtwoord> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
  • Exporteer en importeer gegevens.

Verbind via mysqlsh. Als je een socketverbinding gebruikt, kan het nodig zijn om het pad op te geven.

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

Voer uit (CSVPATH kan naar behoefte worden gewijzigd):

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

Deze upgrade-methode kost meer tijd en moet alleen worden gebruikt als een upgrade met mysqlsh niet mogelijk is.

Tabelupgrade
  • Log in op de MySQL-console als root (aanbevolen) of als een willekeurige gebruiker met FILE-rechten.

  • Start MySQL met de variabele local_infile ingeschakeld.

  • Hernoem oude tabellen en maak nieuwe tabellen aan door history_pk_prepare.sql uit te voeren:

mysql -uzabbix -p<wachtwoord> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
Migratie met gestopte server

max_execution_time moet worden uitgeschakeld voordat de gegevens worden gemigreerd om time-outs tijdens de migratie te voorkomen.

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;

Volg post-migratie-instructies om de oude tabellen te verwijderen.

Migratie met actieve server

Controleer voor welke paden import/export is ingeschakeld:

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

Als de waarde van secure_file_priv een pad naar een directory is, wordt import/export uitgevoerd voor bestanden in die directory. In dat geval moeten de paden naar de bestanden in de queries worden aangepast of moet de waarde van secure_file_priv leeg worden gelaten gedurende de upgrade.

Als de waarde van secure_file_priv leeg is, kan export/import vanuit elke locatie worden uitgevoerd.

Als de waarde van secure_file_priv NULL is, stel deze dan in op het pad dat de geëxporteerde tabelgegevens bevat ('/var/lib/mysql-files/' in het bovenstaande voorbeeld).

Zie voor meer informatie de MySQL-documentatie.

max_execution_time moet worden uitgeschakeld voordat de gegevens worden geëxporteerd om time-outs tijdens het exporteren te voorkomen.

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

Volg post-migratie-instructies om de oude tabellen te verwijderen.

PostgreSQL

Exporteren en importeren moeten worden uitgevoerd in tmux/screen om ervoor te zorgen dat de sessie niet wordt verbroken. Voor installaties met TimescaleDB kunt u dit gedeelte overslaan en doorgaan naar PostgreSQL + TimescaleDB.

Zie ook: Belangrijke opmerkingen

Tabelupgrade

  • Hernoem tabellen met behulp van history_pk_prepare.sql:
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_prepare.sql

Migratie met gestopte server

  • Exporteer de huidige geschiedenis, importeer deze naar de tijdelijke tabel, en voeg vervolgens de gegevens toe aan de nieuwe tabellen en negeer duplicaten:
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;

Zie tips voor het verbeteren van de prestaties van INSERT: PostgreSQL: Bulk Loading Huge Amounts of Data, Checkpoint Distance and Amount of WAL.

Migratie met draaiende server

  • Exporteer de huidige geschiedenis, importeer deze naar de tijdelijke tabel, en voeg vervolgens de gegevens toe aan de nieuwe tabellen en negeer duplicaten:
\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

Export en import moeten worden uitgevoerd in tmux/screen om ervoor te zorgen dat de sessie niet wordt onderbroken. De Zabbix-server moet zijn uitgeschakeld tijdens de upgrade.

Zie ook: Belangrijke opmerkingen

  • Hernoem tabellen met behulp van history_pk_prepare.sql.
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_prepare.sql
  • Voer TimescaleDB hypertable migratiescripts uit (compatibel met zowel TSDB v2.x als v1.x versies) op basis van compressie-instellingen:
    • Als compressie is ingeschakeld (bij standaardinstallatie), voer dan scripts uit vanuit 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
    • Als compressie is uitgeschakeld, voer dan scripts uit vanuit 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

Zie ook: Tips voor het verbeteren van de prestaties van INSERT-opdrachten.

Post-migratie

Voor alle databases, nadat de migratie is voltooid, doe het volgende:

  • Verifieer dat alles naar verwachting werkt.

  • Verwijder de oude tabellen:

DROP TABLE history_old;
       DROP TABLE history_uint_old;
       DROP TABLE history_str_old;
       DROP TABLE history_log_old;
       DROP TABLE history_text_old;

Zie ook