将 Zabbix Server 从 MariaDB 迁移至 PostgreSQL

最近在测试 PostgreSQL,学习从基本的使用,维护以及性能调优到利用各种 PostgreSQL 内置的先进功能,当然了,最好的学习永远都是实践,因此便有了这篇教程(学习笔记)。

部署环境: Ubuntu 24.04 x64, Zabbix 7.0 LTS

首先安装 PostgreSQL 16 和 pgloader。

1
2
3
4
apt install postgresql-common -y
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
apt install postgresql pgloader -y
systemctl enable postgresql

安装完成后我们首先需要确保数据库服务器的安全性,限制 PostgreSQL 只能监听 localhost。

修改 /etc/postgresql/16/main/postgresql.conf,确保 listen_addresses 配置项的值为 localhost, 其余的配置保持默认即可。

修改完成后重启 PostgreSQL 进程。

1
systemctl restart postgresql

然后我们需要修改 postgres 用户的密码

1
2
3
sudo -u postgres psql
postgres=# ALTER USER postgres PASSWORD '输入你的密码';
postgres=# \q

修改 /etc/postgresql/16/main/pg_hba.conf,添加以下配置以允许 zabbix 用户通过本地连接至 zabbix 数据库,并强制用户使用 scram-sha-256 传输加密后的密码

1
local zabbix zabbix scram-sha-256

添加 zabbix 用户,创建 zabbix 数据库,并且将数据库所有者修改为 zabbix

1
2
sudo -u postgres createuser --pwprompt zabbix
sudo -u postgres createdb -O zabbix zabbix

然后我们需要创建数据库迁移所需要的文件 create.sqlalter.sqlzabbix_migrate.load

下载并解压 Zabbix 源代码,其中包括了数据库结构文件,这正是我们所需要的。

1
2
wget https://cdn.zabbix.com/zabbix/sources/stable/7.0/zabbix-7.0.0.tar.gz
tar -zxvf zabbix-7.0.0.tar.gz

将 schema.sql 复制至根目录,生成 create.sqlalter.sql

1
2
3
cp zabbix-7.0.0/database/postgresql/schema.sql .
sed -n '/CREATE.*/,/INSERT.*$/p' schema.sql | head -n-1 > create.sql
grep ALTER schema.sql > alter.sql

创建 zabbix_migrate.load 文件并写入以下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
LOAD DATABASE
FROM mysql://zabbix@localhost/zabbix
INTO postgresql://zabbix@localhost/zabbix
WITH include no drop,
truncate,
create no tables,
create no indexes,
no foreign keys,
reset sequences,
data only
SET maintenance_work_mem TO '1024MB', work_mem to '256MB'
ALTER SCHEMA 'zabbix' RENAME TO 'public'
BEFORE LOAD EXECUTE create.sql
AFTER LOAD EXECUTE alter.sql;

注意这里假设你的 MariaDB 中 Zabbix 数据库名为 zabbix,用户名为 zabbix

停止 Zabbix Server 并使用 pgloader 迁移数据库。注意如果你的 zabbix 数据库数据量非常大,但服务器内存又非常有限时(<4G),你可以在开始迁移之前创建一个临时 Swap 文件以避免迁移过程因为内存不足而被中断。

1
2
systemctl stop zabbix-server
PGPASSWORD='你的 PostgreSQL 密码' MYSQL_PWD='你的 MariaDB 密码' pgloader zabbix_migrate.load

这里使用环境变量而不是写入配置文件的原因是因为密码中含有特殊字符,因此会导致迁移文件无法被正确读取,进而导致迁移失败。

pgloader 的文档中并没有记载除了 PostgreSQL 密码之外,使用环境变量导入数据库连接密码的变量名。我是在阅读了 pgloader 的源代码后才了解到 MYSQL_PWD 这个环境变量的存在。

移除 Zabbix Server MySQL,安装 Zabbix Server PostgreSQL 和对应的 PHP 扩展。

1
2
apt remove zabbix-server-mysql -y
apt install zabbix-server-pgsql php8.3-pgsql -y

移除 Zabbix 前端的配置文件,重启 Zabbix Server 并将其设为开机启动。

1
2
3
\rm /etc/zabbix/web/zabbix.conf.php
systemctl restart zabbix-server
systemctl enable zabbix-server

然后这时再访问 Zabbix 前端时会要求你输入数据库的连接信息,数据库类型选择 PostgreSQL,输入你在之前步骤中配置的 zabbix 用户密码。

在确认无误后,这时就可以停止 MariaDB ,卸载相关软件包并删除旧的数据。

1
2
3
4
5
systemctl stop mariadb
systemctl disable mariadb
apt purge mariadb-server -y
apt autoremove -y
\rm -rf /var/lib/mysql

Source

MIGRATING FROM MYSQL TO POSTGRESQL