2 修复Zabbix 数据库的字符集及字符序

MySQL/MariaDB

从历史上看,MySQL 及其衍生版本一直将“utf8”用作 utf8mb3 的别名——这是 MySQL 自己实现的 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,请确保在执行 utf8mb4 转换之前, 先将 Zabbix 服务器和数据库 schema 升级到 6.0.x 或更高版本。

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>';
If MariaDB →  set innodb_strict_mode = OFF;        
               CALL zbx_convert_utf8();
If MariaDB →  set innodb_strict_mode = ON;   
               drop procedure zbx_convert_utf8;

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

7. 如果没有错误,您可能需要为 修正后的数据库再创建一份备份。

8. 启动 Zabbix。