Всем привет! Мы делаем проекты по Zabbix, накопили большую экспертизу и решили сделать переводы нескольких статей, которые нам показались интересными и полезными. Наверняка, будут полезны и вам. Также своим опытом делимся в телеграм-канале zabbix_ru, где вы можете найти полезные материалы и записи наших вебинаров, опубликованных на нашем ютуб-канале (прим. переводчика).

В этой статье мы покажем вам, как перенести базу данных Zabbix из MySQL в PostgreSQL на Rocky Linux 9. Заодно покажем, как включить TimescaleDB, а также выполним некоторые базовые настройки производительности.

В статье предполагается, что если доступны необязательные патчи (ключи с плавающей точкой и первичные ключи ), то они уже применены к базе данных.
Если вы в этом не уверены, информация об этом статусе также отображается во фронтенде в разделе System information, например, «Database history tables upgraded: No».

Мы заранее предупреждаем вас, что вы осуществляете миграцию на свой страх и риск, и мы не несем ответственности за любой ущерб, вызванный непрофессиональным вмешательством.

Каждая версия Zabbix и версия базы данных имеет свою специфику, которую необходимо учитывать при составлении плана миграции и всех последующих действиях. По нашему опыту, значительная часть проблем после миграции (например, с очисткой) может проявиться только позже. Поэтому мы рекомендуем вам обратиться к нам за возможной консультацией, прежде чем вмешиваться в производственную среду. Мы будем рады помочь вам на протяжении всего процесса безупречной миграции и на всех последующих этапах.

Проверка версий

В качестве самого первого шага перед фактической миграцией вам необходимо узнать конкретную версию сервера Zabbix, которая РАБОТАЕТ в данный момент.
Это не та версия, которая отображается в нижнем колонтитуле веб-интерфейса!

Наиболее безопасно найти это в журнале самого сервера Zabbix при его запуске:

cat /var/log/zabbix/zabbix_server.log | grep "Starting Zabbix Server. Zabbix"

Вывод этой команды в нашем случае выглядит так:

1933256:20240510:164211.482 Starting Zabbix Server. Zabbix 7.0.0 (revision 9bc845eca94)

Другой вариант — узнать версию установочных пакетов библиотеки поддержки Zabbix для MySQL, которую можно увидеть с помощью приведенной ниже команды.

Но это может быть не текущая версия!

rpm -qa | grep zabbix-server-mysql

Вывод этой команды выглядит так:

zabbix-server-mysql-7.0.0-release1.el9.x86_64.rpm

Другой способ узнать версию сервера Zabbix — проверить её с помощью исполняемого файла zabbix_server. Однако даже эта информация может быть обманчивой при определённых обстоятельствах и может не соответствовать текущей версии.

zabbix_server -V

Тогда вывод будет выглядеть так:

zabbix_server (Zabbix) 7.0.0
Revision 9bc845eca94 4 June 2024, compilation time: Jun 4 2024 00:00:00

Этапы подготовки

Триггеры MySQL

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

Войдите в консоль MySQL:

mysql

Переключимся на базу данных «zabbix»:

use zabbix;

Затем мы вызовем команду SHOW TRIGGERS, которая покажет нам используемые триггеры базы данных (если таковые имеются):

SHOW TRIGGERS\G

Если вывод этой команды следующий, то вы можете смело пропустить часть с установкой триггеров в инструкции ниже.

Empty set (0.00 sec)

Пример вывода этой команды в Zabbix версии 6.0.11 можно увидеть здесь. На этом этапе вам придётся перейти к главе о миграции триггеров, упомянутой ниже.

*************************** 1. row ***************************
             Trigger: hosts_name_upper_insert
               Event: INSERT
               Table: hosts
           Statement: set new.name_upper=upper(new.name)
              Timing: BEFORE
             Created: 2024-02-27 09:59:58.09
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
             Definer: zabbix@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_bin
