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

#3 Database-upgrade naar primaire sleutels

Overzicht

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

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

Instructies zijn beschikbaar voor:

De instructies die op deze pagina worden verstrekt, zijn bedoeld voor gevorderde gebruikers. Houd er rekening mee dat deze instructies mogelijk moeten worden aangepast aan uw specifieke configuratie.

Belangrijke opmerkingen

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

MySQL

Exporteren en importeren moeten worden uitgevoerd in tmux/screen om ervoor te zorgen dat de sessie niet wordt onderbroken.

Zie ook: Belangrijke opmerkingen

MySQL 8.0+ met mysqlsh

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

  • Meld u aan bij 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
  • Exporteer en importeer gegevens.

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

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

Voer uit (CSVPATH kan indien nodig 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 upgrademethode kost meer tijd en moet alleen worden gebruikt als een upgrade met mysqlsh niet mogelijk is.

Upgraden van tabellen
  • Meld u aan bij 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 gegevens worden gemigreerd om een time-out 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 de post-migratie-instructies om de oude tabellen te verwijderen.

Migratie met draaiende 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 worden ingesteld op een lege string gedurende de upgrade.

Als de waarde van secure_file_priv leeg is, kan import/export 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).

Voor meer informatie, zie MySQL-documentatie.

max_execution_time moet worden uitgeschakeld voordat gegevens worden geëxporteerd om een time-out 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 de 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, sla dit gedeelte over en ga verder naar PostgreSQL + TimescaleDB.

Zie ook: Belangrijke opmerkingen

Upgraden van tabellen

  • 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 de gegevens toe aan de nieuwe tabellen terwijl duplicaten worden genegeerd:
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 de gegevens toe aan de nieuwe tabellen terwijl duplicaten worden genegeerd:
\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

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

Zie ook: Belangrijke opmerkingen

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

Het pad naar history_pk_prepare.sql is gewijzigd sinds Zabbix 6.0.9. Voor versies ouder dan 6.0.9 moet de volgende opdracht worden gebruikt:

sudo -u zabbix psql zabbix < /usr/share/doc/zabbix-sql-scripts/postgresql/history_pk_prepare.sql
  • Voer TimescaleDB hypertable migratiescripts uit (compatibel met zowel TSDB v2.x als v1.x versie) op basis van compressie-instellingen:
    • Als compressie is ingeschakeld (op 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 bij het invoegen.

Oracle

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

Zie ook: Belangrijke opmerkingen

Upgraden van tabellen

Zie de Oracle Data Pump documentatie voor tips voor prestatieverbetering.

  • Hernoem tabellen met behulp van history_pk_prepare.sql.
cd /usr/share/zabbix/zabbix-sql-scripts/database/oracle
       sqlplus zabbix/password@oracle_host/service
       sqlplus> @history_pk_prepare.sql

Batch migratie van history tabellen

  • Bereid mappen voor Data Pump voor.

Data Pump moet lees- en schrijfrechten hebben voor deze mappen.

Voorbeeld:

mkdir -pv /export/history
       chown -R oracle:oracle /export
  • Maak een mapobject aan en verleen lees- en schrijfrechten voor dit object aan de gebruiker die wordt gebruikt voor Zabbix-authenticatie ('zabbix' in het onderstaande voorbeeld). Onder de sysdba rol, voer het volgende uit:
create directory history as '/export/history';
       grant read,write on directory history to zabbix;
  • Exporteer tabellen. Vervang N door het gewenste aantal threads.
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
  • Importeer tabellen. Vervang N door het gewenste aantal threads.
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

Individuele migratie van history-tabellen

  • Bereid mappen voor Data Pump voor elke history-tabel voor. Data Pump moet lees- en schrijfrechten hebben voor deze mappen.

Voorbeeld:

mkdir -pv /export/history /export/history_uint /export/history_str /export/history_log /export/history_text
       chown -R oracle:oracle /export
  • Maak een mapobject aan en verleen lees- en schrijfrechten voor dit object aan de gebruiker die wordt gebruikt voor Zabbix-authenticatie ('zabbix' in het onderstaande voorbeeld). Onder de sysdba rol, voer het volgende uit:
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;
  • Exporteer en importeer elke tabel. Vervang N door het gewenste aantal threads.
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-migratie

Voor alle databases, nadat de migratie is voltooid, volg deze stappen:

  • Controleer of alles werkt zoals verwacht.

  • Verwijder 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;