3 Надоградња базе података на примарне кључеве

Преглед

Овај одељак пружа упутства за ручно надоградњу табела у постојећим инсталацијама на примарне кључеве.

Надоградња на примарне кључеве оптимизује начин индексирања и приступа подацима, што може убрзати упите и уштедети простор. Такође побољшава управљање подацима и синхронизацију у кластерованим подешавањима, помажући у скалирању и осигуравајући да систем остане поуздан чак и ако неки сервери откажу.

Упутства дата на овој страници су намењена напредним корисницима и можда ће бити потребно прилагодити их вашој специфичној конфигурацији. Надоградња на примарне кључеве може бити дуготрајна и захтевати много ресурса.Уверите се да је доступно довољно слободног простора на диску; у зависности од величине ваше базе података и сачуваних података, процес може захтевати до 2,5 пута више простора него што тренутно користе табеле историје.

Примарни кључеви се користе за све табеле у новим инсталацијама од Zabbix-а 6.0.

Не постоји аутоматска надоградња базе података на примарне кључеве; Међутим, постојеће инсталације могу се ручно надоградити након надоградње Zabbix сервера на 6.0 или новију верзију.

Од Zabbix-а 7.0, надоградња табела на примарне кључеве такође надограђује табеле да користе типове података двоструке прецизности.

Ако имате Zabbix 7.0 (или новију верзију), табеле већ користе двоструку прецизност.Међутим, упутства на овој страници се и даље могу пратити да бисте надоградили табеле на примарне кључеве без утицаја на табеле које већ користе двоструку прецизност.

Ако имате Zabbix 6.4 (или старију верзију), прво размислите о надоградњи табела на двоструку прецизност.За више информација погледајте Надоградња на нумеричке вредности проширеног опсега у Zabbix 7.0 документацији.

Упутства су доступна за:

Важне напомене

Да бисте извршили надоградњу базе података:

  1. Зауставите Zabbix сервер.

Заустављање Zabbix сервера за време надоградње се топло препоручује. Међутим, ако је апсолутно неопходно, можете извршити надоградњу док сервер ради (само за MySQL, MariaDB и PostgreSQL без TimescaleDB).

  1. Направите резервну копију базе података.
  2. Инсталирајте најновији zabbix-sql-scripts пакет компатибилан са вашом Zabbix верзијом (нпр. за RHEL: dnf install zabbix-sql-scripts).
  3. Покрените скрипте за вашу базу података.
  4. Покрените Zabbix сервер.

Покрените скрипте само за базу података сервера. Прокси неће имати користи од ове надоградње.

Ако база података користи партиције, контактирајте администратора базе података или Zabbix подршку за помоћ.

CSV датотеке се могу уклонити након успешне надоградње на примарне кључеве.

Опционо, Zabbix кориснички интерфејс се може пребацити на режим одржавања.

MySQL

Извоз и увоз морају да се изврше у tmux/screen како би се осигурало да сесија не буде прекинута.

Такође погледајте: Важне напомене

MySQL 8.0+ са mysqlsh

Ова метода се може користити са покренутим Zabbix сервером, али се препоручује да се сервер заустави током надоградње. MySQL Shell (mysqlsh) мора бити инсталиран и мора бити у могућности да се повеже са базом података.

  • Пријавите се на MySQL конзолу као root (препоручено) или као било који корисник са FILE привилегијама.

  • Покрените MySQL са омогућеном променљивом local_infile.

  • Преименујте старе табеле и креирајте нове табеле покретањем history_upgrade_prepare.sql.

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix/sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
  • Извозите и увозите податке.

Повежите се преко mysqlsh. Ако користите сокет конекцију, може бити потребно навести путању.

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

Пребаците се у JavaScript режим користећи:

\js

Затим покрените код испод (CSVPATH се може променити по потреби):

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", „табела“: „историја_уинт“ });
       
       util.exportTable(„историја_стр_стара“, CSVPATH +/историја_стр.цсв“, { дијалект: „цсв“ });
       util.importTable(CSVPATH +/историја_стр.цсв“, {„дијалект“: „цсв“, „табела“: „историја_стр“ });
       
       util.exportTable(„историја_лог_стара“, CSVPATH +/историја_лог.цсв“, { дијалект: „цсв“ });
       util.importTable(CSVPATH +/историја_лог.цсв“, {„дијалект“: „цсв“, „табела“: „историја_лог“ });
       
       util.exportTable(„историја_текст_стара“, CSVPATH +/историја_текст.цсв“, { дијалект: „цсв“ });
       util.importTable(CSVPATH +/историја_текст.цсв“, { „дијалект“: „цсв“, „табела“: „историја_текст“ });

