Поиск по сайту
Интересуешься IT и системным администрированием? Подпишись на наш канал, где мы делимся инсайдами, новостями и практическими советами! Прокачай свои навыки вместе с нами!
Как мигрировать базу данных Zabbix с MySQL на PostgreSQL
Ни для кого не секрет, что Zabbix поддерживает шесть или семь разных движков баз данных. Однако на практике самыми популярными остаются MySQL и PostgreSQL. Пользователи часто делятся на два лагеря: одни отдают предпочтение MySQL, другие выбирают исключительно PostgreSQL. Но рано или поздно и те, и другие могут столкнуться с необходимостью миграции с одного движка базы данных на другой.
В этой статье мы рассмотрим именно такой случай: перенос Zabbix с MySQL на PostgreSQL. Разберём, почему это может понадобиться, и как грамотно подойти к процессу.
Онлайн-курс: Zabbix 6. Мониторинг IT инфраструктуры предприятия.
Курс предлагает глубокое изучение Zabbix 6 и охватывает все ключевые аспекты: от установки и конфигурации до продвинутого мониторинга и автоматизации. Курс подходит как для начинающих, так и для опытных администраторов.
Содержание:
Проверка версий
Первый и важнейший момент, на который следует обратить внимание для успешной миграции, — это наличие применённых дополнительных исправлений, таких как обновления для плавающих и первичных ключей, если они доступны. Проверить это можно в веб-интерфейсе Zabbix, в разделе «Информация о системе». Там должен быть пункт: Database history tables upgraded: No или по-русски: Таблицы истории базы данных обновлены: Нет.
В моём случае этот пункт отсутствует, что означает, что все необходимые исправления уже применены, и я могу смело переходить к процессу миграции.
Важно! Перед началом миграции я настоятельно рекомендую сделать резервную копию вашей текущей базы данных. Минимум — это создание снапшота, максимум — полноценный бэкап. Это особенно актуально, если вы работаете с боевой базой данных. Лучше перестраховаться, чтобы избежать потери данных в случае непредвиденных проблем.
Коллеги, каждая версия Zabbix и используемой базы данных имеет свои нюансы, которые обязательно нужно учитывать при планировании миграции и выполнении всех последующих шагов. Из моего опыта, а также опыта коллег, большая часть проблем после миграции (например, связанных с корректностью работы учета) зачастую проявляется не сразу, а спустя какое-то время.
Именно поэтому резервная копия базы данных или даже всей машины целиком — это не просто формальность, а настоящая гарантия сохранения ваших данных и, что немаловажно, ваших нервов. Не пренебрегайте этим шагом!
Перед началом миграции важно определить, какая именно версия Zabbix сервера у вас установлена и запущена. Узнать это можно с помощью команды zabbix_server -V
zabbix_server -V
zabbix_server (Zabbix) 7.0.6
Revision c1d7a081969 20 November 2024, compilation time: Nov 20 2024 07:51:53
Copyright (C) 2024 Zabbix SIA
License AGPLv3: GNU Affero General Public License version 3 .
This is free software: you are free to change and redistribute it according to
the license. There is NO WARRANTY, to the extent permitted by law.
This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit (http://www.openssl.org/).
Compiled with OpenSSL 3.0.13 30 Jan 2024
Running with OpenSSL 3.0.13 30 Jan 2024
В моём случае команда показала, что у меня установлена версия Zabbix сервера 7.0.6. Этот шаг крайне важен, так как версия сервера влияет на процесс миграции и требуемые действия.
Подготовительный этап
Хочу акцентировать внимание на важном моменте: начиная с версии Zabbix 6.0.11, в системе появились триггеры базы данных. Эти триггеры нужно учитывать при выполнении миграции, чтобы избежать проблем в работе системы.
Давайте проверим наличие триггеров в нашей базе данных. Для этого переходим в режим управления MySQL.
- Открываем MySQL:
mysql
- Выбираем базу данных zabbix:
use zabbix;
- Проверяем наличие триггеров с помощью команды:
SHOW TRIGGERS\G
...
Created: 2024-12-05 21:43:31.74
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
*************************** 65. row ***************************
Trigger: triggers_delete
Event: DELETE
Table: triggers
Statement: insert into changelog (object,objectid,operation,clock)
values (5,old.triggerid,3,unix_timestamp())
Timing: BEFORE
Created: 2024-12-05 21:43:31.75
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
65 rows in set (0.01 sec)
Если триггеры существуют, команда отобразит их список. В моём случае триггеры присутствуют, и их ровно 65 штук (65. row). Это подтверждает, что миграцию необходимо выполнить с учётом этих триггеров.
Установка зависимостей
Следующий шаг — это установка необходимых зависимостей, а именно базы данных PostgreSQL. Для начала выходим из режима управления MySQL:
exit;
Теперь приступим к установке PostgreSQL. Установить PostgreSQL можно несколькими способами. Самый простой — это команда:
apt install postgresql
Она установит PostgreSQL из стандартного репозитория Ubuntu сервера. Однако тут есть важный нюанс: если вы используете, например, Ubuntu 20.04, последняя версия PostgreSQL в её репозиториях — это 12.9 (если не ошибаюсь). А эта версия официально не поддерживается Zabbix 6, который требует как минимум PostgreSQL версии 13.
Конечно, есть обходной путь: можно настроить Zabbix 6 для работы с PostgreSQL 12, изменив параметр конфигурационного файла Zabbix-сервера:
AllowUnsupportedDBVersions=1
Этот параметр позволяет серверу работать с неподдерживаемыми версиями баз данных. Но я настоятельно не рекомендую идти по этому пути, так как это может вызвать проблемы в будущем.
Если вы, как и я, используете Zabbix 7 на Ubuntu 24.04, вы можете просто установить PostgreSQL с помощью команды apt install postgresql.
apt install postgresql
В этом случае следующий раздел можно смело пропускать и переходить к следующему шагу.
Однако, если вы работаете с Zabbix 6 на Ubuntu 20.04, обратите внимание на следующий раздел — он специально для вас!
Установка PostgreSQL на Ubuntu 20.04
Мы будем устанавливать последнюю актуальную версию PostgreSQL. Это более безопасный и надёжный подход, который обеспечит стабильную работу Zabbix.
Первым шагом для установки PostgreSQL является добавление в систему официального пакета установки от разработчиков PostgreSQL. Для этого выполняем следующую команду:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
После этого необходимо добавить ключ данного пакета, так как он является сторонним, а не родным для системы. Добавляем ключ с помощью команды:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
Теперь обновляем списки пакетов, чтобы система смогла получить доступ к последней версии PostgreSQL:
sudo apt update
Когда пакеты обновлены, можно приступать к установке PostgreSQL. Установка из сторонних пакетов ничем не отличается от стандартной:
sudo apt -y install postgresql
Кстати, если вы хотите установить не последнюю версию PostgreSQL, а минимально поддерживаемую для Zabbix 6 (например, PostgreSQL 13), это также легко сделать, просто указав конкретную версию в команде установки. Например:
sudo apt install postgresql-13
После завершения установки давайте проверим, какая версия PostgreSQL была установлена:
psql --version
psql (PostgreSQL) 16.6 (Ubuntu 16.6-0ubuntu0.24.04.1)
В моём случае установилась версия PostgreSQL 16.6, которая на сегодняшний день является последней.
PostgreSQL установлен, двигаемся дальше!
Для следующего шага нам потребуется установить утилиту pgloader, которая используется для миграции данных. Однако важно отметить, что установка pgloader из официального репозитория Ubuntu может привести к различным ошибкам при миграции. Например, я лично столкнулся с двумя:
- FATAL error: 76 fell through ECASE expression (Фатальная ошибка: значение 76 не соответствует выражению ECASE).
- DB-CONNECTION-ERROR: Failed to connect to pgsql at "127.0.0.1" (port 5432) as user "zabbix": 10 fell through ECASE expression (Не удалось подключиться к pgsql по адресу "127.0.0.1" (порт 5432): значение 10 не соответствует выражению ECASE).
Чтобы избежать подобных проблем, я рекомендую не использовать репозитории Ubuntu, а собирать pgloader из исходников. Такой способ установки поддерживается в Linux.
Установка зависимостей
Для начала установим необходимые зависимости с помощью команды:
sudo apt install sbcl unzip libsqlite3-dev gawk curl make freetds-dev libzip-dev
Скачивание исходников pgloader
Теперь загрузим последнюю доступную версию утилиты pgloader из репозитория GitHub. На момент написания этой инструкции последней версией является 3.6.9. Если к моменту вашей установки выйдет более свежая версия, замените URL в следующей команде:
wget https://github.com/dimitri/pgloader/archive/refs/tags/v3.6.9.tar.gz
Распаковка архива
После завершения загрузки распаковываем скачанный архив:
tar xvf v3.6.9.tar.gz
Переход в директорию
Переходим в распакованную папку:
cd pgloader-3.6.9
Компиляция pgloader
Теперь приступаем к компиляции утилиты pgloader. Для этого используем команду:
make pgloader
Процесс компиляции может занять некоторое время, поэтому немного подождём. Как только он завершится, pgloader будет готов к использованию!
После завершения компиляции давайте переместим скомпилированный файл pgloader в каталог /usr/local/bin, чтобы он стал доступен для выполнения из любого места. Выполняем команду:
sudo mv ./build/bin/pgloader /usr/local/bin/
Теперь проверим установленную версию pgloader. Для этого используем следующую команду:
pgloader --version
pgloader version "3.6.7~devel"
compiled with SBCL 2.2.9.debian
Как видите, у нас установилась версия pgLoader 3.6.7 с пометкой devel, что означает, что это версия для разработчиков. Это нормально для сборки из исходников и вполне подходит для выполнения миграции. Всё готово, двигаемся дальше!
Подготовка к миграции
Теперь мы переходим к процессу подготовки к миграции. Первым шагом необходимо создать временную папку, где будут храниться файлы конфигурации, используемые в процессе переноса. Создадим эту папку и сразу перейдём в неё. Для этого используем следующую команду:
mkdir /tmp/zabbix-db-migration/ && cd $_
Эта команда создаёт папку /tmp/zabbix-db-migration/ и автоматически переключает текущую директорию на неё. Теперь мы готовы к следующему этапу подготовки!
Разбор схемы
Для переноса данных нам понадобится файл со схемой базы данных, который находится в официальном исходном коде Zabbix, соответствующем установленной версии сервера. В моём случае это Zabbix 7.0.6. Давайте разберёмся, как найти этот файл.
- Переходим на страницу загрузки Zabbix
Выбираем версию 7.0.6 и подходящую операционную систему.
- Находим нужный файл схемы:
В документации и инструкции загрузки указана команда для извлечения файла:
Этот файл содержит всю информацию о структуре базы данных, включая данные, изображения и схему.
- Используем только схему базы данных:
Так как в процессе миграции мы будем переносить данные и изображения из текущей базы данных MySQL, нам потребуется исключительно схема из этого файла. Мы извлечём её отдельно, чтобы избежать дублирования данных и оптимизировать процесс миграции.
Давайте приступим к извлечению схемы из указанного файла! Для загрузки и извлечения схемы базы данных выполним следующие шаги:
- Переход на источник загрузки Zabbix
Выбираем версию Zabbix, соответствующую вашей установке. В моём случае это версия 7.0.
Затем снова выбираем версию Zabbix, которая соответствует вашей установке. В моём случае это версия 7.0.6. Нас будет интересовать файл с расширением .tar.gz, например, в моём случае это zabbix-7.0.6.tar.gz.
- Загружаем файл на сервер
Используем команду:
wget https://cdn.zabbix.com/zabbix/sources/stable/7.0/zabbix-7.0.6.tar.gz
- Распаковываем архив
После успешной загрузки выполняем распаковку файла:
tar -zxvf zabbix-7.0.6.tar.gz
- Проверяем содержимое папки
Просматриваем содержимое, чтобы убедиться, что архив распакован корректно:
ls
zabbix-7.0.6 zabbix-7.0.6.tar.gz
Теперь вы должны увидеть папку zabbix-7.0.6, в которой находится всё содержимое исходного кода Zabbix.
- Удаляем архив, чтобы освободить место на диске
Поскольку сам архив нам больше не нужен, удаляем его:
rm -rf zabbix-7.0.6.tar.gz
Теперь мы готовы работать с файлом схемы, находящимся в распакованной папке.
Двигаемся дальше!
Теперь переходим в только что распакованную папку Zabbix. Выполняем следующие шаги:
- Переход в папку Zabbix 7.0.6
cd zabbix-7.0.6/
- Просмотр содержимого папки
Чтобы увидеть содержимое папки в более читабельном виде, используем команду ll
ll
total 2768
drwxr-xr-x 13 lunin lunin 4096 Nov 20 10:51 ./
drwxr-xr-x 3 root root 4096 Dec 10 17:23 ../
-rw-r--r-- 1 lunin lunin 55753 Nov 20 10:50 aclocal.m4
-rw-r--r-- 1 lunin lunin 98 Nov 20 10:50 AUTHORS
drwxr-xr-x 4 lunin lunin 4096 Nov 20 10:50 bin/
drwxr-xr-x 5 lunin lunin 4096 Nov 20 10:50 build/
-rw-r--r-- 1 lunin lunin 1803663 Nov 20 10:50 ChangeLog
-rwxr-xr-x 1 lunin lunin 7400 Mar 18 2022 compile*
drwxr-xr-x 3 lunin lunin 4096 Nov 20 10:50 conf/
-rwxr-xr-x 1 lunin lunin 49482 Jan 31 2022 config.guess*
-rwxr-xr-x 1 lunin lunin 35406 Jan 31 2022 config.sub*
-rwxr-xr-x 1 lunin lunin 589336 Nov 20 10:50 configure*
-rw-r--r-- 1 lunin lunin 72900 Nov 20 10:50 configure.ac
-rw-r--r-- 1 lunin lunin 34523 Nov 20 10:50 COPYING
drwxr-xr-x 7 lunin lunin 4096 Nov 20 10:51 database/
-rwxr-xr-x 1 lunin lunin 23568 Mar 18 2022 depcomp*
drwxr-xr-x 4 lunin lunin 4096 Nov 20 10:51 include/
-rw-r--r-- 1 lunin lunin 83 Nov 20 10:50 INSTALL
-rwxr-xr-x 1 lunin lunin 15358 Mar 18 2022 install-sh*
drwxr-xr-x 2 lunin lunin 4096 Nov 20 10:51 m4/
-rw-r--r-- 1 lunin lunin 7786 Nov 20 10:50 Makefile.am
-rw-r--r-- 1 lunin lunin 38288 Nov 20 10:50 Makefile.in
drwxr-xr-x 2 lunin lunin 4096 Nov 20 10:51 man/
drwxr-xr-x 5 lunin lunin 4096 Nov 20 10:51 misc/
-rwxr-xr-x 1 lunin lunin 6878 Mar 18 2022 missing*
-rw-r--r-- 1 lunin lunin 53 Nov 20 10:50 NEWS
-rw-r--r-- 1 lunin lunin 26 Nov 20 10:50 README
-rw-r--r-- 1 lunin lunin 2435 Nov 20 10:50 README.md
drwxr-xr-x 5 lunin lunin 4096 Nov 20 10:50 sass/
drwxr-xr-x 12 lunin lunin 4096 Nov 20 10:51 src/
drwxr-xr-x 14 lunin lunin 4096 Nov 20 10:51 ui/
Здесь действительно много исходных файлов Zabbix.
- Переход к папке с файлами базы данных PostgreSQL
Мы переходим в директорию с базой данных PostgreSQL, так как именно там находится файл схемы, который нам нужен. Поскольку команда по умолчанию может не сработать из-за различий в версиях Zabbix, мы указываем нашу версию:
cd database/postgresql/
- Просмотр содержимого папки
Чтобы убедиться, что мы нашли нужный файл, снова проверяем содержимое папки, командой ls
ls
data.sql Makefile.am option-patches timescaledb
images.sql Makefile.in schema.sql
В папке будет файл с именем schema.sql — это именно тот файл, который нам нужен для миграции базы данных. Убедитесь, что файл выделен и готов к дальнейшему использованию. Мы на правильном пути!
Теперь нам нужно извлечь из файла schema.sql только те операции, которые создают таблицы и триггеры, а затем сохранить их в отдельный файл. Для этого выполняем следующую команду:
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
Проверка результата
- Просмотр содержимого текущей папки
Выполняем команду ls
ls
data.sql Makefile.am option-patches timescaledb
images.sql Makefile.in schema.sql
Если файла create_tables.sql здесь нет, то это ожидаемо, так как он был создан в директории /tmp/zabbix-db-migration.
- Переход в папку с миграцией
Для перехода в папку используем команды:
cd ..
cd ..
cd ..
Теперь мы находимся в директории /tmp/zabbix-db-migration.
- Проверяем содержимое папки миграции
Выполняем команду ls
ls
create_tables.sql zabbix-7.0.6
Здесь мы видим файл create_tables.sql. Отлично, файл создан и находится в нужной папке.
Далее, выполняем следующие шаги для разделения данных из файла схемы на разные файлы:
-
Удаляем информацию о триггерах из файла create_tables.sql
Удаляем всё, что связано с функциями для триггеров, чтобы оставить только операции создания таблиц:
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' zabbix-7.0.6/database/postgresql/schema.sql > /tmp/zabbix-db-migration/triggers.sql
Проверяем содержимое папки, чтобы убедиться, что файл triggers.sql создан:
ls
create_tables.sql triggers.sql zabbix-7.0.6
- Создаём файл с операциями создания индексов
Извлекаем команды создания индексов и сохраняем их в отдельный файл:
grep -E 'CREATE INDEX|CREATE UNIQUE INDEX' zabbix-7.0.6/database/postgresql/schema.sql > /tmp/zabbix-db-migration/create_index.sql
Снова проверяем, что файл create_index.sql успешно создан:
ls
create_index.sql create_tables.sql triggers.sql zabbix-7.0.6
- Создаём файл с операциями предупреждения (ALTER TABLE)
Извлекаем только команды ALTER TABLE ONLY и сохраняем их в отдельный файл:
grep 'ALTER TABLE ONLY' zabbix-7.0.6/database/postgresql/schema.sql > /tmp/zabbix-db-migration/alter_table.sql
Проверяем содержимое папки, чтобы убедиться, что файл alter_table.sql тоже создан:
ll
total 224
drwxr-xr-x 3 root root 4096 Dec 10 17:33 ./
drwxrwxrwt 20 root root 4096 Dec 10 17:20 ../
-rw-r--r-- 1 root root 36267 Dec 10 17:33 alter_table.sql
-rw-r--r-- 1 root root 18036 Dec 10 17:32 create_index.sql
-rw-r--r-- 1 root root 134204 Dec 10 17:32 create_tables.sql
-rw-r--r-- 1 root root 23612 Dec 10 17:32 triggers.sql
drwxr-xr-x 13 lunin lunin 4096 Nov 20 10:51 zabbix-7.0.6/
Теперь у нас есть все необходимые файлы для дальнейшей работы:
- create_tables.sql (только таблицы),
- triggers.sql (только триггеры),
- create_index.sql (только индексы),
- alter_table.sql (только ALTER TABLE).
Продолжаем настройку и подготовку к миграции!
Подготовка PostgreSQL
Теперь займёмся настройкой базы данных PostgreSQL для Zabbix:
- Создание нового пользователя базы данных
Создаём пользователя zabbix с паролем. Выполняем следующую команду:
sudo -u postgres createuser --pwprompt zabbix
Когда будет предложено ввести пароль, указываем zabbix (или любой другой, который вы хотите использовать).
Важно: Обратите внимание: префикс sudo -u postgres указывает, что команда выполняется от имени пользователя PostgreSQL postgres, а не от имени суперпользователя root. Это важно, поскольку именно пользователь postgres управляет базами данных и их пользователями в PostgreSQL.
- Создание базы данных Zabbix
Теперь создаём базу данных zabbix и назначаем её владельцем пользователя zabbix:
sudo -u postgres createdb -O zabbix zabbix
- Создание схемы базы данных Zabbix
Используем файл create_tables.sql, чтобы создать структуру базы данных. Выполняем следующую команду:
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/create_tables.sql
Когда будет запрашиваться пароль, вводим тот, который вы установили ранее (в нашем случае это zabbix).
После выполнения команда создаст таблицы в базе данных.
- Временное изменение типа шифрования пароля
- Устанавливаем тип шифрования:
- Устанавливаем пароль пользователя zabbix с новым шифрованием:
Для совместимости с утилитой pgloader нужно временно переключить шифрование паролей на тип 'md5':
sudo -u postgres psql -c "SET password_encryption='md5';"
sudo -u postgres psql -c "ALTER ROLE zabbix WITH PASSWORD 'zabbix';"
Теперь база данных PostgreSQL настроена, и мы можем продолжать процесс миграции!
Подготовка MySQL
Теперь займёмся подготовкой базы данных MySQL и созданием конфигурационного файла для pgloader:
- Изменение метода аутентификации MySQL
- Открываем конфигурационный файл MySQL:
- В самый конец файла добавляем следующую директиву:
- Сохраняем изменения: нажимаем CTRL + X, затем Y, и подтверждаем Enter.
- Перезапускаем службу MySQL, чтобы изменения вступили в силу:
nano /etc/mysql/mysql.conf.d/mysqld.cnf
default_authentication_plugin=mysql_native_password
service mysql restart
Выполняем команду, чтобы изменить метод входа пользователя zabbix и задать новый пароль (если вы используете другой пароль, замените 'zabbix'):
mysql -e "ALTER USER 'zabbix'@'localhost' IDENTIFIED WITH mysql_native_password BY 'zabbix';"
Это действие обеспечивает совместимость с pgloader.
- Открываем редактор для создания файла конфигурации:
- Вставляем следующий текст в файл:
- Сохраняем файл: нажимаем CTRL + X, затем Y, и подтверждаем Enter.
nano /tmp/zabbix-db-migration/pgloader.conf
LOAD DATABASE
FROM mysql://zabbix:zabbix@127.0.0.1/zabbix
INTO postgresql://zabbix: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';
Обратите внимание:
FROM mysql://zabbix:zabbix@127.0.0.1/zabbix — замените zabbix:zabbix на ваш логин и пароль, если они отличаются.
INTO postgresql://zabbix:zabbix@127.0.0.1/zabbix — здесь тоже указывайте свои данные для PostgreSQL, если вы задавали другие.
Файл конфигурации для pgloader готов. Теперь мы можем перейти к следующему шагу — запуску миграции данных.
Миграция
Теперь мы подошли к самому важному этапу — миграции данных. Перед началом убедитесь, что:
- Вы сделали резервную копию исходной базы данных MySQL (если нет, сейчас самое время это сделать).
- На диске достаточно свободного места для временных файлов миграции.
Если всё готово, приступаем:
- Остановка служб Zabbix и Apache
Чтобы данные не изменялись во время миграции, останавливаем службы Zabbix сервера и веб-сервера Apache:
systemctl stop zabbix-server apache2
Иногда службы могут зависать и не останавливаться корректно. На данном этапе это не критично — просто нажмите CTRL + C для принудительной отмены.
На этом этапе Zabbix временно перестанет работать.
- Создание папки для временных данных
Создаём папку для временных данных миграции в нашей директории:
mkdir /tmp/zabbix-db-migration/data
- Запуск миграции с использованием pgloader
Теперь всё готово к запуску миграции. Используем ранее созданный файл конфигурации для pgloader:
pgloader --root-dir=/tmp/zabbix-db-migration/data /tmp/zabbix-db-migration/pgloader.conf
- Процесс миграции
После запуска команда начнёт перенос данных из базы MySQL в PostgreSQL. Важно следить за процессом в терминале — pgloader будет выводить сообщения о ходе миграции, включая возможные ошибки.
Ожидаем завершения миграции, а затем переходим к финальной настройке Zabbix!
Важное замечание: Во время работы утилиты pgloader вы можете увидеть предупреждающие сообщения. Их можно игнорировать, так как они не критичны и не влияют на общий процесс миграции.
С другой стороны, более серьёзные проблемы, такие как:
- нехватка свободного места на диске,
- таймауты между базами данных,
- низкая скорость записи на диск,
могут потребовать дополнительного анализа и корректировки параметров утилиты или системы. Например, для устранения таймаутов или оптимизации записи на диск.
Если миграция завершилась успешно, вывод утилиты pgloader должен быть похож на следующий:
2024-12-10T18:20:05.016000+03:00 LOG pgloader version "3.6.7~devel"
2024-12-10T18:20:05.226000+03:00 LOG Migrating from #
2024-12-10T18:20:05.226000+03:00 LOG Migrating into #
2024-12-10T18:20:05.846997+03: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-12-10T18:20:05.846997+03:00 WARNING Source column "public"."host_proxy"."revision" is casted to type "bigint" which is not the same as "numeric", the type of current target database column "public"."host_proxy"."revision".
2024-12-10T18:20:05.847997+03: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-12-10T18:20:05.847997+03: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-12-10T18:20:05.848997+03: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-12-10T18:20:05.848997+03: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-12-10T18:20:05.848997+03: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-12-10T18:20:19.237965+03:00 LOG report summary reset
table name errors rows bytes total time
--------------------------------- --------- --------- --------- --------------
fetch meta data 0 203 0.199s
Truncate 0 203 0.328s
--------------------------------- --------- --------- --------- --------------
public.history 0 564190 19.2 MB 3.770s
public.valuemap_mapping 0 32526 917.7 kB 4.102s
public.history_uint 0 199794 6.1 MB 1.544s
public.item_preproc 0 20901 1.0 MB 0.424s
public.widget_field 0 10013 607.8 kB 0.298s
public.trends 0 9586 537.4 kB 0.290s
public.item_discovery 0 6985 192.3 kB 0.257s
public.triggers 0 6172 1.7 MB 0.276s
public.item_tag 0 26151 789.3 kB 0.316s
public.trends_uint 0 3645 132.5 kB 0.226s
public.widget 0 1962 82.5 kB 0.198s
public.items 0 16633 6.4 MB 0.648s
public.graphs 0 1747 204.2 kB 0.242s
public.item_parameter 0 1051 42.3 kB 0.188s
public.lld_macro_path 0 770 26.2 kB 0.172s
public.dashboard_page 0 470 10.5 kB 0.284s
public.hosts_groups 0 335 4.1 kB 0.352s
public.dashboard 0 321 22.7 kB 0.471s
public.lld_override_operation 0 174 4.7 kB 0.527s
public.lld_override_condition 0 161 6.6 kB 0.621s
public.lld_override_opdiscover 0 151 1.0 kB 0.692s
public.item_rtdata 0 153 2.4 kB 0.739s
public.images 0 187 1.9 MB 0.898s
public.auditlog 0 61 54.9 kB 1.030s
public.hosts_templates 0 41 0.7 kB 1.134s
public.module 0 30 1.0 kB 1.216s
public.interface 0 26 1.2 kB 1.300s
public.lld_override_opstatus 0 16 0.1 kB 1.396s
public.trigger_discovery 0 15 0.5 kB 1.474s
public.functions 0 9891 278.4 kB 0.284s
public.event_tag 0 12 0.2 kB 1.581s
public.ids 0 11 0.3 kB 1.599s
public.operations 0 10 0.2 kB 1.716s
public.opmessage 0 8 0.1 kB 1.728s
public.conditions 0 6 0.1 kB 1.822s
public.lld_override_optag 0 6 0.2 kB 1.826s
public.actions 0 5 0.3 kB 1.947s
public.users_groups 0 5 0.0 kB 1.946s
public.opmessage_grp 0 4 0.0 kB 2.127s
public.scripts 0 3 0.3 kB 2.112s
public.events 0 3 0.2 kB 2.247s
public.problem 0 2 0.2 kB 2.246s
public.users 0 2 0.3 kB 2.379s
public.acknowledges 0 0 2.388s
public.autoreg_host 0 0 2.522s
public.config 0 1 1.4 kB 2.517s
public.connector 0 0 2.641s
public.corr_condition 0 0 2.638s
public.corr_condition_tag 0 0 2.745s
public.corr_condition_tagvalue 0 0 2.754s
public.correlation 0 0 2.859s
public.dashboard_usrgrp 0 1 0.0 kB 2.879s
public.dchecks 0 1 0.0 kB 2.958s
public.drules 0 1 0.0 kB 2.970s
public.escalations 0 0 3.051s
public.event_suppress 0 0 3.088s
public.globalmacro 0 1 0.0 kB 3.157s
public.group_discovery 0 0 3.208s
public.history_log 0 0 3.279s
public.host_rtdata 0 1 0.0 kB 3.296s
public.httpstep 0 0 3.374s
public.httpstepitem 0 0 3.393s
public.trigger_tag 0 8012 217.5 kB 0.206s
public.httptest_field 0 0 3.500s
public.httptestitem 0 0 3.488s
public.icon_mapping 0 0 3.615s
public.interface_snmp 0 0 3.600s
public.lld_override_opinventory 0 0 3.732s
public.lld_override_optrends 0 0 3.711s
public.maintenances 0 0 3.841s
public.maintenances_hosts 0 0 3.855s
public.media 0 0 3.955s
public.mfa_totp_secret 0 0 3.973s
public.opcommand_grp 0 0 4.058s
public.opconditions 0 0 4.077s
public.opinventory 0 0 4.185s
public.optag 0 0 4.186s
public.permission 0 0 4.316s
public.proxy 0 0 4.313s
public.proxy_dhistory 0 0 4.443s
public.proxy_group_rtdata 0 0 4.436s
public.proxy_rtdata 0 0 4.569s
public.report_param 0 0 4.569s
public.report_usrgrp 0 0 4.686s
public.scim_group 0 0 4.690s
public.hostmacro 0 5914 573.5 kB 0.250s
public.service_alarms 0 0 4.807s
public.service_problem_tag 0 0 4.808s
public.service_tag 0 0 4.941s
public.services_links 0 0 4.942s
public.sla_excluded_downtime 0 0 5.031s
public.sla_service_tag 0 0 5.068s
public.sysmap_element_url 0 0 5.129s
public.sysmap_url 0 0 5.197s
public.sysmap_usrgrp 0 0 5.219s
public.sysmaps_element_tag 0 0 5.320s
public.sysmaps_link_triggers 0 0 5.335s
public.tag_filter 0 0 5.447s
public.task_acknowledge 0 0 5.456s
public.task_close_problem 0 0 5.581s
public.task_remote_command 0 0 5.579s
public.task_result 0 0 5.720s
public.token 0 0 5.707s
public.ugset 0 1 0.1 kB 5.852s
public.user_ugset 0 1 0.0 kB 5.827s
public.userdirectory_idpgroup 0 0 5.950s
public.userdirectory_media 0 0 5.972s
public.userdirectory_usrgrp 0 0 6.042s
public.graphs_items 0 4714 160.9 kB 0.138s
public.item_condition 0 2857 150.4 kB 0.069s
public.trigger_depends 0 1762 31.0 kB 0.128s
public.valuemap 0 1211 79.0 kB 0.024s
public.host_tag 0 1016 28.6 kB 0.166s
public.media_type_param 0 633 24.7 kB 0.066s
public.hosts 0 375 243.3 kB 0.209s
public.host_hgset 0 324 2.6 kB 0.152s
public.media_type_message 0 208 59.2 kB 0.284s
public.lld_override 0 161 6.2 kB 0.268s
public.history_str 0 161 13.7 kB 0.414s
public.item_rtname 0 147 10.9 kB 0.429s
public.history_text 0 150 39.8 kB 0.537s
public.group_prototype 0 66 1.7 kB 0.564s
public.host_discovery 0 45 1.1 kB 0.673s
public.media_type 0 40 301.9 kB 0.756s
public.role_rule 0 27 0.8 kB 0.724s
public.hstgrp 0 19 1.1 kB 0.840s
public.lld_override_optemplate 0 14 0.2 kB 0.920s
public.hgset_group 0 13 0.1 kB 0.943s
public.hgset 0 12 0.8 kB 1.050s
public.expressions 0 10 0.5 kB 1.090s
public.graph_discovery 0 8 0.2 kB 1.132s
public.problem_tag 0 8 0.1 kB 1.247s
public.lld_override_opseverity 0 6 0.0 kB 1.255s
public.usrgrp 0 6 0.2 kB 1.391s
public.regexps 0 5 0.2 kB 1.399s
public.graph_theme 0 4 0.9 kB 1.536s
public.role 0 4 0.1 kB 1.544s
public.ugset_group 0 3 0.0 kB 1.676s
public.host_inventory 0 2 0.3 kB 1.681s
public.sessions 0 2 0.2 kB 1.817s
public.ha_node 0 1 0.1 kB 1.819s
public.alerts 0 0 1.948s
public.changelog 0 0 1.951s
public.config_autoreg_tls 0 1 0.0 kB 2.082s
public.connector_tag 0 0 2.090s
public.corr_condition_group 0 0 2.195s
public.corr_condition_tagpair 0 0 2.214s
public.corr_operation 0 0 2.304s
public.dashboard_user 0 0 2.321s
public.dbversion 0 1 0.0 kB 2.446s
public.dhosts 0 0 2.440s
public.dservices 0 0 2.554s
public.event_recovery 0 1 0.0 kB 2.555s
public.event_symptom 0 0 2.673s
public.globalvars 0 0 2.672s
public.history_bin 0 0 2.797s
public.host_proxy 0 0 2.779s
public.housekeeper 0 0 2.892s
public.httpstep_field 0 0 2.910s
public.httptest 0 0 3.001s
public.httptest_tag 0 0 3.037s
public.icon_map 0 0 3.113s
public.interface_discovery 0 0 3.155s
public.lld_override_ophistory 0 0 3.228s
public.lld_override_opperiod 0 0 3.296s
public.maintenance_tag 0 0 3.339s
public.maintenances_groups 0 0 3.439s
public.maintenances_windows 0 0 3.462s
public.mfa 0 0 3.575s
public.opcommand 0 0 3.582s
public.opcommand_hst 0 0 3.708s
public.opgroup 0 1 0.0 kB 3.723s
public.opmessage_usr 0 0 3.827s
public.optemplate 0 1 0.0 kB 3.899s
public.profiles 0 1 0.0 kB 3.947s
public.proxy_autoreg_host 0 0 3.995s
public.proxy_group 0 0 4.100s
public.proxy_history 0 0 4.107s
public.report 0 0 4.227s
public.report_user 0 0 4.242s
public.rights 0 0 4.342s
public.script_param 0 0 4.356s
public.service_problem 0 0 4.444s
public.service_status_rule 0 0 4.466s
public.services 0 0 4.552s
public.sla 0 0 4.589s
public.sla_schedule 0 0 4.650s
public.sysmap_element_trigger 0 0 4.717s
public.sysmap_shape 0 1 0.1 kB 4.750s
public.sysmap_user 0 0 4.821s
public.sysmaps 0 1 0.1 kB 4.879s
public.sysmaps_elements 0 1 0.1 kB 4.933s
public.sysmaps_links 0 0 4.996s
public.task 0 0 5.022s
public.task_check_now 0 0 5.133s
public.task_data 0 0 5.146s
public.task_remote_command_result 0 0 5.265s
public.timeperiods 0 0 5.273s
public.trigger_queue 0 0 5.282s
public.user_scim_group 0 0 5.306s
public.userdirectory 0 0 5.357s
public.userdirectory_ldap 0 0 5.352s
public.userdirectory_saml 0 0 5.357s
--------------------------------- --------- --------- --------- --------------
COPY Threads Completion 0 4 12.781s
Reset Sequences 0 1 0.094s
Install Comments 0 0 0.000s
--------------------------------- --------- --------- --------- --------------
Total import time ✓ 942192 42.1 MB 12.87
Если у вас результат похож на этот, поздравляю — миграция завершена, и мы можем двигаться дальше!
После успешной миграции данных завершаем настройку базы данных PostgreSQL:
- Возвращаем более безопасный алгоритм хеширования паролей
Для повышения безопасности меняем алгоритм хеширования на SHA-256 и перегенерируем пароль для пользователя Zabbix:
- Устанавливаем алгоритм хеширования:
sudo -u postgres psql -c "SET password_encryption='SCRAM-SHA-256';"
- Перегенерируем пароль для пользователя zabbix:
sudo -u postgres psql -c "ALTER ROLE zabbix WITH PASSWORD 'zabbix';"
Замените zabbix на желаемый пароль.
- Создание схемы индексов
Используем файл create_index.sql для создания индексов в базе данных Zabbix:
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/create_index.sql
Введите пароль пользователя zabbix, когда будет предложено.
- Создание схемы для предупреждений (ALTER TABLE)
Используем файл alter_table.sql для внесения изменений в таблицы:
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/alter_table.sql
Опять вводим пароль пользователя zabbix.
- Создание схемы триггеров
Используем файл triggers.sql для добавления триггеров в базу данных:
sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /tmp/zabbix-db-migration/triggers.sql
И снова вводим пароль пользователя zabbix.
- Оптимизация базы данных (VACUUM)
Запускаем команду VACUUM для внутренней очистки базы данных. Это обновляет статистику, используемую оптимизатором запросов, и улучшает производительность:
sudo -u postgres vacuumdb --dbname=zabbix --analyze --username=postgres --jobs=$(grep -c processor /proc/cpuinfo)
Теперь база данных PostgreSQL полностью готова к использованию! Мы можем возвращаться к настройке Zabbix и запуску служб.
Тестирование функциональности
Теперь переходим к следующему этапу — замене Zabbix сервера для работы с PostgreSQL:
- Удаляем Zabbix сервер, который был настроен для MySQL
Текущая версия Zabbix сервера предназначена для работы с базой данных MySQL, и она не будет работать с PostgreSQL. Поэтому удаляем её:
sudo apt remove zabbix-server-mysql
После выполнения команды Zabbix сервер будет удалён.
- Создаём резервную копию конфигурационного файла
Хотя при переустановке Zabbix сервера файл конфигурации zabbix_server.conf обычно сохраняется, рекомендуется сделать его резервную копию, особенно если вы работаете на боевой системе. Для этого выполните:
cp /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.bak
Если у вас тестовая система или вы уверены, что файл сохранится, можете пропустить этот шаг.
- Устанавливаем Zabbix сервер для PostgreSQL
Теперь установим Zabbix сервер, совместимый с PostgreSQL, а также необходимые зависимости, включая поддержку PostgreSQL в PHP:
apt install zabbix-server-pgsql zabbix-frontend-php php8.3-pgsql zabbix-apache-conf
Команду для установки мы берём с официального сайта Zabbix, чтобы быть уверенными в её корректности. Она включает:
- zabbix-server-pgsql: Zabbix сервер для PostgreSQL,
- php8.3-pgsql: модуль PHP для взаимодействия с PostgreSQL,
- zabbix-apache-conf: конфигурация для работы веб-интерфейса Zabbix через Apache.
После установки Zabbix сервер будет готов для работы с PostgreSQL. Двигаемся дальше!
Если, ранее у вас возникали проблемы с остановкой служб, попробуйте перезапустить сервер. Однако имейте в виду, что сервер может не завершить перезагрузку, так как будет пытаться отключить зависшую службу. В таком случае принудительно выключите виртуальную машину, а затем включите её снова.
Теперь завершаем настройку Zabbix сервера для работы с PostgreSQL:
- Изменяем пароль пользователя базы данных
Открываем файл конфигурации Zabbix сервера, чтобы указать новый пароль для подключения к базе данных:
nano /etc/zabbix/zabbix_server.conf
В файле найдите параметр DBPassword (можно использовать поиск в редакторе CTRL + W). Укажите туда ваш пароль для PostgreSQL, в моем случае это:
DBPassword=zabbix
Сохраняем изменения: нажимаем CTRL + X, затем Y, и подтверждаем Enter.
- Удаляем старый конфигурационный файл фронтенда для MySQL
Файл конфигурации для веб-интерфейса Zabbix, использующий MySQL, больше не нужен. Удаляем его:
rm /etc/zabbix/web/zabbix.conf.php
- Перезапускаем службы Zabbix и Apache
После внесённых изменений перезапускаем службы Zabbix сервера и Apache:
systemctl restart zabbix-server apache2
- Если службы не запускаются
Если служба Zabbix сервера не запустилась и выдали ошибку, необходимо изучить логи, чтобы понять, в чём проблема. Лог Zabbix сервера находится по следующему пути:
nano /var/log/zabbix/zabbix_server.log
Просмотрите сообщения в логе, чтобы диагностировать и устранить проблему.
- Проверяем работу через веб-интерфейс
Теперь заходим в веб-интерфейс Zabbix, чтобы убедиться, что сервер работает корректно, и настраиваем систему для работы с новой базой PostgreSQL.
Переходим к первоначальной настройке Zabbix через веб-интерфейс. Я использую ссылку: http://zabbix7.itadminlab.ru/zabbix/, а вы откройте свою ссылку.
- Выбор языка интерфейса
На первом экране выбираем язык интерфейса. По умолчанию установлен английский, оставляем его и нажимаем Далее.
- Проверка окружения
В следующем окне происходит проверка версий и настроек системы. Здесь вы должны увидеть установленную поддержку PostgreSQL. Убедитесь, что всё в порядке, и нажимаем Далее.
- Настройка подключения к базе данных
В следующем шаге выбираем тип базы данных — PostgreSQL.
• Оставляем все поля по умолчанию.
• Единственное, что нужно указать, — это пароль пользователя Zabbix для подключения к базе данных. В моем случае это - zabbix.
Нажимаем Далее.
- Настройка имени сервера и часового пояса
На этом этапе вводим имя сервера и выбираем часовой пояс:
• Имя сервера: Zabbix7
• Часовой пояс: выбираем свой. Например, для Москвы: +3 Europe/Moscow
Нажимаем Далее.
- Проверка настроек
На последнем шаге проверяем, что всё введено корректно, и нажимаем Далее.
- Завершение настройки
После этого на экране появится сообщение о завершении настройки. Нажимаем Финиш.
- Вход в Zabbix
Вводим логин и пароль, которые вы использовали ранее для доступа к Zabbix.
- Проверка панели управления
После успешного входа вы увидите панель управления Zabbix. Теперь вы можете перейти в любой раздел и проверить, что всё работает корректно, и ваши данные перенесены.
Поздравляю, миграция завершена!
Удаление MySQL
Для завершения процесса миграции рассмотрим, как удалить старую базу данных MySQL.
Однако внимание! В боевой среде лучше подождать месяц или два, чтобы убедиться, что после миграции не возникло проблем. Если вы уверены в стабильности системы, можно приступать.
Шаги для полного удаления MySQL
- Остановка службы MySQL
Перед удалением необходимо остановить службу MySQL:
systemctl stop mysql
- Удаление пакетов MySQL
Полностью удаляем сервер MySQL, включая общие файлы и компоненты:
sudo apt purge mysql-server mysql-common mysql-server-core-* mysql-client-core-*
- Удаление файлов базы данных
Удаляем все файлы базы данных MySQL, чтобы они не занимали место:
sudo rm -Rf /var/lib/mysql/
- Удаление конфигурационных файлов
Если папка конфигурации MySQL осталась, удаляем её:
sudo rm -Rf /etc/mysql/
- Удаление логов MySQL
Удаляем все логи, связанные с MySQL:
sudo rm -rf /var/log/mysql
- Удаление пользователей и групп MySQL
Удаляем созданных пользователей и группы для MySQL:
sudo deluser --remove-home mysql
sudo delgroup mysql
- Проверка Zabbix
После удаления MySQL проверьте, что Zabbix работает в штатном режиме. Убедитесь, что все данные доступны, а интерфейс работает без ошибок.
Если всё работает корректно, значит, миграция завершена успешно! На этом процесс можно считать завершённым. Вы успешно перенесли Zabbix с MySQL на PostgreSQL.
Коллеги, важно понимать, что в данной статье я предоставил общий алгоритм и основные шаги по миграции с базы данных MySQL на PostgreSQL. Однако, хочу подчеркнуть, что я выполнял миграцию в тестовой среде.
В боевой среде вы можете столкнуться с различными проблемами и ошибками, которые потребуют дополнительного анализа и самостоятельного решения. Это может включать вопросы совместимости, производительности или специфические для вашей инфраструктуры нюансы.
Но, я уверен, что с этим вы справитесь! Главное — внимательность, резервные копии и вдумчивый подход. Удачи в вашей работе!
Заключение
В этой статье вы узнали, как выполнить миграцию базы данных Zabbix с MySQL на PostgreSQL. Мы разобрали все этапы — от подготовки баз данных и конфигурации до настройки Zabbix сервера для работы с новой системой. Несмотря на сложность процесса, при правильном подходе миграция становится вполне выполнимой задачей.
Надеюсь, данное руководство помогло вам понять основные шаги и особенности этого процесса. Удачи в вашей работе, и пусть Zabbix продолжает радовать стабильной и эффективной работой!
Вам понравилась эта статья? Тогда вам, скорее всего, будет интересна другая полезная статья Как добавить пункт «Завершить задачу» в панели задач Windows 11.
Интересуешься IT и системным администрированием? Подпишись на SysAdminHub в Телеграмм или Макс, чтобы узнавать обо всем первым!
Статья была полезна? Поддержи автора, и благодаря твоей помощи новые материалы будут выходить еще чаще:
