3 Aktualizacja bazy danych do kluczy głównych

Przegląd

Od wersji Zabbix 6.0, klucze główne są używane dla wszystkich tabel w nowych instalacjach.

Ta sekcja zawiera instrukcje dotyczące ręcznej aktualizacji tabel historycznych w istniejących instalacjach do kluczy głównych.

Instrukcje są dostępne dla:

Instrukcje zawarte na tej stronie są przeznaczone dla zaawansowanych użytkowników. Należy pamiętać, że te instrukcje mogą wymagać dostosowania do konkretnej konfiguracji.

Istotne informacje

  • Upewnij się, że przed aktualizacją wykonano kopię zapasową bazy danych.
  • Jeśli baza danych używa partycji, skontaktuj się z administratorem bazy danych lub zespołem wsparcia Zabbix po pomoc.
  • Zaleca się zatrzymanie serwera Zabbix na czas aktualizacji. Jeśli jednak jest to absolutnie konieczne, można przeprowadzić aktualizację przy działającym serwerze (dotyczy tylko MySQL, MariaDB i PostgreSQL bez TimescaleDB).
  • Pliki CSV mogą zostać usunięte po pomyślnej aktualizacji do kluczy głównych.
  • Opcjonalnie, frontend Zabbix może zostać przełączony w tryb konserwacji.
  • Aktualizację do kluczy głównych należy przeprowadzić po aktualizacji serwera Zabbix do wersji 6.0.
  • Tabele historyczne na proxy, które nie są używane, mogą być zaktualizowane przez wykonanie skryptu history_pk_prepare.sql.

MySQL

Eksport i import należy wykonać w tmux/screen, aby zapewnić, że sesja nie zostanie przerwana.

Zobacz także: Instotne informacje

MySQL 8.0+ z mysqlsh

Ta metoda może być użyta przy działającym serwerze Zabbix, ale zaleca się zatrzymanie serwera na czas aktualizacji. MySQL Shell (mysqlsh), musi być zainstalowany i możliwe jest połączenie z bazą danych.

  • Zaloguj się do konsoli MySQL jako root (zalecane) lub jako dowolny użytkownik z uprawnieniami FILE.

  • Uruchom MySQL z włączoną zmienną local_infile.

  • Zmień nazwy starych tabel i utwórz nowe tabele, uruchamiając history_pk_prepare.sql.

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
  • Eksportuj i importuj dane.

Połącz się za pomocą mysqlsh. Jeśli używasz połączenia do gniazda, może być konieczne określenie ścieżki.

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

Uruchom (CSVPATH można zmienić według potrzeb):

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

Ta metoda aktualizacji zajmuje więcej czasu i powinna być używana tylko wtedy, gdy aktualizacja za pomocą mysqlsh nie jest możliwa.

Aktualizacja tabel
  • Zaloguj się do konsoli MySQL jako root (zalecane) lub jako dowolny użytkownik z uprawnieniami FILE.

  • Uruchom MySQL z włączoną zmienną local_infile.

  • Zmień nazwy starych tabel i utwórz nowe tabeli, uruchamiając history_pk_prepare.sql:

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql
Migracja przy zatrzymanym serwerze

Wartość max_execution_time musi zostać wyłączona przed migracją danych, aby uniknąć przekroczenia limitu czasu podczas migracji.

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;

Postępuj zgodnie z instrukcjami po migracji, aby usunąć stare tabele.

Migracja przy działającym serwerze

Sprawdź, dla których ścieżek import/eksport jest włączony:

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

Jeśli wartość secure_file_priv jest ścieżką do katalogu, eksport/import będzie przeprowadzony dla plików w tym katalogu. W tym przypadku należy odpowiednio zmienić ścieżki do plików w zapytaniach lub ustawić wartość secure_file_priv na pusty ciąg znaków na czas aktualizacji.

Jeśli wartość secure_file_priv jest pusta, eksport/import może być przeprowadzony z dowolnego miejsca.

Jeśli wartość secure_file_priv jest NULL, ustaw ją na ścieżkę zawierającą dane tabeli, które zostały wyeksportowane (np. '/var/lib/mysql-files/' w powyższym przykładzie).

Więcej informacji znajdziesz w dokumentacji MySQL.

max_execution_time musi być wyłączony przed eksportem danych, aby uniknąć przekroczenia czasu oczekiwania podczas eksportu.

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

Postępuj zgodnie z instrukcjami po migracji, aby usunąć stare tabele.

PostgreSQL