*************************** 2. row ***************************
             Trigger: hosts_name_upper_update
               Event: UPDATE
               Table: hosts
           Statement: begin
if new.name<>old.name
then
set new.name_upper=upper(new.name);
end if;
end
              Timing: BEFORE
             Created: 2024-02-27 09:59:58.10
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
             Definer: zabbix@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_bin
*************************** 3. row ***************************
             Trigger: items_name_upper_insert
               Event: INSERT
               Table: items
           Statement: set new.name_upper=upper(new.name)
              Timing: BEFORE
             Created: 2024-02-27 10:00:00.76
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
             Definer: zabbix@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_bin
*************************** 4. row ***************************
             Trigger: items_name_upper_update
               Event: UPDATE
               Table: items
           Statement: begin
if new.name<>old.name
then
set new.name_upper=upper(new.name);
end if;
end
              Timing: BEFORE
             Created: 2024-02-27 10:00:00.77
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
             Definer: zabbix@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_bin
4 rows in set (0.01 sec)

Установка зависимостей

Сначала мы добавляем официальный репозиторий PostgreSQL, который мы рекомендуем для установки. Инсталляционные пакеты из репозиториев RedHat существенно отличаются.Мы можем сделать это с помощью следующей команды:

yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Установите версию PostgreSQL, поддерживаемую Zabbix, которую вы можете найти в матрице совместимости на сайте Zabbix:

yum install postgresql16-server

Инициализируйте сервер базы данных PostgreSQL с помощью следующей команды:

/usr/pgsql-16/bin/postgresql-16-setup initdb

Запустите службу PostgreSQL и настройте ее на запуск при запуске сервера:

systemctl enable postgresql-16
systemctl start postgresql-16

Установите утилиту pgloader, используемую для переноса данных:

yum install pgloader

Для проверки версии используйте следующую команду pgloader:

pgloader -V

Вывод будет выглядеть так:

pgloader version "3.6.7"

Подготовка к миграции

Теперь создайте временную папку, в которой будут храниться файлы конфигурации, используемые при последующей миграции, и откройте ее:

mkdir /tmp/zabbix-db-migration/ && cd $_

Разбор схемы

Для самой миграции данных вам понадобится файл со схемой базы данных, который вы можете найти в официальном исходном коде Zabbix для вашей конкретной версии.

Обязательно измените эту команду в соответствии с вашей версией Zabbix!

Находясь во временной папке, созданной для миграции, загрузите исходный код для версии 7.0.0beta1 (или более свежей. -прим. переводчика) с помощью следующей команды:

wget https://cdn.zabbix.com/zabbix/sources/stable/7.0/zabbix-7.0.0.tar.gz

Распакуйте загруженный архив, содержащий исходный код Zabbix:

tar -zxvf zabbix-7.0.0.tar.gz

Откройте папку, в которой вы найдете схемы базы данных, по следующему пути:

cd /tmp/zabbix-db-migration/zabbix-7.0.0/database/postgresql/

Из файла единой схемы выберите только операции по созданию таблиц и триггеров и сохраните их в отдельном файле:

grep -v 'ALTER TABLE ONLY' schema.sql | grep -v INSERT | grep -v 'CREATE INDEX' | grep -v 'CREATE UNIQUE INDEX' > /tmp/zabbix-db-migration/create_tables.sql

Теперь этот файл содержит не только операции CREATE TABLE, но также операции и функции для триггеров, которые мы решаем индивидуально. Поэтому удалите из этого файла часть, создающую триггеры:

sed -i '/create\ or\ replace\ function/,$d' /tmp/zabbix-db-migration/create_tables.sql

А из файла единой схемы выберите только операции, связанные с триггерами:

awk '/INSERT INTO dbversion/{p=1;next} /ALTER TABLE/{p=0} p' schema.sql > /tmp/zabbix-db-migration/triggers.sql

Теперь можно двигаться дальше. Из того же файла со схемой базы данных выберите только операции по созданию индексов и сохраните их в отдельном файле:

