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

Преглед

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Направите резервну копију ваше базе података.

Ако користите PostgreSQL/TimescaleDB, погледајте познате проблеме за враћање резервне копије PostgreSQL/TimescaleDB креиране у Zabbix-у 7.0.0-7.0.4.

  1. Покрените скрипте за своју базу података.
  2. Покрените Zabbix сервер.

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

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

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

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

MySQL

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

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

MySQL 8.0+ са mysqlsh

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

  • Пријавите се на 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-а. Ако користите socket конекцију, можда ће бити потребно навести путању.

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

Run (CSVPATH can be changed as needed):

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

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

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

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: Bulk Loading Huge Amounts of Data, Checkpoint Distance and Amount of 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,
           value varchar(255) DEFAULT '' 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

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

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

  • Преименујте табеле користећиhistory_upgrade_prepare.sql.
    • Ако је компресија омогућена, покрените скрипту из /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
    • Ако је компресија онемогућена, покрените скрипту из/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.

Oracle

Подршка за Oracle DB је застарела од Zabbix-а 7.0.

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

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

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

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

  • Преименујте табеле користећи history_pk_prepare.sql.
cd /usr/share/zabbix/zabbix-sql-scripts/database/oracle
       sqlplus zabbix/password@oracle_host/service
       sqlplus> @history_pk_prepare.sql

Групна миграција табела историје

  • Припремите директоријуме за Data Pump.

Data Pump мора имати дозволе за читање и писање у ове директоријуме.

Пример:

mkdir -pv /export/history
       chown -R oracle:oracle /export
  • Креирање објекта директоријума и додељивање дозвола за читање и писање кориснику који се користи за Zabbix аутентификацију ('zabbix' у примеру испод). Под улогом sysdba покрените:
create directory history as '/export/history';
       grant read,write on directory history to zabbix;
  • Извоз табела. Замените N са жељеним бројем нити.
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
  • Увоз табела. Замените N са жељеним бројем нити.
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=APPENDPARALLEL=N CONTENT=data_only

Индивидуална миграција историјских табела

  • Припремите директоријуме за Data Pump за сваку табелу историје. Data Pump мора имати дозволе за читање и писање у ове директоријуме.

Пример:

mkdir -pv /export/history /export/history_uint /export/history_str /export/history_log /export/history_text
       chown -R oracle:oracle /export
  • Креирајте објекат директоријума и доделите дозволе за читање и писање овом објекту кориснику који се користи за Zabbix аутентификацију ('zabbix' у примеру испод). Под улогом * sysdba* покрените:
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;
  • Извезите и увезите сваку табелу. Замените N са жељеним бројем нити.
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

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

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

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

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

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;

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