3 Database upgrade to primary keys

Pārskats

Šajā sadaļā ir sniegti norādījumi, kā manuāli jaunināt tabulas esošajās instalācijās uz primārajām atslēgām.

Jaunināšana uz primārajām atslēgām optimizē datu indeksēšanu un piekļuvi tiem, kas var paātrināt vaicājumus un ietaupīt vietu. Tā arī uzlabo datu pārvaldību un sinhronizāciju klasteru iestatījumos, palīdzot mērogošanā un nodrošinot, ka sistēma saglabājas uzticama pat tad, ja daži serveri nedarbojas.

Šajā lapā sniegtie norādījumi ir paredzēti pieredzējušiem lietotājiem, un tos var būt nepieciešams pielāgot jūsu konkrētajai konfigurācijai. Jaunināšana uz primārajām atslēgām var būt laikietilpīga un resursietilpīga. Pārliecinieties, ka ir pieejams pietiekami daudz brīvas diska vietas; atkarībā no jūsu datubāzes lieluma un saglabāto datu apjoma procesam var būt nepieciešams līdz pat 2,5 reizēm vairāk vietas nekā pašlaik izmanto vēstures tabulas.

Primārās atslēgas tiek izmantotas visām tabulām jaunās instalācijās kopš Zabbix 6.0.

Nav automātiskas datubāzes jaunināšanas uz primārajām atslēgām; tomēr esošās instalācijas var tikt jauninātas manuāli pēc Zabbix serveris jaunināšanas uz 6.0 vai jaunāku versiju.

Kopš Zabbix 7.0 tabulu jaunināšana uz primārajām atslēgām vienlaikus jaunina arī tabulas, lai tās izmantotu dubultās precizitātes datu tipus.

Ja jums ir Zabbix 7.0 (vai jaunāka versija), tabulas jau izmanto dubulto precizitāti. Tomēr šajā lapā sniegtos norādījumus joprojām var izmantot, lai jauninātu tabulas uz primārajām atslēgām, neietekmējot tabulas, kas jau izmanto dubulto precizitāti.

Ja jums ir Zabbix 6.4 (vai vecāka versija), apsveriet iespēju vispirms jaunināt tabulas uz dubulto precizitāti. Plašāku informāciju skatiet Jaunināšana uz paplašināta diapazona skaitliskajām vērtībām Zabbix 7.0 dokumentācijā.

Norādījumi ir pieejami šādām sistēmām:

Svarīgas piezīmes

Lai veiktu datubāzes jaunināšanu:

  1. Apturiet Zabbix serveri.

Ir stingri ieteicams apturēt Zabbix serveri uz jaunināšanas laiku. Tomēr, ja tas ir absolūti nepieciešams, jaunināšanu var veikt arī laikā, kad serveris darbojas (tikai MySQL, MariaDB un PostgreSQL bez TimescaleDB gadījumā).

  1. Izveidojiet savas datubāzes dublējumkopiju.
  2. Instalējiet jaunāko zabbix-sql-scripts pakotni, kas ir saderīga ar jūsu Zabbix versiju (piemēram, RHEL gadījumā: dnf install zabbix-sql-scripts).
  3. Palaidiet skriptus savai datubāzei.
  4. Palaidiet Zabbix serveri.

Palaidiet skriptus tikai servera datubāzei. starpniekserveris no šīs jaunināšanas negūs labumu.

Ja datubāzē tiek izmantotas partīcijas, sazinieties ar DB administratoru vai Zabbix atbalsta dienestu, lai saņemtu palīdzību.

CSV failus pēc veiksmīgas jaunināšanas uz primārajām atslēgām var noņemt.

Pēc izvēles Zabbix lietotāja saskarne var tikt pārslēgta uzturēšanas režīmā.

MySQL

Eksportēšana un importēšana jāveic tmux/screen vidē, lai nodrošinātu, ka sesija netiek pārtraukta.

Skatiet arī: Svarīgas piezīmes

MySQL 8.4+ ar mysqlsh

Šo metodi var izmantot ar darbojošos Zabbix serveris, taču ieteicams serveris apturēt uz jaunināšanas laiku. MySQL Shell (mysqlsh) jābūt instalētam un jāspēj izveidot savienojumu ar DB.

  • Piesakieties MySQL konsolē kā root (ieteicams) vai kā jebkurš lietotājs ar FILE privilēģijām.

  • Palaidiet MySQL ar iespējotu local_infile mainīgo.

  • Pārdēvējiet vecās tabulas un izveidojiet jaunas tabulas, palaižot history_upgrade_prepare.sql.

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix/sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
  • Eksportējiet un importējiet datus.

Izveidojiet savienojumu, izmantojot mysqlsh. Ja izmantojat savienojumu caur ligzdu, var būt nepieciešams norādīt ceļu.

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

Pārslēdzieties uz JavaScript režīmu, izmantojot:

\js

Pēc tam palaidiet tālāk norādīto kodu (CSVPATH var mainīt pēc nepieciešamības):

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

Ja saņemat ziņojumu "JavaScript is not supported", jūsu MySQL Shell instalācijai nav JS atbalsta. Šādā gadījumā instalējiet oficiālo MySQL Shell pakotni no Oracle (vai izveidojiet to no pirmkoda), lai JavaScript režīms būtu iespējots.

