简介

本教程用于 Zabbix 6.0.11-7.4+的数据库从 MySQL 迁移到 PostgreSQL + TimescaleDB,适用于 Rocky Linux 8-9 系统。内容包括版本检查、准备步骤、迁移过程、功能测试以及启用 TimescaleDB 和性能优化的指导。

注意:!! 迁移前必须备份好数据,用于失败后回退。

PS:本教程使用Zabbix 7.0.12 版本。

为什么要用TimescaleDB 时序数据库?

  • 相对于Mysql 可以更快的读写监控数据,TimescaleDB 利用分区(分块 chunk)的机制,将时间序列数据按时间切分,有效减少单个表的数据量,提升写入吞吐量,适合 Zabbix 这种需要大量实时数据写入的场景。 (至少三倍有以上)
  • 支持监控历史数据压缩,节省存储空间。
  • 删除监控历史数据的性能相对也比Mysql更好。

安装前检查和准备

Zabbix Server Mysql 包版本检查(下载源码使用)

1
2
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
sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{centos})-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y
# 配置Postgresql 源
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
# 配置TimescaleDB源
dnf -qy module disable postgresql
# 关闭系统的PG源

PG安装和初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
dnf install timescaledb-2-postgresql-16 postgresql16-contrib -y
# 安装postgresql 和 timescaledb
sudo -u postgres /usr/pgsql-16/bin/initdb --encoding=UTF8 --locale=en_US.UTF-8 -D /var/lib/pgsql/16/data
# 初始化数据库,指定数据库编码。
timescaledb-tune --pg-config /usr/pgsql-16/bin --max-conns=256
# 自动调优参数,一路yes即可
sudo systemctl enable --now postgresql-16
# 配置PG开机启动,并启动
sudo systemctl status postgresql-16
ss -an | grep 5432
# 检查状态是否正常
sudo -u postgres psql
password postgres
q
# 进入psql然后配置管理员密码,并退出。
sudo -u postgres createuser --pwprompt zabbix
# 创建zabbix用户并配置密码,我这里配置密码为Songxwn.com
sudo -u postgres createdb -O zabbix zabbix
# 创建zabbix数据库并指定所属用户为zabbix.

安装转换数据库工具 - pgloader

1
2
3
dnf install pgloader -y
pgloader -V
# 安装转换工具 (pgloader是一款开源的数据迁移和加载工具)

准备使用pgloader迁移

生成Zabbix数据库结构SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mkdir /opt/zabbix-db-migration/ && cd $_
# 创建一个迁移用文件夹
wget https://cdn.zabbix.com/zabbix/sources/stable/7.0/zabbix-7.0.12.tar.gz
# 在迁移用文件夹内下载第一步检查获取版本的对应版本Zabbix源码,这里是 7.0.12。
tar -zxvf zabbix-*.tar.gz
# 在迁移用文件夹内解压
cd /opt/zabbix-db-migration/zabbix-*/database/postgresql/
# 进入PG数据库文件目录
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
## 分五个步骤生成结构SQL用于转换使用。

准备PostgreSQL

注意:Zabbix用户和zabbix数据库之前步骤已创建。

1
2
3
4
5
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
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
default-authentication-plugin=mysql_native_password
# 在[mysqld]下添加以上参数给予Mysql
systemctl restart mysqld
# 然后重启使其生效。

创建访问MySQL Zabbix数据库的用户

1
2
3
4
5
6
7
8
mysql -uroot -p
CREATE USER 'zabbix'@'127.0.0.1' IDENTIFIED BY 'Songxwn.com';
# 已有zabbix用户可以忽略
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'127.0.0.1';
FLUSH PRIVILEGES;
SELECT User, Host FROM mysql.user WHERE User='zabbix';
# 确认已经修改完成。
q

创建pgloader 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 = 1000batch rows = 1000batch concurrency = 1:控制数据批量读取和加载的参数,性能相关。
  • ALTER SCHEMA ‘zabbix’ RENAME TO ‘public’:把导入的 zabbix schema 重命名为 PostgreSQL 默认的 public schema。

使用pgloader 开始正式迁移

1
2
3
4
5
6
systemctl stop zabbix-server httpd nginx
# 停止zabbix后端和前端服务
mkdir /opt/zabbix-db-migration/data
# 创建数据存储文件夹
pgloader --root-dir=/opt/zabbix-db-migration/data /opt/zabbix-db-migration/pgloader.conf
# 开始转换,转换日志最后一行有Total import time 字段,代表转换完成。

将PG 加密方式切换回去和初始化数据库结构

1
2
3
4
5
6
7
8
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
cp /etc/zabbix/zabbix_server.conf /opt/zabbix-db-migration/
# 卸载前备份配置文件
dnf remove zabbix-server-mysql zabbix-web-mysql -y
dnf install zabbix-server-pgsql zabbix-web-pgsql zabbix-nginx-conf -y

修改Zabbix_server 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vim /etc/zabbix/zabbix_server.conf
DBName=zabbix
DBPassword=Songxwn.com
### 增加数据库用户密码配置
rm /etc/zabbix/web/zabbix.conf.php
# 删除Web配置文件
systemctl restart zabbix-server nginx
# 启动Zabbix
cat /var/log/zabbix/zabbix_server.log
# 查看启动日志
````
## Zabbix Web初始化
### 登录Zabbix Web
![](https://r2.songxwn.com/ShareX/2025/04/xXmmOZurVN.png)
### 输入PG数据库连接信息(主要是密码)
![](https://r2.songxwn.com/ShareX/2025/04/ovftSAuM4q.png)
### 配置Zabbix主机名称和时区 - 完成安装
![](https://r2.songxwn.com/ShareX/2025/04/l1Y2I0ZK1k.png)
## 停止无用的Mysql
```bash
systemctl disable --now mysqld

开启时序数据库 TimescaleDB

1
2
3
systemctl stop zabbix-server
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 /opt/zabbix-db-migration/zabbix-7.*/database/postgresql/timescaledb/schema.sql

修改数据库允许兼容性并启动Zabbix Server

1
2
3
4
5
vim /etc/zabbix/zabbix_server.conf
AllowUnsupportedDBVersions=1
# 添加以上字段,因为zabbix会拒绝较新未支持的数据库版本,所以需要修改允许一下。
systemctl restart zabbix-server
# 重启

转换到时序数据库完成确认

其他版本

本教程使用Zabbix 7.0.12 、Rocky Linux 8作为示例,如果需要其他版本或帮助请加入知识星球。

运维技术交流群

发送邮件到 ➡️ [email protected]

或者关注WX公众号:网工格物

微信扫码

博客(最先更新)

https://songxwn.com/

参考

https://www.initmax.com/wiki/zabbix-migration-from-mysql-to-postgresql/