
本教程用于 Zabbix 6.0.11-7.4+的数据库从 MySQL 迁移到 PostgreSQL + TimescaleDB ,适用于 Rocky Linux 8-9 系统。内容包括版本检查、准备步骤、迁移过程、功能测试以及启用 TimescaleDB 和性能优化的指导。
注意:!! 迁移前必须备份好数据,用于失败后回退。
PS:本教程使用 Zabbix 7.0.12 版本。
相对于 Mysql 可以更快的读写监控数据,TimescaleDB 利用分区(分块 chunk )的机制,将时间序列数据按时间切分,有效减少单个表的数据量,提升写入吞吐量,适合 Zabbix 这种需要大量实时数据写入的场景。 (至少三倍有以上)
支持监控历史数据压缩,节省存储空间。
删除监控历史数据的性能相对也比 Mysql 更好。
zabbix_server -V zabbix_server (Zabbix) 7.0.12 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 源 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. dnf install pgloader -y pgloader -V # 安装转换工具 ( pgloader 是一款开源的数据迁移和加载工具) 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 用于转换使用。 注意:Zabbix 用户和 zabbix 数据库之前步骤已创建。
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”并更改创建的数据库用户的密码,以便在给定的哈希算法中重新生成该密码。为简单起见,最好使用您在创建此用户时输入的相同密码。 vim /etc/my.cnf.d/mysql-server.cnf [mysqld] default-authentication-plugin=mysql_native_password # 在[mysqld]下添加以上参数给予 Mysql systemctl restart mysqld # 然后重启使其生效。 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 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 。
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 字段,代表转换完成。 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) ## 创建索引架构、告警、触发器并清理数据库。 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 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 # 查看启动日志 


systemctl disable --now mysqld 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 vim /etc/zabbix/zabbix_server.conf AllowUnsupportedDBVersiOns=1 # 添加以上字段,因为 zabbix 会拒绝较新未支持的数据库版本,所以需要修改允许一下。 systemctl restart zabbix-server # 重启 
本教程使用 Zabbix 7.0.12 、Rocky Linux 8 作为示例,如果需要其他版本或帮助请加入知识星球。
发送邮件到 [email protected]
或者关注 WX 公众号:网工格物

1 qW7bo2FbzbC0 242 天前 @livid 推广 |
2 Livid MOD PRO @qW7bo2FbzbC0 谢谢,这个广告贴已经被移动并下沉。这个账号会被降权。 |