grep -E 'CREATE INDEX|CREATE UNIQUE INDEX' schema.sql > /tmp/zabbix-db-migration/create_index.sql

Опять же, из этого унифицированного файла схемы выберите только операции ALTER и сохраните их в отдельном файле:

grep 'ALTER TABLE ONLY' schema.sql > /tmp/zabbix-db-migration/alter_table.sql

Подготовка PostgreSQL

Давайте создадим пользователя базы данных для Zabbix, вам будет предложено ввести пароль:

sudo -u postgres createuser --pwprompt zabbix

Далее создаем базу данных Zabbix:

sudo -u postgres createdb -O zabbix zabbix

Затем создайте схему Zabbix:

sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/create_tables.sql

Для совместимости с утилитой pgloader временно установите хеш шифрования на «md5» и измените пароль созданного пользователя базы данных, чтобы он был перегенерирован с использованием заданного алгоритма хеширования. Для простоты рекомендуется использовать тот же пароль, который вы ввели при создании этого пользователя.

sudo -u postgres psql -c "SET password_encryption='md5';"
sudo -u postgres psql -c "ALTER ROLE zabbix WITH PASSWORD '***********';"

Подготовка MySQL

Если в MySQL уже используется изменённый формат входа, то, как и в случае с PostgreSQL, для нужд pgloader необходимо изменить способ входа пользователя базы данных в Zabbix и одновременно сгенерировать пароль заново. Сделать это можно следующим образом.

Сначала откройте файл конфигурации сервера MySQL. Если вы используете другую версию, например, MariaDB или Percona, расположение файла может отличаться.

nano /etc/my.cnf.d/mysql-server.cnf

Здесь временно измените следующую директиву в [mysqld]разделе (server):

[mysqld]
...
default-authentication-plugin=mysql_native_password

Теперь необходимо перезапустить MySQL:

systemctl restart mysqld

Теперь вы можете изменить способ входа пользователя в Zabbix и сгенерировать пароль заново. Не забудьте сменить пароль на свой в команде ниже!

mysql -e "ALTER USER 'zabbix'@'localhost' IDENTIFIED WITH mysql_native_password BY '*********';"

Подготовьте файл конфигурации – скрипт SQL для pgloader, поэтому создайте этот файл:

nano /tmp/zabbix-db-migration/pgloader.conf

И заполните этот файл следующим содержимым. Не забудьте сменить пароли (отмеченные звёздочками) в этом скрипте на свои собственные, действительные пароли для обеих баз данных:

LOAD DATABASE
FROM mysql://zabbix:**********@127.0.0.1/zabbix
INTO postgresql://zabbix:**********@127.0.0.1/zabbix
WITH include no drop,
truncate,
create no tables,
create no indexes,
no foreign keys,
reset sequences,
data only,
prefetch rows = 1000,
batch rows = 1000,
batch concurrency = 1
ALTER SCHEMA 'zabbix' RENAME TO 'public';

Миграция

Теперь можно приступить к самой миграции. Рекомендуем вам сделать резервную копию исходной базы данных MySQL и убедиться, что на диске достаточно свободного места.

Сначала остановите службу сервера Zabbix и веб-сервер Apache:

systemctl stop zabbix-server httpd

Создайте папку для перенесенных данных из MySQL в нашей временной папке:

mkdir /tmp/zabbix-db-migration/data

И затем запустите pgloader с созданного вами файла конфигурации:

pgloader --root-dir=/tmp/zabbix-db-migration/data /tmp/zabbix-db-migration/pgloader.conf

Если во время работы pgloader появляются какие-либо предупреждения, их можно смело игнорировать — это не так уж важно. С другой стороны, существуют и более серьёзные проблемы, с которыми вы также можете столкнуться, например: небольшой объём доступного дискового пространства, задержки между базами данных (тайм-ауты), низкая скорость записи на диск (низкое количество операций ввода-вывода). Даже эти проблемы можно решить, но они требуют дальнейшего анализа и последующей индивидуальной настройки.

