1安装过程
对于前面的安装过程,本文省略...直接进入主题:问题根因剖析!
2关键组件版本
组件 | 版本 | 备注 |
mysql | 8.0.29 | 目前最新社区版本 |
zabbix | 5.0.7 |
至于zabbix web 用到的nginx和php7不是引发本次问题的主要因素,版本就不再阐述。当然,其实使用的也是目前最新版本。
3在首次安装setup页向导中,连接mysql报如下错误:
4问题分析过程
- 根据zabbix官方文档描述,要求的字符集是utf8
Zabbix server/proxy 需要字符集 utf8 和 utf8_bin 排序规则才能与 MySQL 数据库正常工作。
- 对MySQL8支持的字符集进行分析
MySQL Unicode字符集官方文档:https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
官方对utf8、utf8mb3、utf8mb4的解释如下:
- utf8mb4:Unicode字符集的 UTF-8 编码,每个字符使用1到4个字节。
- utf8mb3:Unicode字符集的UTF-8编码,每个字符使用1到3个字节,MySQL8.0中已弃用此字符集,您应该改用此字符集utfmb4。
- utf8:是utf8mb3的别名,在MySQL 8.0中,此别名已弃用;改为使用utf8mb4,utf8预计在未来的版本中将成为utf8mb4。
由此看出,官方已经说的很明白,在mysql8版本中,utf8的别名是utf8mb3,而且在未来会弃用utf8mb3字符集(说是已弃用,目前还是支持的,估计还处于过渡阶段),那么对于未来,utf8mb4才是主战场。
- 登录mysql8.0.29查看支持的字符集
- 关于如何查看,官方文档有详细的手册:https://dev.mysql.com/doc/refman/8.0/en/charset-mysql.html
mysql> SHOW CHARACTER SET LIKE 'utf%';
查看结果如下图:
从查询结果看出,果然已经没有了utf8,只有utf8mb3和utf8mb4,而且在未来,将以utf8mb4为主
- 继续分析zabbix前端源码 在前端的源码中找到定义字符集的源代码,路径和文件是:zabbix-5.0.7\ui\include\defines.inc.php
- 从defines.inc.php找到数据库默认定义字符集的配置
# 此处是MYSQL和POSTGRESQL的默认字符集 // Default db and field character set (MYSQL & POSTGRESQL) define('ZBX_DB_DEFAULT_CHARSET', 'UTF8'); define('ZBX_DB_MYSQL_DEFAULT_COLLATION', 'utf8_bin'); # 此处是Oracle的默认字符集 // Default db defines for Oracle DB define('ORACLE_MAX_STRING_SIZE', 4000); define('ORACLE_UTF8_CHARSET', 'AL32UTF8'); define('ORACLE_CESU8_CHARSET', 'UTF8');
在上面的代码中很明显的可以看到,在defines.inc.php中,MYSQL默认的字符集是utf8、排序规则是utf8_bin。
- 分析小结论
因zabbix5.0.7版本的UI(前端),对MYSQL默认的字符集配置的是utf8,但最新版本的mysql8.0.29已经舍弃掉utf8,且utf8的别名为utf8mb3,故所以出此错误。据了解,在较新的zabbix5版本中(5.0.7以上)不存在该字符集问题,默认可以同时支持UTF8和UTF8MB3。
5解决问题
修改defines.inc.php,将默认字符集utf8修改为utf8mb3,排序规则可保持不变。
// Default db and field character set (MYSQL & POSTGRESQL) define('ZBX_DB_DEFAULT_CHARSET', 'utf8mb3'); define('ZBX_DB_MYSQL_DEFAULT_COLLATION', 'utf8_bin');
写在最后,该问题成功解决,连接最新版的MySQL8.0.29成功。这是一次非常宝贵的经验,固作此文,总结经验、分享经验。