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.0+ ar mysqlsh

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

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

  • Startējiet MySQL ar iespējotu mainīgo local_infile.

  • Pārdēvējiet vecās tabulas un izveidojiet jaunas tabulas, izpildot 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 tiek izmantots savienojums ar socket, 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 izpildiet tālāk redzamo kodu (CSVPATH var mainīt pēc vajadzī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. Tādā gadījumā instalējiet oficiālo MySQL Shell pakotni no Oracle (vai izveidojiet to no pirmkoda), lai būtu iespējots JavaScript režīms.

MariaDB/MySQL 8.0+ 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 jebkurš lietotājs ar FILE privilēģijām.

  • Ja migrācija tiek veikta, kamēr darbojas Zabbix serveris, startējiet MySQL ar iespējotu local_infile mainīgo.

  • Pārdēvējiet vecās tabulas un izveidojiet jaunas tabulas, izpildot 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

max_execution_time (MySQL) vai max_statement_time (MariaDB) pirms datu migrācijas ir jāatspējo, lai migrācijas laikā nerastos noildze.

MySQL:

SET @@max_execution_time=0;

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;

Lai dzēstu vecās tabulas, izpildiet pēc migrā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 direktorijas ceļš, eksportēšana/importēšana tiks veikta šajā direktorijā esošajiem failiem. Šādā gadījumā attiecīgi rediģējiet failu ceļus vaicājumos vai jaunināšanas laikā iestatiet secure_file_priv vērtību uz tukšu virkni.

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šējā piemērā - '/var/lib/mysql-files/').

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

max_execution_time (MySQL) vai max_statement_time (MariaDB) pirms datu eksportēšanas ir jāatspējo, lai eksportēšanas laikā nerastos noildze.

MySQL:

SET @@max_execution_time=0;

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

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

PostgreSQL

Eksportēšana un importēšana jāveic tmux/screen, lai nodrošinātu, ka sesija netiek pārtraukta. Instalācijām ar TimescaleDB izlaidiet šo sadaļu un turpiniet ar 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ācija ar apturētu serveri

  • Eksportējiet pašreizējo vēsturi, importējiet to pagaidu tabulā, 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 padomus INSERT veiktspējas uzlabošanai: PostgreSQL: Bulk Loading Huge Amounts of Data, Checkpoint Distance and Amount of WAL.

Migrācija ar darbojošos serveri

  • Eksportējiet pašreizējo vēsturi, importējiet to pagaidu tabulā, 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, lai nodrošinātu, ka sesija netiek pārtraukta. Zabbix serverim jaunināšanas laikā 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ī