Пример вывода этой команды можно найти здесь:

2024-05-10T16:55:38.010000+01:00 LOG pgloader version "3.6.7~devel"
2024-05-10T16:55:38.174002+01:00 LOG Migrating from #<MYSQL-CONNECTION mysql://zabbix@127.0.0.1:3306/zabbix {100685C583}>
2024-05-10T16:55:38.175002+01:00 LOG Migrating into #<PGSQL-CONNECTION pgsql://zabbix@127.0.0.1:5432/zabbix {100685C713}>
2024-05-10T16:55:38.684006+01:00 WARNING Source column "public"."history_uint"."value" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."history_uint"."value".
2024-05-10T16:55:38.685006+01:00 WARNING Source column "public"."item_rtdata"."lastlogsize" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."item_rtdata"."lastlogsize".
2024-05-10T16:55:38.686006+01:00 WARNING Source column "public"."proxy_history"."lastlogsize" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."proxy_history"."lastlogsize".
2024-05-10T16:55:38.686006+01:00 WARNING Source column "public"."trends_uint"."value_min" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."trends_uint"."value_min".
2024-05-10T16:55:38.687006+01:00 WARNING Source column "public"."trends_uint"."value_avg" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."trends_uint"."value_avg".
2024-05-10T16:55:38.687006+01:00 WARNING Source column "public"."trends_uint"."value_max" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."trends_uint"."value_max".
2024-05-10T16:56:28.778334+01:00 ERROR Database error 23505: duplicate key value violates unique constraint "changelog_pkey"
DETAIL: Key (changelogid)=(16809) already exists.
CONTEXT: COPY changelog, line 1
2024-05-10T16:56:30.691348+01:00 LOG report summary reset
table name     errors       rows      bytes      total time
---------------------------------  ---------  ---------  ---------  --------------
fetch meta data          0        198                     0.121s
Truncate          0        198                     0.338s
---------------------------------  ---------  ---------  ---------  --------------
public.history          0    3899811   133.2 MB         39.021s
public.history_uint          0    2167293    66.0 MB         26.330s
public.trends          0     502182    27.5 MB          8.498s
public.items          0      12784     4.4 MB          1.488s
public.event_tag          0      13012   326.9 kB          0.942s
public.trigger_tag          0       7365   198.8 kB          1.411s
public.triggers          0       5546     1.4 MB          2.027s
public.graphs_items          0       4186   138.6 kB          2.082s
public.history_str          0       2923   233.3 kB          2.316s
public.item_condition          0       2445   123.0 kB          2.524s
public.widget_field          0       1875   103.9 kB          2.777s
public.graphs          0       1428   154.7 kB          3.150s
public.item_rtdata          0        957    16.0 kB          3.248s
public.host_tag          0        635    17.4 kB          3.486s
public.widget          0        467    14.2 kB          3.773s
public.host_hgset          0        307     2.5 kB          3.991s
public.profiles          0        265    13.2 kB          4.305s
public.dashboard_page          0        158     1.9 kB          4.515s
public.dashboard          0        154    10.5 kB          4.839s
public.images          0        187     1.9 MB          5.049s
public.task_check_now          0          0                     5.063s
public.lld_override_opdiscover          0         98     0.7 kB          5.114s
public.lld_override_opstatus          0         98     0.7 kB          5.217s
public.trigger_discovery          0         82     2.0 kB          5.339s
public.users_groups          0         64     0.5 kB          5.407s
public.user_ugset          0         61     0.3 kB          5.525s
public.graph_discovery          0         47     1.1 kB          5.643s
public.hosts_templates          0         31     0.5 kB          5.809s
public.problem          0         34     3.4 kB          6.004s
public.hstgrp          0         26     1.5 kB          6.212s
public.module          0         27     0.9 kB          6.343s
public.hgset          0         19     1.3 kB          6.497s
public.host_rtdata          0         13     0.1 kB          6.690s
public.expressions          0         10     0.5 kB          6.691s
public.escalations          0         15     0.7 kB          6.847s
public.permission          0          7     0.0 kB          6.810s
public.conditions          0          6     0.1 kB          6.961s
public.usrgrp          0          6     0.2 kB          6.958s
public.regexps          0          5     0.2 kB          7.101s
public.graph_theme          0          4     0.9 kB          7.071s
public.opmessage_grp          0          4     0.0 kB          7.248s
public.httpstepitem          0          3     0.0 kB          7.275s
public.scripts          0          3     0.3 kB          7.423s
public.sysmaps_links          0          3     0.4 kB          7.411s
public.acknowledges          0          1     0.0 kB          7.573s
public.interface_snmp          0          2     0.1 kB          7.510s
public.proxy          0          2     0.1 kB          7.738s
public.ugset          0          2     0.1 kB          7.531s
public.dchecks          0          1     0.0 kB          7.727s
public.autoreg_host          0          0                     7.722s
public.config_autoreg_tls          0          1     0.0 kB          7.899s
public.connector_tag          0          0                     7.852s
public.corr_condition_group          0          0                     7.925s
public.corr_condition_tagpair          0          0                     8.054s
public.corr_operation          0          0                     8.049s
public.dashboard_user          0          0                     8.200s
public.dhosts          0          1     0.0 kB          8.190s
public.dservices          0          1     0.2 kB          8.298s
public.globalmacro          0          1     0.0 kB          8.291s
public.group_discovery          0          0                     8.472s
public.history_log          0          0                     8.467s
public.httpstep          0          1     0.1 kB          8.693s
public.httptest          0          1     0.1 kB          8.688s
public.httptest_tag          0          0                     8.849s
public.icon_mapping          0          0                     8.821s
public.lld_override_ophistory          0          0                     9.102s
public.lld_override_opperiod          0          0                     8.981s
public.lld_override_optag          0          0                     9.132s
public.lld_override_optrends          0          0                     9.350s
public.maintenances          0          1     0.0 kB          9.347s
public.maintenances_hosts          0          1     0.0 kB          9.557s
public.opcommand          0          0                     9.548s
public.opcommand_hst          0          0                     9.736s
public.opgroup          0          1     0.0 kB          9.738s
public.opmessage_usr          0          0                     9.954s
public.optemplate          0          1     0.0 kB          9.950s
public.proxy_dhistory          0          0                    10.057s
public.report          0          0                    10.101s
public.report_user          0          0                    10.120s
public.scim_group          0          0                    10.198s
public.service_alarms          0          0                    10.219s
public.service_problem_tag          0          0                    10.271s
public.service_tag          0          0                    10.329s
public.services_links          0          0                    10.363s
public.sla_excluded_downtime          0          0                    10.401s
public.sla_service_tag          0          0                    10.487s
public.sysmap_element_url          0          0                    10.484s
public.sysmap_url          0          0                    10.618s
public.sysmap_usrgrp          0          0                    10.537s
public.sysmaps_link_triggers          0          0                    10.622s
public.task          0          0                    10.677s
public.task_close_problem          0          0                    10.752s
public.task_remote_command          0          0                    10.763s
public.task_result          0          0                    10.812s
public.token          0          0                    10.864s
public.user_scim_group          0          0                    10.940s
public.userdirectory_idpgroup          0          0                    10.955s
public.userdirectory_media          0          0                    11.072s
public.userdirectory_usrgrp          0          0                    11.029s
public.valuemap_mapping          0      30621   861.6 kB         11.359s
public.trends_uint          0     345750    11.3 MB          3.151s
public.item_tag          0      19823   598.5 kB          0.772s
public.item_preproc          0      11373   603.2 kB          0.888s
public.functions          0       9445   268.0 kB          1.304s
public.item_discovery          0       5629   129.7 kB          1.377s
public.hostmacro          0       4612   360.1 kB          1.518s
public.events          0       3494   252.6 kB          1.644s
public.alerts          0       3083   844.7 kB          1.838s
public.trigger_depends          0       1819    32.0 kB          2.011s
public.auditlog          0       5350   642.1 kB          2.329s
public.event_recovery          0       1362    27.6 kB          2.490s
public.item_rtname          0        917    60.6 kB          2.691s
public.media_type_param          0        555    22.0 kB          2.867s
public.hosts          0        318   133.3 kB          3.229s
public.hosts_groups          0        307     3.7 kB          3.413s
public.history_text          0        211     3.7 MB          3.957s
public.media_type_message          0        154    41.1 kB          4.150s
public.event_suppress          0        143     3.5 kB          4.421s
public.lld_macro_path          0        134     4.5 kB          4.481s
public.problem_tag          0        150     3.6 kB          4.600s
public.lld_override_operation          0         98     2.9 kB          4.726s
public.lld_override          0         95     3.7 kB          4.842s
public.lld_override_condition          0         85     3.6 kB          4.946s
public.users          0         63     7.8 kB          5.092s
public.ids          0         51     1.3 kB          5.177s
public.item_parameter          0         43     1.7 kB          5.288s
public.group_prototype          0         28     0.9 kB          5.371s
public.role_rule          0         27     0.8 kB          5.505s
public.interface          0         24     1.1 kB          5.670s
public.media_type          0         31   256.8 kB          5.707s
public.hgset_group          0         19     0.1 kB          5.649s
public.host_discovery          0         11     0.2 kB          5.789s
public.operations          0         10     0.2 kB          5.792s
public.opmessage          0          8     0.1 kB          5.806s
public.rights          0          7     0.1 kB          5.872s
public.sessions          0          6     0.5 kB          5.985s
public.actions          0          5     0.3 kB          5.883s
public.sysmaps_elements          0          5     0.8 kB          5.978s
public.housekeeper          0          4     0.1 kB          5.993s
public.role          0          4     0.1 kB          5.966s
public.httptestitem          0          3     0.0 kB          6.161s
public.sysmaps          0          3     0.2 kB          6.102s
public.ugset_group          0          3     0.0 kB          6.098s
public.dashboard_usrgrp          0          2     0.0 kB          6.088s
public.media          0          3     0.1 kB          6.262s
public.proxy_rtdata          0          2     0.0 kB          6.239s
public.config          0          1     0.7 kB          6.237s
public.ha_node          0          1     0.1 kB          6.223s
public.changelog          1          0                     6.382s
public.connector          0          0                     6.371s
public.corr_condition          0          0                     6.354s
public.corr_condition_tag          0          0                     6.365s
public.corr_condition_tagvalue          0          0                     6.487s
public.correlation          0          0                     6.505s
public.dbversion          0          1     0.0 kB          6.513s
public.drules          0          1     0.0 kB          6.500s
public.event_symptom          0          0                     6.610s
public.globalvars          0          1     0.0 kB          6.631s
public.history_bin          0          0                     6.634s
public.host_inventory          0          1     0.3 kB          6.640s
public.httpstep_field          0          0                     6.735s
public.httptest_field          0          0                     6.747s
public.icon_map          0          0                     6.771s
public.interface_discovery          0          0                     6.767s
public.lld_override_opinventory          0          0                     6.868s
public.lld_override_opseverity          0          0                     6.883s
public.lld_override_optemplate          0          0                     6.908s
public.maintenance_tag          0          0                     6.906s
public.maintenances_groups          0          0                     7.003s
public.maintenances_windows          0          1     0.0 kB          7.016s
public.opcommand_grp          0          0                     7.036s
public.opconditions          0          0                     7.031s
public.opinventory          0          0                     7.129s
public.optag          0          0                     7.147s
public.proxy_autoreg_host          0          0                     7.178s
public.proxy_history          0          0                     7.191s
public.report_param          0          0                     7.224s
public.report_usrgrp          0          0                     7.305s
public.script_param          0          0                     7.244s
public.service_problem          0          0                     7.348s
public.service_status_rule          0          0                     7.366s
public.services          0          0                     7.318s
public.sla          0          0                     7.411s
public.sla_schedule          0          0                     7.473s
public.sysmap_element_trigger          0          0                     7.455s
public.sysmap_shape          0          1     0.1 kB          7.407s
public.sysmap_user          0          0                     7.582s
public.sysmaps_element_tag          0          0                     7.602s
public.tag_filter          0          0                     7.517s
public.task_acknowledge          0          0                     7.653s
public.task_data          0          0                     7.574s
public.task_remote_command_result          0          0                     7.725s
public.timeperiods          0          1     0.0 kB          7.643s
public.trigger_queue          0          0                     7.726s
public.userdirectory          0          0                     7.770s
public.userdirectory_ldap          0          0                     7.744s
public.userdirectory_saml          0          0                     7.785s
public.valuemap          0        944    62.8 kB          7.835s
---------------------------------  ---------  ---------  ---------  --------------
COPY Threads Completion          0          4                    51.236s
Reset Sequences          0          1                     0.110s
Install Comments          0          0                     0.000s
---------------------------------  ---------  ---------  ---------  --------------
Total import time          1    7071507   255.7 MB         51.346s

