Zabbix. Обновление базы данных до первичных ключей

Начиная с версии Zabbix 6.0 первичные ключи используются для всех таблиц в новых установках, но так как я обновлял Zabbix сервер до версии 6.4, то после обновления мне пришлось еще вручную обновить таблицы.

Перед обновлением в первую очередь откроем меню «Отчет» — «Информация о системе» и убедимся что ключи не используются, об этому будет свидетельствовать запись — «Database history tables use primary key — Нет», если ключи используются, то этой записи просто не будет.

База данных у меня была на mysql 8.0.32-0ubuntu0.22.04.2.
Я установил screen и zabbix-sql-scripts, так как понадобится скрипт history_pk_prepare.sql:

apt install zabbix-sql-scripts screen

Остановил Zabbix сервер:

service zabbix-server stop

Создадим сессию с именем zabbix, например использовав screen, чтобы если во время выполнения sql, оборвется связь с сервером, то процесс продолжит выполняться:

screen -S zabbix

Потом если что, подключиться к сессии можно так:

screen -r zabbix

Теперь выполним SQL запросы из файла history_pk_prepare.sql:

mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/history_pk_prepare.sql

Если что вот содержимое файла history_pk_prepare.sql, как видим существующие таблицы истории переименовываются и создаются пустые новые:

RENAME TABLE history TO history_old;
CREATE TABLE `history` (
        `itemid` bigint unsigned NOT NULL,
        `clock` integer DEFAULT '0' NOT NULL,
        `value` DOUBLE PRECISION DEFAULT '0.0000' NOT NULL,
        `ns` integer DEFAULT '0' NOT NULL,
        PRIMARY KEY (itemid,clock,ns)
) ENGINE=InnoDB;

RENAME TABLE history_uint TO history_uint_old;
CREATE TABLE `history_uint` (
        `itemid` bigint unsigned NOT NULL,
        `clock` integer DEFAULT '0' NOT NULL,
        `value` bigint unsigned DEFAULT '0' NOT NULL,
        `ns` integer DEFAULT '0' NOT NULL,
        PRIMARY KEY (itemid,clock,ns)
) ENGINE=InnoDB;

RENAME TABLE history_str TO history_str_old;
CREATE TABLE `history_str` (
        `itemid` bigint unsigned NOT NULL,
        `clock` integer DEFAULT '0' NOT NULL,
        `value` varchar(255) DEFAULT '' NOT NULL,
        `ns` integer DEFAULT '0' NOT NULL,
        PRIMARY KEY (itemid,clock,ns)
) ENGINE=InnoDB;

RENAME TABLE history_log TO history_log_old;
CREATE TABLE `history_log` (
        `itemid` bigint unsigned 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 NOT NULL,
        `logeventid` integer DEFAULT '0' NOT NULL,
        `ns` integer DEFAULT '0' NOT NULL,
        PRIMARY KEY (itemid,clock,ns)
) ENGINE=InnoDB;

RENAME TABLE history_text TO history_text_old;
CREATE TABLE `history_text` (
        `itemid` bigint unsigned NOT NULL,
        `clock` integer DEFAULT '0' NOT NULL,
        `value` text NOT NULL,
        `ns` integer DEFAULT '0' NOT NULL,
        PRIMARY KEY (itemid,clock,ns)
) ENGINE=InnoDB;

Теперь подключимся к mysql серверу и выберем базу данных zabbix:

mysql
use zabbix;

Уберем ограничение max_execution_time, чтобы выполнение sql запроса не оборвалось и скопируем данные из старых таблиц в новые:

SHOW VARIABLES LIKE '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;

Если что, вот пример сколько у меня длилось выполнение этих sql запросов на сервере с зеркальным SSD рейдом и процессором Intel® Xeon® E3-1230 (как видим дольше всего таблица history — полторы минуты, в которой почти 8 миллионов записей):

INSERT IGNORE INTO history SELECT * FROM history_old;
Query OK, 7856643 rows affected (1 min 31.30 sec)
Records: 7856643  Duplicates: 0  Warnings: 0

 INSERT IGNORE INTO history_uint SELECT * FROM history_uint_old;
Query OK, 2617069 rows affected (34.44 sec)
Records: 2617069  Duplicates: 0  Warnings: 0

INSERT IGNORE INTO history_str SELECT * FROM history_str_old;
Query OK, 12282 rows affected (1.08 sec)
Records: 12282  Duplicates: 0  Warnings: 0

 INSERT IGNORE INTO history_log SELECT * FROM history_log_old;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

 INSERT IGNORE INTO history_text SELECT * FROM history_text_old;
Query OK, 605 rows affected (0.94 sec)
Records: 605  Duplicates: 0  Warnings: 0

Теперь можно запустить Zabbix сервер:

service zabbix-server start

По окончанию переноса данных в новые таблицы, удалим старые:

DROP TABLE history_old;
DROP TABLE history_uint_old;
DROP TABLE history_str_old;
DROP TABLE history_log_old;
DROP TABLE history_text_old;

Смотрите другие мои статьи про Zabbix

Вливайтесь в общение

1 комментарий

Добавить комментарий