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.sqluit 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" });
- Volg de post-migratie-instructies om de oude tabellen te verwijderen.
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.sqluit 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.
- Volg post-migratie-instructies om de oude tabellen te verwijderen.
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;
- Volg post-migratie-instructies om de oude tabellen te verwijderen.
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
- Als compressie is ingeschakeld (bij standaardinstallatie), voer dan scripts uit vanuit
Zie ook: Tips voor het verbeteren van de prestaties van INSERT-opdrachten.
- Volg post-migratie-instructies om de oude tabellen te verwijderen.
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;