После успешного завершения pgloader верните алгоритм хеширования к более безопасному значению «SCRAM-SHA-256» и заново сгенерируйте пароль пользователя базы данных. Замените звёздочки в следующей команде выбранным вами паролем:

sudo -u postgres psql -c "SET password_encryption='SCRAM-SHA-256';"
sudo -u postgres psql -c "ALTER ROLE zabbix WITH PASSWORD '************';"

Далее создадим схему для индексов:

sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/create_index.sql

А также схема для таблицы изменений:

sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/alter_table.sql

И наконец схема для триггеров:

sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/triggers.sql

После успешной миграции рекомендуем выполнить VACUUM для очистки базы данных:

sudo -u postgres vacuumdb --dbname=zabbix --analyze --username=postgres --jobs=$(grep -c processor /proc/cpuinfo)

Тестирование функциональности

Сначала удалите поддержку MySQL для Zabbix и интерфейса MySQL:

yum remove zabbix-server-mysql zabbix-web-mysql

Установите зависимости, необходимые для запуска сервера Zabbix с PostgreSQL, включая внешний интерфейс.

Внимание: при переустановке сервера Zabbix конфигурация в файле zabbix_server.conf будет утеряна! Рекомендуем сделать резервную копию перед установкой!

yum install zabbix-server-pgsql zabbix-web-pgsql zabbix-apache-conf