Ако ви Ако добијете поруку "JavaScript није подржан", вашој MySQL Shell инсталацији недостаје JS подршка. У том случају, инсталирајте званични MySQL Shell пакет од Oracle-а (или га направите из изворног кода) тако да је JavaScript режим омогућен.

MariaDB/MySQL 8.0+ без mysqlsh

Овај метод надоградње захтева више времена и требало би га користити само ако надоградња са mysqlsh није могућа.

Надоградња табеле
  • Пријавите се на MySQL конзолу као root (препоручено) или било који корисник са FILE привилегијама.

  • Покрените MySQL са омогућеном променљивом local_infile.

  • Преименујте старе табеле и креирајте нове табеле покретањем history_upgrade_prepare.sql:

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix/sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
Миграција са заустављеним сервером

max_execution_time мора бити онемогућена пре миграције података како би се избегло време чекања током миграције.

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;

Пратите упутства након миграције да бисте избацили старе табеле.

Миграција са покренутим сервером

Проверите за које путање је омогућен увоз/извоз:

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

Ако је вредност secure_file_priv путања до директоријума, извоз/увоз ће се извршити за датотеке у том директоријуму. У овом случају, измените путање до датотека у упитима у складу са тим или поставите вредност secure_file_priv на празан стринг за време надоградње.

Ако је вредност secure_file_priv празна, извоз/увоз се може извршити са било које локације.

Ако је вредност secure_file_priv NULL, подесите је на путању која садржи извезене податке табеле („/var/lib/mysql-files/“ у горњем примеру).

За више информација, погледајте MySQL документацију.

Опција max_execution_time мора бити онемогућена пре извоза података како би се избегло истека времена током извоза.

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' ИГНОРИШИ У ТАБЕЛУ 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';

Пратите упутства након миграције да бисте уклонили старе табеле.

PostgreSQL

Извоз и увоз морају се извршити у tmux/screen како би се осигурало да се сесија не прекине. За инсталације са TimescaleDB, прескочите овај одељак и пређите на PostgreSQL + TimescaleDB.

Погледајте такође: Важне напомене

Надоградња табеле

  • Преименујте табеле користећи history_upgrade_prepare.sql:
sudo -u zabbix psql zabbix < /usr/share/zabbix/sql-scripts/postgresql/option-patches/history_upgrade_prepare.sql

Миграција са заустављеним сервером

  • Извезите тренутну историју, увезите је у привремену табелу, а затим уметните податке у нове табеле игноришући дупликате:
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;

Погледајте савете за побољшање перформанси INSERT-а: PostgreSQL: Масовно учитавање огромних количина података, Удаљеност контролних тачака и количина WAL-а.

Миграција са покренутим сервером

  • Извезите тренутну историју, увезите је у привремену табелу, а затим уметните податке у нове табеле игноришући дупликате:
\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,
          valu  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

Извоз и увоз морају се извршити у tmux/screen како би се осигурало да се сесија не прекине. Zabbix сервер треба да буде у квару током надоградње.

Погледајте такође: Важне напомене

  • Преименујте табеле користећи history_upgrade_prepare.sql.* Ако је компресија омогућена (при подразумеваној инсталацији), покрените скрипту из /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression: bash cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_prepare.sql | sudo -u zabbix psql zabbix

    • Ако је компресија онемогућена, покрените скрипту из /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
  • Покрените скрипте за миграцију хипертабеле TimescaleDB на основу подешавања компресије:

    • Ако је компресија омогућена (при подразумеваној инсталацији), покрените скрипте из /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
    • Ако је компресија онемогућена, покрените скрипте из /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

Погледајте такође: Савети за побољшање перформанси INSERT-а.

Пост-миграција

За све базе података, када се миграција заврши, урадите следеће:

  • Проверите да ли све ради како се очекује.

  • Обришите старе табеле:

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, такође обришите следећу стару табелу::
DROP TABLE trends_old;

Погледајте такође