正常我们升级版本都是先停止MySQL和Zabbix server,然后开始更新Zabbix server版本,启动MySQL和Zabbix server 就好了,服务首次启动会自己更新数据库相关字段配置信息等。但是在 Zabbix server 4.4.10中有一个字符集问题,升级过程准备就麻烦一点了。

一、 以往方式升级方式会导致的问题以及诱因
  • 当前虽不影响正常使用,但dashboard看着很难受,应该是某项检查没过来着
  • 开启debug模式,查看上面输出结果运行的SQL语句,跟字符集相关。
  • 查看官网文档,发现 Zabbix 4.4.6 就添加了字符集验证(库,表字符集必须为UTF8,涉及到的字段COLLATE必须为utf8_bin)

    备注:当出现这种情况下,很多文档会告诉你重新初始化一遍Zabbix server 4.4.10版本的SQL文件即可,但是这是线上环境,有很多监控数据是要保留的,所以我们能保留数据的话就尽可能保留数据升级,方式可参考下面。
二、升级流程(当前环境CentOS7,MySQl5.7,Nginx1.18,Php7.2)

数据库设置
  • 对现有数据库数据修改字符集之后做一个备机(如数据量少可接受部分数据丢失可不做备机,直接导出修改字符集后再导入数据)
1)先更新数据库字符集
# alter database zabbix DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
2)在次更新库的字符集
# mysql -u root -pxxx zabbix -e "show tables" |awk 'NR>1 {print "alter table "$" DEFAULT CHARSET=utf8 COLLATE=utf8_bin;"}' > /tmp/alter_tmp.sql
# mysql -u root -pxxx zabbix < /tmp/alter_tmp.sql

3)在更新字段的 COLLATE,需要导出数据再导入
# mysqldump -u root -pxxx zabbix >/tmp/zabbix.sql
# sed -i 's/CHARACTER SET utf8/COLLATE utf8_bin/g' /tmp/zabbix.sql
# mysql -u root -pxxx zabbix < /tmp/zabbix.sql

4) 为避免数据尽可能少丢失的话搭建一个主从
.......
Zabbix server服务升级
# rpm -Uvh https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm
  • 停止MySQL服务和Zabbix server 服务,如有Zabbix proxy的话一样停止
# systemctl stop zabbix-server 
# mysqladmin -u root -p shutdown
# cp -R /usr/share/doc/zabbix-* /opt/zabbix-backup/
# yum install epel-release
# yum upgrade zabbix-server-mysql zabbix-web-mysql zabbix-agent
# yum install zabbix-nginx-conf  # 如果没有nginx配置文件可以通过这种方式安装(直接配置好了前端)
  • 启动相关服务
# service mysqld start
# 如有配置变更,需要变更配置在启动,比如是否切到符合字符集的从库上
# service zabbix-server nginx php-fpm zabbix-agent start
  • 修改Php time.zone
# vim /etc/php.ini
....
date.timezone = Asia/ShangHai
....
总结

版本发布之后一定要查看官方的 Release Notes!这样有什么问题可以提前知道修改了啥,要注意一些啥,然后再使用测试环境验证一遍之后再升级!