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" });
- Postępuj zgodnie z instrukcjami po migracji, aby usunąć stare tabele.
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.
- Postępuj zgodnie z instrukcjami po migracji, aby usunąć stare tabele.
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;
- Postępuj zgodnie z instrukcjami po migracji, aby usunąć stare tabele.
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
- Jeśli kompresja jest włączona (w domyślnej instalacji), uruchom skrypty z
Zobacz także: Wskazówki dotyczące poprawy wydajności polecenia INSERT.
- Postępuj zgodnie z instrukcjami po migracji, aby usunąć stare tabele.
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
- Zainstaluj Oracle Data Pump (dostępny w pakiecie Instant Client Tools).
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
- Postępuj zgodnie z instrukcjami po migracji, aby usunąć stare tabele.
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
- Postępuj zgodnie z instrukcjami po migracji, aby usunąć stare tabele.
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;