Откроем файл конфигурации сервера Zabbix:

nano /etc/zabbix/zabbix_server.conf

Здесь измените директиву конфигурации доступа к базе данных, указав новые учётные данные для PostgreSQL. Замените звёздочки текущим паролем пользователя zabbix:

DBPassword=*******

Теперь удалите старый файл конфигурации фронтенда MySQL:

rm /etc/zabbix/web/zabbix.conf.php

Перезапустите службы сервера Zabbix и веб-сервера Apache:

systemctl restart zabbix-server httpd

Проверьте файл журнала Zabbix, чтобы убедиться, что все работает и не имеет проблем.

nano /var/log/zabbix/zabbix_server.log

Используйте веб-браузер для подключения к URL-адресу интерфейса Zabbix и снова настройте интерфейс, на этот раз для PostgreSQL.

Сначала вас встретит начальный экран выбора языка:

Далее идет проверка необходимых версий и настроек, где мы уже видим установленную поддержку PostgreSQL:

На следующем этапе вам необходимо настроить базу данных, в которую вы внесете данные для входа, созданные на предыдущих этапах:

Выберите имя сервера Zabbix, часовой пояс и тему по умолчанию:

Осталось только проверить, что вы все правильно настроили, и подтвердить следующие выборы:

И теперь вы успешно подключили Zabbix frontend к PostgreSQL!