MariaDB/MySQL 8.4+ bez mysqlsh

Šī jaunināšanas metode aizņem vairāk laika, un tā jāizmanto tikai tad, ja jaunināšana ar mysqlsh nav iespējama.

Tabulu jaunināšana
  • Piesakieties MySQL konsolē kā root (ieteicams) vai kā jebkurš lietotājs ar FILE privilēģijām.

  • Ja migrāciju veicat ar darbojošos Zabbix serveri, palaidiet MySQL ar iespējotu local_infile mainīgo.

  • Pārdēvējiet vecās tabulas un izveidojiet jaunas tabulas, palaižot history_upgrade_prepare.sql:

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix/sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
Migrācija ar apturētu serveri

Pirms datu migrācijas ir jāatspējo max_execution_time (MySQL) vai max_statement_time (MariaDB), lai migrācijas laikā izvairītos no noildzes.

MySQL gadījumā:

SET @@max_execution_time=0;

MariaDB gadījumā:

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;

Lai dzēstu vecās tabulas, izpildiet pēcmigrācijas norādījumus.

Migrācija ar darbojošos serveri

Pārbaudiet, kuriem ceļiem ir iespējota importēšana/eksportēšana:

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

Ja secure_file_priv vērtība ir ceļš uz direktoriju, eksportēšana/importēšana tiks veikta failiem šajā direktorijā. Šajā gadījumā attiecīgi rediģējiet failu ceļus vaicājumos vai iestatiet secure_file_priv vērtību uz tukšu virkni jaunināšanas laikam.

Ja secure_file_priv vērtība ir tukša, eksportēšanu/importēšanu var veikt no jebkuras atrašanās vietas.

Ja secure_file_priv vērtība ir NULL, iestatiet to uz ceļu, kurā atrodas eksportētie tabulu dati (iepriekš minētajā piemērā — '/var/lib/mysql-files/').

Papildinformāciju skatiet MySQL dokumentācijā vai MariaDB dokumentācijā.

Pirms datu eksportēšanas ir jāatspējo max_execution_time (MySQL) vai max_statement_time (MariaDB), lai eksportēšanas laikā izvairītos no noildzes.

MySQL gadījumā:

SET @@max_execution_time=0;

MariaDB gadījumā:

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

Lai dzēstu vecās tabulas, izpildiet pēcmigrācijas norādījumus.

PostgreSQL

Eksportēšana un importēšana jāveic tmux/screen vidē, lai nodrošinātu, ka sesija netiek pārtraukta. Instalācijām ar TimescaleDB izlaidiet šo sadaļu un pārejiet uz PostgreSQL + TimescaleDB.

Skatiet arī: Svarīgas piezīmes

Tabulu jaunināšana

  • Pārdēvējiet tabulas, izmantojot history_upgrade_prepare.sql:
sudo -u zabbix psql zabbix < /usr/share/zabbix/sql-scripts/postgresql/option-patches/history_upgrade_prepare.sql

Migrēšana ar apturētu serveri

  • Eksportējiet pašreizējos vēstures datus, importējiet tos pagaidu tabulā un pēc tam ievietojiet datus jaunajās tabulās, ignorējot dublikātus:
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;

Skatiet ieteikumus INSERT veiktspējas uzlabošanai: PostgreSQL: Bulk Loading Huge Amounts of Data, Checkpoint Distance and Amount of WAL.

Migrēšana ar darbojošos serveri

  • Eksportējiet pašreizējo vēsturi, importējiet to pagaidu tabulā un pēc tam ievietojiet datus jaunajās tabulās, ignorējot dublikātus:
\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ēšana un importēšana jāveic tmux/screen vidē, lai nodrošinātu, ka sesija netiek pārtraukta. Jaunināšanas laikā Zabbix serverim jābūt apturētam.

Skatiet arī: Svarīgas piezīmes

  • Pārdēvējiet tabulas, izmantojot history_upgrade_prepare.sql.

    • Ja saspiešana ir iespējota (noklusējuma instalācijā), palaidiet skriptu no /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression:
      cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_prepare.sql | sudo -u zabbix psql zabbix
    • Ja saspiešana ir atspējota, palaidiet skriptu no /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression:
      cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_prepare.sql | sudo -u zabbix psql zabbix
  • Palaidiet TimescaleDB hypertable migrācijas skriptus atbilstoši saspiešanas iestatījumiem:

    • Ja saspiešana ir iespējota (noklusējuma instalācijā), palaidiet skriptus no /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression:
      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
    • Ja saspiešana ir atspējota, palaidiet skriptus no /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression:
      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

Skatiet arī: Padomi INSERT veiktspējas uzlabošanai.

Pēc migrācijas

Visām datubāzēm, kad migrācija ir pabeigta, veiciet tālāk norādītās darbības:

  • Pārbaudiet, vai viss darbojas, kā paredzēts.

  • Dzēsiet vecās tabulas:

DROP TABLE history_old;
DROP TABLE history_uint_old;
DROP TABLE history_str_old;
DROP TABLE history_log_old;
DROP TABLE history_text_old;
  • TimescaleDB gadījumā dzēsiet arī šo veco tabulu:
DROP TABLE trends_old;

Skatiet arī