Comments 11
В статье не раскрыто:
Зачем это делать?
Что делать если mysql база весит 900 Гб ? А не 200 Мб как у вас.
Отвечу на ваш первый вопрос. Преимущество PostgreSQL в колоночном расширении TimescaleDB, которое позволяет эффективно удалять устаревшие данные при помощи удаления чанка вместо выполнения SQL-запроса, что нативно поддерживается Zabbix. В MySQL для эффективной работы с удалением исторических данных вам нужно пилить партиционирование, а потом настраивать сторонний скрипт, который будет по расписанию удалять ненужные партиции.
А если уже есть партиционирование? (ибо до 900 Гб без него не дожить) Есть еще какие-то преимущества?
Ну, если вы весело и счастливо живете с MySQL, то иных премуществ, кроме нативной поддержки, наверное, не смогу назвать.
Тут конечно вопрос, что более нативное - патриции в mysql или расширение timescaledb.
Использовали и то и другое, на довольно больших базах.
При использовании timescaledb могут быть нюансы с резервным копированием (а точнее, с восстановлением)
Выполнение обновление версий постгреса требует бОльших познаний от инженера.
Настройка расширения timescaledb тоже требует большей экспертизы, чем apt intsall mysql-server
Так что если mysql уже с патрициями - я бы 10 раз подумал, прежде чем делать миграцию на постгрес с timescaledb.
Для новых инсталляций - может быть, если не хотите создавать патриции. Но миграция? Зачем?
2й вопрос - как раз следствие первого. Если у вас 900гб база, то с высокой вероятностью это на 99% хистори. В общем случае переход как раз возможность оставить прошлое в прошлом, добавив в pgloader.conf EXCLUDING TABLE NAMES MATCHING ~<history>, ~<trends>
А как выполнить миграцию базы данных postgres старой версии zabbix на новую? А то я один раз это сделал и оказалось, что новая версия сервера zabbix падала, потому что в новой версии базы данных postgres требовалось на какое-то поле ограничение NOT NULL и значение по умолчанию в этом поле, а в старой версии сервера zabbix этих условий не требовалось.
Смотря с какой версии на какую. Берите свою БД, делаете реплику и проводите апгрейд с одновременным замером времени апгрейда.
Речь о другом, не как поднять версию postgres, а как перенести базу данных для новой версии zabbix. Причем здесь апгрейд. Попробую еще раз объяснить. Есть старая версия zabbix, которая работает со своей версией postgres и база данных заточена под старую версию zabbix. Теперь я беру новую версию zabbix, которая работает с новой версией postgres. Вопрос, как перенести старую схему и данные в новую схему базы данных? Новая версия zabbix работает на новой схеме базы данных. А то что схема поменялась, я обозначил в самом начале.Вот ссылка на bugs - https://support.zabbix.com/browse/ZBX-26998?_gl=1*j7sk07*_gcl_au*MTQzMTQ4NTIwNy4xNzU4MDIxNjE3*_ga*MTM2NjY3Mjk2Ni4xNzQyMzk1MDcw*_ga_1F6WJN99ZG*czE3NjUyOTQxMDYkbzIyJGcxJHQxNzY1Mjk0MjMxJGo1NiRsMCRoMA..
Если БД не большая (думаю до 10-20ГБ) и допустим некоторый простой на время нужное для дампа БД/восстановления то можно через дамп БД.
Примерно так я делал для zabbix в docker (обновление с 16 до 17):
Остановить текущий контейнер с zabbix и postgres 16
Запустить контейнер с postgres 16:
docker compose up -d pg16Создать дамп БД командой:
docker compose exec -it pg16 /bin/bash -c 'pg_dumpall -U $POSTGRES_USER > /bkp/BKP.sql'Запустить контейнер с postgres 17:
docker compose up -d pg17Восстановить БД из дампа:
docker compose exec -it pg17 /bin/bash -c 'psql -d $POSTGRES_DB -U $POSTGRES_USER < /bkp/BKP.sql'Остановить контейнеры с postgres
docker compose downzabbix изменить на использование БД postgres 17.
Запускать контейнеры postgres используя docker-compose.yml который содержит параметры для подключения к БД (пароль пользователя и тп)
services:
pg16:
image: 'reg.babun.tv/postgres:16-alpine'
logging:
driver: 'json-file'
environment:
- PGDATA=/var/lib/postgresql/data/pgdata
- POSTGRES_USER=zabbix
- POSTGRES_PASSWORD=ORIGINALPASSWORD
- POSTGRES_DB=zabbix
volumes:
- '/data/zabbix.pg/postgres/data:/var/lib/postgresql/data'
- '/data/bkp:/bkp'
pg17:
image: 'reg.babun.tv/postgres:17-alpine'
logging:
driver: 'json-file'
environment:
- PGDATA=/var/lib/postgresql/data/pgdata
- POSTGRES_USER=zabbix
- POSTGRES_PASSWORD=ORIGINALPASSWORD
- POSTGRES_DB=zabbix
volumes:
- '/data/zabbix.pg17/postgres/data:/var/lib/postgresql/data'
- '/data/bkp:/bkp'
Zabbix – миграция с MySQL на PostgreSQL