На этом этапе вы можете остановить сервер MySQL:

systemctl stop mysqld

Теперь MySQL можно полностью удалить. Данные (по стандартному пути /var/lib/mysql) не будут удалены, но мы рекомендуем удалить их, например, через 14 дней функциональной работы с PostgreSQL.

yum remove mysql

TimescaleDB

Установка и настройка

После успешного перехода с MySQL на PostgreSQL вам также предоставляется возможность еще больше повысить производительность Zabbix с помощью TimescaleDB.

Учитывая, что у вас уже есть распакованный файл с исходным кодом, который также содержит схемы установки базы данных для TimescaleDB, вы можете приступить к установке прямо сейчас.

Начнем с добавления официального репозитория:

tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/$(rpm -E %{rhel})/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOL

Установите необходимые пакеты:

yum install timescaledb-2-postgresql-16 timescaledb-2-loader-postgresql-16

Запустите утилиту timescaledb-tune и в качестве параметра передайте ей большее значение максимального количества подключений (–max-conns), для целей тестирования давайте установим его равным 125.

Эта утилита используется для настройки параметров PostgreSQL по умолчанию для повышения производительности и изменения параметров PostgreSQL для работы с TimescaleDB.

В то же время эта утилита поможет вам выбрать текущий и действительный файл конфигурации PostgreSQL с помощью мастера установки, а также настроит автоматическую загрузку библиотек TimescaleDB.

