修复 Zabbix 数据库字符集和排序规则

MySQL/MariaDB

从历史上看,MySQL 及其衍生版本将 'utf8' 用作 utf8mb3 的别名 - 这是 MySQL 自己对标准 UTF8 的 3 字节实现,而标准 UTF8 是 4 字节。 从 MySQL 8.0.28 和 MariaDB 10.6.1 开始,'utf8mb3' 字符集已被弃用,并且在某个时间点其支持将被移除,而 'utf8' 将成为 'utf8mb4' 的引用。 自 Zabbix 6.0 起,已支持 'utf8mb4'。为避免将来出现问题,强烈建议使用 'utf8mb4'。 切换到 'utf8mb4' 的另一个优点是支持补充 Unicode 字符。

由于 Zabbix 6.0 之前的版本无法识别 utf8mb4,请务必先将 Zabbix 服务器和 DB schema 升级到 6.0.x 或更高版本,然后再执行 utf8mb4 转换。

1. 检查数据库字符集和排序规则。

例如:

mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| latin2                   | latin2 _general_ci   |
+--------------------------+----------------------+

或者:

mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8                     | utf8_bin             |
+--------------------------+----------------------+

如上所示,这里的字符集不是 'utf8mb4',排序规则也不是 'utf8mb4_bin',因此需要进行修正。

2. 停止 Zabbix。

3. 创建数据库备份副本!

4. 在数据库级别修正字符集和排序规则:

alter database <your DB name> character set utf8mb4 collate utf8mb4_bin;

修正后的值:

mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4                  | utf8mb4_bin          |
+--------------------------+----------------------+ 

5. 加载 脚本 以修正表级和列级的字符集与排序规则:

mysql <your DB name> < utf8mb4_convert.sql

6. 执行脚本:

               SET @ZABBIX_DATABASE = '<your DB name>';
如果是 MariaDB →  set innodb_strict_mode = OFF;        
               CALL zbx_convert_utf8();
如果是 MariaDB →  set innodb_strict_mode = ON;   
               drop procedure zbx_convert_utf8;

请注意,'utf8mb4' 预计会占用略多一些磁盘空间。

7. 如果没有错误 - 您可以考虑使用修正后的数据库创建一个数据库备份副本。

8. 启动 Zabbix。