Eksport i import muszą być wykonane w tmux/screen, aby zapewnić, że sesja nie zostanie przerwana. Dla instalacji z TimescaleDB, pomiń tę sekcję i przejdź do PostgreSQL + TimescaleDB.

Zobacz także: Istotne informacje

Aktualizacja tabel

  • Zmień nazwy tabel za pomocą history_pk_prepare.sql:
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_prepare.sql

Migracja przy zatrzymanym serwerze

  • Eksportuj bieżącą historię, zaimportuj ją do tabeli tymczasowej, następnie wstaw dane do nowych tabel, ignorując duplikaty:
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;

Zobacz wskazówki dotyczące poprawy wydajności polecenia INSERT: PostgreSQL: Wsadowe ładowanie dużych ilości danych, Odległość od checkpointu i ilość WAL.

Migracja przy uruchomionym serwerze

  • Eksportuj bieżącą historię, zaimportuj ją do tabeli tymczasowej, następnie wstaw dane do nowych tabel, ignorując duplikaty:
\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

Eksport i import muszą być wykonane w tmux/screen, aby zapewnić, że sesja nie zostanie przerwana. Serwer Zabbix powinien być wyłączony podczas aktualizacji.

Zobacz także: Istotne informacje

  • Zmień nazwy tabel za pomocą history_pk_prepare.sql.
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/history_pk_prepare.sql

Ścieżka do history_pk_prepare.sql została zmieniona od wersji Zabbix 6.0.9. Dla wersji starszych niż 6.0.9, należy użyć następującej komendy:

sudo -u zabbix psql zabbix < /usr/share/doc/zabbix-sql-scripts/postgresql/history_pk_prepare.sql
  • Uruchom skrypty migracji hipertabel TimescaleDB (kompatybilne zarówno z wersją TSDB v2.x, jak i v1.x) na podstawie ustawień kompresji:
    • Jeśli kompresja jest włączona (w domyślnej instalacji), uruchom skrypty z /usr/share/zabbix-sql-scripts/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
    • Jeśli kompresja jest wyłączona, uruchom skrypty z /usr/share/zabbix-sql-scripts/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

Zobacz także: Wskazówki dotyczące poprawy wydajności polecenia INSERT.

Oracle

Eksport i import muszą być wykonane w tmux/screen, aby zapewnić, że sesja nie zostanie przerwana. Serwer Zabbix powinien być wyłączony podczas aktualizacji.

Zobacz także: Istotne informacje

Aktualizacja tabel

Zobacz dokumentację Oracle Data Pump dla wskazówek dotyczących wydajności.

  • Zmień nazwy tabel za pomocą history_pk_prepare.sql.
cd /usr/share/zabbix/zabbix-sql-scripts/database/oracle
       sqlplus zabbix/password@oracle_host/service
       sqlplus> @history_pk_prepare.sql

Zbiorcza migracja tabel historii

  • Przygotuj katalogi dla Data Pump.

Data Pump musi mieć uprawnienia do odczytu i zapisu do tych katalogów.

Przykład:

mkdir -pv /export/history
       chown -R oracle:oracle /export
  • Utwórz obiekt katalogu i udziel uprawnień do odczytu i zapisu temu obiektowi użytkownikowi używanemu do uwierzytelniania w Zabbix (w poniższym przykładzie 'zabbix'). Pod rolą sysdba wykonaj:
create directory history as '/export/history';
       grant read,write on directory history to zabbix;
  • Eksportuj tabele. Zastąp N żądaną liczbą wątków.
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
  • Importuj tabele. Zastąp N żądaną liczbą wątków.
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

Indywidualna migracja tabel historii

  • Przygotuj katalogi dla Data Pump dla każdej tabeli historii. Data Pump musi mieć uprawnienia do odczytu i zapisu do tych katalogów.

Przykład:

mkdir -pv /export/history /export/history_uint /export/history_str /export/history_log /export/history_text
       chown -R oracle:oracle /export
  • Utwórz obiekt katalogu i udziel uprawnień do odczytu i zapisu temu obiektowi użytkownikowi używanemu do uwierzytelniania w Zabbix (w poniższym przykładzie 'zabbix'). Pod rolą sysdba wykonaj:
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;
  • Eksportuj i importuj każdą tabelę. Zastąp N żądaną liczbą wątków.
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

Po migracji

Dla wszystkich baz danych, po zakończeniu migracji, wykonaj następujące czynności:

  • Sprawdź, czy wszystko działa zgodnie z oczekiwaniami.

  • Usuń stare tabele:

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