3 Datenbank-Upgrade auf Primärschlüssel

Übersicht

Dieser Abschnitt enthält Anweisungen zum manuellen Upgrade von Tabellen in bestehenden Installationen auf Primärschlüssel.

Das Upgrade auf Primärschlüssel optimiert die Art und Weise, wie Daten indiziert und abgerufen werden, was Abfragen beschleunigen und Speicherplatz sparen kann. Außerdem verbessert es die Datenverwaltung und Synchronisierung in Cluster-Umgebungen, unterstützt die Skalierung und stellt sicher, dass das System auch dann zuverlässig bleibt, wenn einige Server ausfallen.

Die auf dieser Seite bereitgestellten Anweisungen sind für fortgeschrittene Benutzer gedacht und müssen möglicherweise an Ihre spezifische Konfiguration angepasst werden. Das Upgrade auf Primärschlüssel kann zeitaufwendig und ressourcenintensiv sein. Stellen Sie sicher, dass ausreichend freier Festplattenspeicher verfügbar ist; abhängig von der Größe Ihrer Datenbank und den gespeicherten Daten kann der Prozess bis zum 2,5-Fachen des derzeit von Verlaufstabellen verwendeten Speicherplatzes benötigen.

Primärschlüssel werden seit Zabbix 6.0 in neuen Installationen für alle Tabellen verwendet.

Es gibt kein automatisches Datenbank-Upgrade auf Primärschlüssel; bestehende Installationen können jedoch manuell nach dem Upgrade des Zabbix Server auf 6.0 oder neuer aktualisiert werden.

Seit Zabbix 7.0 werden beim Upgrade von Tabellen auf Primärschlüssel Tabellen auch für die Verwendung von double-precision-Datentypen aktualisiert.

Wenn Sie Zabbix 7.0 (oder neuer) verwenden, nutzen die Tabellen bereits double precision. Die Anweisungen auf dieser Seite können jedoch weiterhin befolgt werden, um Tabellen auf Primärschlüssel zu aktualisieren, ohne Tabellen zu beeinflussen, die bereits double precision verwenden.

Wenn Sie Zabbix 6.4 (oder älter) verwenden, sollten Sie in Erwägung ziehen, Tabellen zuerst auf double precision zu aktualisieren. Weitere Informationen finden Sie unter Upgrading to numeric values of extended range in der Zabbix-7.0-Dokumentation.

Anweisungen sind verfügbar für:

Wichtige Hinweise

So führen Sie das Datenbank-Upgrade durch:

  1. Stoppen Sie den Zabbix Server.

Es wird dringend empfohlen, den Zabbix Server für die Dauer des Upgrades anzuhalten. Falls jedoch unbedingt erforderlich, können Sie das Upgrade auch durchführen, während der Server läuft (nur für MySQL, MariaDB und PostgreSQL ohne TimescaleDB).

  1. Erstellen Sie eine Sicherung Ihrer Datenbank.
  2. Installieren Sie das neueste Paket zabbix-sql-scripts, das mit Ihrer Zabbix-Version kompatibel ist (z. B. für RHEL: dnf install zabbix-sql-scripts).
  3. Führen Sie die Skripte für Ihre Datenbank aus.
  4. Starten Sie den Zabbix Server.

Führen Sie die Skripte nur für die Server-Datenbank aus. Der Proxy profitiert nicht von diesem Upgrade.

Wenn die Datenbank Partitionen verwendet, wenden Sie sich an den DB-Administrator oder den Zabbix-Support, um Hilfe zu erhalten.

CSV-Dateien können nach einem erfolgreichen Upgrade auf Primärschlüssel entfernt werden.

Optional kann das Zabbix Frontend in den Wartungsmodus versetzt werden.

MySQL

Export und Import müssen in tmux/screen durchgeführt werden, um sicherzustellen, dass die Sitzung nicht unterbrochen wird.

Siehe auch: Wichtige Hinweise

MySQL 8.4+ mit mysqlsh

Diese Methode kann mit einem laufenden Zabbix Server verwendet werden, es wird jedoch empfohlen, den Server für die Dauer des Upgrades zu stoppen. Die MySQL Shell (mysqlsh) muss installiert sein und eine Verbindung zur DB herstellen können.

  • Melden Sie sich in der MySQL-Konsole als root (empfohlen) oder als beliebiger Benutzer mit FILE-Berechtigungen an.

  • Starten Sie MySQL mit aktivierter Variablen local_infile.

  • Benennen Sie alte Tabellen um und erstellen Sie neue Tabellen, indem Sie history_upgrade_prepare.sql ausführen.

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix/sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
  • Exportieren und importieren Sie Daten.

Stellen Sie die Verbindung über mysqlsh her. Bei Verwendung einer Socket-Verbindung muss möglicherweise der Pfad angegeben werden.

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

Wechseln Sie mit Folgendem in den JavaScript-Modus:

\js

Führen Sie dann den folgenden Code aus (CSVPATH kann bei Bedarf geändert werden):

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" });

Wenn Sie die Meldung „JavaScript is not supported“ erhalten, unterstützt Ihre MySQL-Shell-Installation kein JS. Installieren Sie in diesem Fall das offizielle MySQL Shell package von Oracle (oder erstellen Sie es aus dem Quellcode), damit der JavaScript-Modus aktiviert ist.

