Начиная с версии 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
Ты лучший! Спасибо!