本文最后更新于 2025年4月24日 晚上
简介 本教程用于 Zabbix 6.0.11-7.4+的数据库从 MySQL 迁移到 PostgreSQL + TimescaleDB,适用于 Rocky Linux 8-9 系统。内容包括版本检查、准备步骤、迁移过程、功能测试以及启用 TimescaleDB 和性能优化的指导。
注意:!! 迁移前必须备份好数据,用于失败后回退。
为什么要用TimescaleDB 时序数据库?
安装前检查和准备
Zabbix Server Mysql 包版本检查(下载源码使用)
1 2 3 4 zabbix_server -V zabbix_server (Zabbix) 7.0.12
安装PostgreSQL + TimescaleDB时序数据库
配置PG YUM源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{centos})-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y sudo 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 dnf -qy module disable postgresql
PG安装和初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 dnf install timescaledb-2-postgresql-16 -y sudo /usr/pgsql-16/bin/postgresql-16-setup initdb timescaledb-tune --pg-config /usr/pgsql-16/bin --max-conns=256 sudo systemctl enable --now postgresql-16 sudo systemctl status postgresql-16 ss -an | grep 5432 sudo -u postgres psql \password postgres \q sudo -u postgres createuser --pwprompt zabbix sudo -u postgres createdb -O zabbix zabbix
安装转换数据库工具 - pgloader
1 2 3 4 5 dnf install pgloader -y pgloader -V
准备使用pgloader迁移
生成Zabbix数据库结构SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 mkdir /opt/zabbix-db-migration/ && cd $_ wget https://cdn.zabbix.com/zabbix/sources/stable/7.0/zabbix-7.0.12.tar.gz tar -zxvf zabbix-*.tar.gzcd /opt/zabbix-db-migration/zabbix-*/database/postgresql/ grep -v 'ALTER TABLE ONLY' schema.sql | grep -v INSERT | grep -v 'CREATE INDEX' | grep -v 'CREATE UNIQUE INDEX' > /opt/zabbix-db-migration/create_tables.sql sed -i '/create\ or\ replace\ function/,$d' /opt/zabbix-db-migration/create_tables.sql awk '/INSERT INTO dbversion/{p=1;next} /ALTER TABLE/{p=0} p' schema.sql > /opt/zabbix-db-migration/triggers.sql grep -E 'CREATE INDEX|CREATE UNIQUE INDEX' schema.sql > /opt/zabbix-db-migration/create_index.sql grep 'ALTER TABLE ONLY' schema.sql > /opt/zabbix-db-migration/alter_table.sql
准备PostgreSQL 注意:Zabbix用户和zabbix数据库之前步骤已创建。
1 2 3 4 5 6 7 8 9 10 11 12 sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /opt/zabbix-db-migration/create_tables.sql# 导入SQL,需要输入配置的zabbix用户密码 sudo -u postgres psql -c "SET password_encryption='md5';" sudo -u postgres psql -c "ALTER ROLE zabbix WITH PASSWORD 'Songxwn.com';"# 为了与pgloader程序兼容,请暂时将加密哈希设置为“md5”并更改创建的数据库用户的密码,以便在给定的哈希算法中重新生成该密码。为简单起见,最好使用您在创建此用户时输入的相同密码。
准备 MySQL 1 2 3 4 5 6 7 8 9 10 11 12 vim /etc/my.cnf.d/mysql-server.cnf [mysqld] ... default-authentication-plugin=mysql_native_password systemctl restart mysqld
创建访问MySQL Zabbix数据库的用户 1 2 3 4 5 6 7 8 9 10 11 12 mysql -uroot -p CREATE USER 'zabbix' @'127.0.0.1' IDENTIFIED BY 'Songxwn.com' ; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix' @'127.0.0.1' ; FLUSH PRIVILEGES; \q
创建pgloader 配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 vim /opt/zabbix-db-migration/pgloader.conf LOAD DATABASE FROM mysql://zabbix:[email protected] /zabbix INTO postgresql://zabbix:[email protected] /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' ;
配置文件说明 原有的Zabbix Mysql连接信息:用户名zabbix、密码为 Songxwn.com、连接地址为127.0.0.1、数据名称为zabbix。
新建的Zabbix Postgresql 连接信息:用户名zabbix、密码为 Songxwn.com、连接地址为127.0.0.1、数据名称为zabbix。
FROM mysql://… :从 MySQL 数据库 zabbix
读取数据。
INTO postgresql://… :把数据导入到 PostgreSQL 数据库 zabbix
。
WITH 参数说明 :
include no drop
:迁移过程中不要执行 DROP 操作,不会删除表或其他对象。
truncate
:在导入数据之前先清空目标表(删除旧数据)。
create no tables
:不创建表,默认你 PostgreSQL 中已经有对应表结构。
create no indexes
:不创建索引。
no foreign keys
:不创建外键。
reset sequences
:重置序列(自增 ID)以保证正确。
data only
:只导入数据,不导入表结构。
prefetch rows = 1000
、batch rows = 1000
、batch concurrency = 1
:控制数据批量读取和加载的参数,性能相关。
ALTER SCHEMA ‘zabbix’ RENAME TO ‘public’ :把导入的 zabbix
schema 重命名为 PostgreSQL 默认的 public
schema。
使用pgloader 开始正式迁移 1 2 3 4 5 6 7 8 9 10 11 12 systemctl stop zabbix-server httpd nginxmkdir /opt/zabbix-db-migration/data pgloader --root-dir=/opt/zabbix-db-migration/data /opt/zabbix-db-migration/pgloader.conf
将PG 加密方式切换回去和初始化数据库结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sudo -u postgres psql -c "SET password_encryption='SCRAM-SHA-256';" sudo -u postgres psql -c "ALTER ROLE zabbix WITH PASSWORD 'Songxwn.com';" sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /opt/zabbix-db-migration/create_index.sql sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /opt/zabbix-db-migration/alter_table.sql sudo -u postgres psql --host=127.0.0.1 --dbname=zabbix --username=zabbix -f /opt/zabbix-db-migration/triggers.sql sudo -u postgres vacuumdb --dbname=zabbix --analyze --username=postgres --jobs =$(grep -c processor /proc/cpuinfo)
卸载Zabbix Mysql 版本安装配置Zabbix pgsql 版本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 cp /etc/zabbix/zabbix_server.conf /opt/zabbix-db-migration/ dnf remove zabbix-server-mysql zabbix-web-mysql -y yum install zabbix-server-pgsql zabbix-web-pgsql zabbix-nginx-conf -y ``` ```bash vim /etc/zabbix/zabbix_server.conf DBName=zabbix DBPassword=Songxwn.comrm /etc/zabbix/web/zabbix.conf.php systemctl restart zabbix-server nginxcat /var/log/zabbix/zabbix_server.log
Zabbix Web初始化
登录Zabbix Web
输入PG数据库连接信息(主要是密码)
配置Zabbix主机名称和时区 - 完成安装
停止无用的Mysql
1 2 systemctl disable --now mysqld
开启时序数据库 TimescaleDB
1 2 3 4 5 6 7 8 9 10 systemctl stop zabbix-serverecho "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 /opt/zabbix-db-migration/zabbix-7.*/database/postgresql/timescaledb/schema.sql
修改数据库允许兼容性并启动Zabbix Server
1 2 3 4 5 6 7 8 9 vim /etc/zabbix/zabbix_server.conf AllowUnsupportedDBVersions=1 systemctl restart zabbix-server
转换到时序数据库完成确认
运维技术交流群 发送邮件到 ➡️ [email protected]
或者关注WX公众号:网工格物
博客(最先更新) https://songxwn.com/
参考 https://www.initmax.com/wiki/zabbix-migration-from-mysql-to-postgresql/