Ответьте «да» на все вопросы.

timescaledb-tune --pg-config /usr/pgsql-16/bin --max-conns=125

Затем завершите работу сервера Zabbix и перезапустите системную службу PostgreSQL:

systemctl stop zabbix-server
systemctl restart postgresql-16

Активируйте TimescaleDB для базы данных Zabbix:

echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql --dbname=zabbix

И загрузите данные из извлеченного файла схемы базы данных:

sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/zabbix-7.0.0/database/postgresql/timescaledb/schema.sql

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

systemctl start zabbix-server

Совместимость

Если в файле журнала вы видите сообщение о том, что версия TimescaleDB слишком новая, это не является большой проблемой. Zabbix не может достаточно быстро отреагировать на последние версии TimescaleDB, чтобы указать её поддержку в своём коде, но совместимость гарантируется Zabbix и проверена нами.

Если мы хотим это исправить, то просто откройте файл конфигурации сервера Zabbix по адресу /etc/zabbix/zabbix_server.conf и измените следующий параметр конфигурации соответствующим образом:

AllowUnsupportedDBVersions=1

Сохраните файл с этой новой настройкой и перезапустите системную службу сервера Zabbix:

systemctl restart zabbix-server

На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал zabbix_ru, где еще больше полезной информации.

Комментарии (4)


  1. Abyss777
    28.11.2025 11:47

    В статье не раскрыто:

    • Зачем это делать?

    • Что делать если mysql база весит 900 Гб ? А не 200 Мб как у вас.


    1. axel_rus
      28.11.2025 11:47

      Отвечу на ваш первый вопрос. Преимущество PostgreSQL в колоночном расширении TimescaleDB, которое позволяет эффективно удалять устаревшие данные при помощи удаления чанка вместо выполнения SQL-запроса, что нативно поддерживается Zabbix. В MySQL для эффективной работы с удалением исторических данных вам нужно пилить партиционирование, а потом настраивать сторонний скрипт, который будет по расписанию удалять ненужные партиции.


      1. Abyss777
        28.11.2025 11:47

        А если уже есть партиционирование? (ибо до 900 Гб без него не дожить) Есть еще какие-то преимущества?


        1. axel_rus
          28.11.2025 11:47

          Ну, если вы весело и счастливо живете с MySQL, то иных премуществ, кроме нативной поддержки, наверное, не смогу назвать.