MariaDB/MySQL 8.4+ ohne mysqlsh

Diese Upgrade-Methode benötigt mehr Zeit und sollte nur verwendet werden, wenn ein Upgrade mit mysqlsh nicht möglich ist.

Tabellen-Upgrade
  • Melden Sie sich an der MySQL-Konsole als root (empfohlen) oder als beliebiger Benutzer mit FILE-Berechtigungen an.

  • Wenn Sie die Migration mit einem laufenden Zabbix-Server durchführen, starten Sie MySQL mit aktivierter Variable local_infile.

  • Benennen Sie die alten Tabellen um und erstellen Sie neue Tabellen, indem Sie history_upgrade_prepare.sql ausführen:

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix/sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
Migration bei gestopptem Server

max_execution_time (in MySQL) oder max_statement_time (in MariaDB) muss vor der Datenmigration deaktiviert werden, um einen Timeout während der Migration zu vermeiden.

Für MySQL:

SET @@max_execution_time=0;

Für MariaDB:

SET @@max_statement_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;

Folgen Sie den Anweisungen nach der Migration, um die alten Tabellen zu löschen.

Migration mit laufendem Server

Prüfen Sie, für welche Pfade Import/Export aktiviert ist:

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

Wenn der Wert von secure_file_priv ein Pfad zu einem Verzeichnis ist, wird der Export/Import für Dateien in diesem Verzeichnis durchgeführt. Bearbeiten Sie in diesem Fall die Dateipfade in den Abfragen entsprechend oder setzen Sie den Wert von secure_file_priv für die Dauer des Upgrades auf eine leere Zeichenfolge.

Wenn der Wert von secure_file_priv leer ist, kann der Export/Import von jedem Speicherort aus durchgeführt werden.

Wenn der Wert von secure_file_priv NULL ist, setzen Sie ihn auf den Pfad, der die exportierten Tabellendaten enthält (im obigen Beispiel '/var/lib/mysql-files/').

Weitere Informationen finden Sie in der MySQL-Dokumentation oder in der MariaDB-Dokumentation.

max_execution_time (in MySQL) oder max_statement_time (in MariaDB) muss vor dem Datenexport deaktiviert werden, um einen Timeout während des Exports zu vermeiden.

Für MySQL:

SET @@max_execution_time=0;

Für MariaDB:

SET @@max_statement_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';

Folgen Sie den Anweisungen nach der Migration, um die alten Tabellen zu löschen.

PostgreSQL

Export und Import müssen in tmux/screen durchgeführt werden, um sicherzustellen, dass die Sitzung nicht unterbrochen wird. Bei Installationen mit TimescaleDB überspringen Sie diesen Abschnitt und fahren Sie mit PostgreSQL + TimescaleDB fort.

Siehe auch: Wichtige Hinweise

Tabellen-Upgrade

  • Benennen Sie Tabellen mit history_upgrade_prepare.sql um:
sudo -u zabbix psql zabbix < /usr/share/zabbix/sql-scripts/postgresql/option-patches/history_upgrade_prepare.sql

Migration bei gestopptem Server

  • Exportieren Sie den aktuellen Verlauf, importieren Sie ihn in die temporäre Tabelle und fügen Sie dann die Daten in die neuen Tabellen ein, wobei Duplikate ignoriert werden:
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;

Siehe auch Tipps zur Verbesserung der INSERT-Performance: PostgreSQL: Bulk Loading Huge Amounts of Data, Checkpoint Distance and Amount of WAL.

Migration mit laufendem Server

  • Aktuelle Verlaufsdaten exportieren, in die temporäre Tabelle importieren und dann die Daten in neue Tabellen einfügen, wobei Duplikate ignoriert werden:
\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 und Import müssen in tmux/screen durchgeführt werden, um sicherzustellen, dass die Sitzung nicht unterbrochen wird. Der Zabbix Server sollte während des Upgrades heruntergefahren sein.

Siehe auch: Wichtige Hinweise

  • Benennen Sie Tabellen mit history_upgrade_prepare.sql um.

    • Wenn die Komprimierung aktiviert ist (bei der Standardinstallation), führen Sie das Skript aus /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression aus:
      cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_prepare.sql | sudo -u zabbix psql zabbix
    • Wenn die Komprimierung deaktiviert ist, führen Sie das Skript aus /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression aus:
      cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_prepare.sql | sudo -u zabbix psql zabbix
  • Führen Sie TimescaleDB-Hypertable-Migrationsskripte entsprechend den Komprimierungseinstellungen aus:

    • Wenn die Komprimierung aktiviert ist (bei der Standardinstallation), führen Sie Skripte aus /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression aus:
      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
    • Wenn die Komprimierung deaktiviert ist, führen Sie Skripte aus /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression aus:
      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

Siehe auch: Tipps zur Verbesserung der INSERT-Performance.

Nach der Migration

Führen Sie für alle Datenbanken nach Abschluss der Migration Folgendes durch:

  • Überprüfen Sie, dass alles wie erwartet funktioniert.

  • Löschen Sie die alten 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;
  • Löschen Sie bei TimescaleDB zusätzlich die folgende alte Tabelle:
DROP TABLE trends_old;

Siehe auch