3.12 升级Zabbix
升级Zabbix分为两种情况:一是同版本升级,不涉及数据库的升级更新;二是跨版本升级,涉及数据库表结构的更改。
3.12.1 同版本升级的方法
同版本升级,执行命令即可,以下是操作步骤。
(1)备份软件相关文件和配置文件,命令如下:
shell# mkdir -p /data/zabbix/backup shell# cp -r /etc/zabbix /data/zabbix/backup/zabbix_conf shell# cp -r /usr/share/zabbix /data/zabbix/backup/zabbix_web shell# cp -r /usr/sbin/zabbix_server /data/zabbix/backup/zabbix_server shell# cp -r /usr/sbin/zabbix_proxy /data/zabbix/backup/zabbix_proxy shell# cp -r /usr/share/doc/zabbix-* /data/zabbix-backup/
(2)备份数据库,使用本章3.9.2节的备份脚本进行。
(3)升级软件,相关操作命令如下:
shell# rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.centos.noarch.rpm shell# systemctl stop zabbix-server #停止zabbix-server shell# systemctl stop zabbix-proxy #停止zabbix-proxy shell# yum upgrade zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-get -y shell# systemctl start zabbix-server #开启zabbix-server shell# systemctl start zabbix-proxy #开启zabbix-proxy shell# ps -ef |grep zabbix #查看进程 shell# tail -f /var/log/zabbix/zabbix_server.log #查看日志
3.12.2 跨版本升级的方法
跨版本升级,其步骤与同版本升级的步骤一致。由于之前版本存有监控数据,因此在升级过程中执行SQL语句更改的速度会比较慢。一般跨版本升级不会涉及history、trends这些存储监控历史数据的表结构的改动,故升级过程时间不会特别长,具体视数据库状况和服务器性能而定。
从启动zabbix_server进程的那一刻起,后台就执行了对表结构进行更改的操作,此过程不可逆。此时,切记不可以强行中断zabbix_server进程;否则,再次启动进程,可能会造成表结构更改失败的后果,从而导致升级失败。如果遇到这种情况,最简单的方法是将表结构删除(history、trends表需保留),使用之前的备份进行恢复,等数据库恢复完成后,再重新启动zabbix_server进程,数据库可再次进行自动升级。
3.12.3 数据库自动升级的原理
数据库升级的过程是由zabbix_server进程自动执行的,升级语句包含在代码中,有ALTER、UPDATE等SQL语句。
#代码位于https://github.com/zabbix-book/zabbix-4.0.0alpha8/blob/master/src/libs/zbxdbupgrade/dbupgrade_3050.c#L761-L780 static int DBpatch_3050069(void) { int res; res = DBexecute( "update widget_field" " set name='itemids'" " where name='itemid'" " and exists (" "select null" " from widget w" " where widget_field.widgetid=w.widgetid" " and w.type='plaintext'" ")"); if(ZBX_DB_OK > res) return FAIL; return SUCCEED; }
3.12.4 升级失败的处理案例
以下案例由笔者好友汤永全提供。升级失败的原因是在升级过程中,意外中断了zabbix_server进程,致使表结构更改不成功,间接导致zabbix_server更新失败。通过查询zabbix_server.log的日志,可以看到如下提示:
12259:20181011:145325.324 Starting Zabbix Server. Zabbix 4.0.0(revision 85308).
12259:20181011:145325.324 ****** Enabled features ******
12259:20181011:145325.324 SNMP monitoring: YES
12259:20181011:145325.324 IPMI monitoring: YES
12259:20181011:145325.324 Web monitoring: YES
12259:20181011:145325.324 VMware monitoring: YES
12259:20181011:145325.324 SMTP authentication: YES
12259:20181011:145325.324 Jabber notifications: YES
12259:20181011:145325.324 Ez Texting notifications: YES
12259:20181011:145325.324 ODBC: YES
12259:20181011:145325.324 SSH2 support: YES
12259:20181011:145325.324 IPv6 support: YES
12259:20181011:145325.324 TLS support: YES
12259:20181011:145325.324 ******************************
12259:20181011:145325.324 using configuration file:/etc/zabbix/zabbix_server.conf
12259:20181011:145325.328 current database version (mandatory/optional):03050047/03050047
12259:20181011:145325.328 required mandatory version: 04000000
为了更清楚地了解为何更新失败,将zabbix_server.conf的日志级别改为Debug模式,重新启动,可以看到如下错误提示:
12988:20181011:145847.827 [Z3005] query failed: [1060] Duplicate column name 'query_fields' [alter table `items` add `query_fields` varchar(2048)default '' not null] 12988:20181011:145847.827 query [alter table `items` add `query_fields`varchar(2048) default '' not null] failed, setting transaction as failed 12988:20181011:145847.827 query [txnlev:1] [rollback; ] 12988:20181011:145847.827 database upgrade failed 12988:20181011:145847.827 End of DBcheck_version():FAIL 13008:20181011:145858.079 Starting Zabbix Server. Zabbix 4.0.0 (revision 85308).
通过日志可以看到,是因为表结构无法添加字段而导致的更新失败。查询items表结构:
mysql> show create table items \G; *************************** 1. row *************************** Table: items Create Table: CREATE TABLE `items`( `itemid` bigint(20)unsigned NOT NULL, ......省略部分输出...... `state` int(11)NOT NULL DEFAULT '0', ......省略部分输出...... `url` varchar(2048)COLLATE utf8_bin NOT NULL DEFAULT '', `query_fields` varchar(2048) COLLATE utf8_bin NOT NULL DEFAULT '', PRIMARY KEY(`itemid`), UNIQUE KEY `items_1`(`hostid`, `key_`), KEY `items_3`(`status`), ......省略部分输出...... )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
删除提示错误的字段,命令如下:
mysql> alter table `items` DROP COLUMN `query_fields` ;
重启zabbix_server进程,可以顺利升级。
当然,这个案例只是个例,并不能保证100%成功解决问题。但是通过这个案例,我们可以清楚地知道,如果升级失败,多半是由于表结构更新失败导致的。最快的解决办法是,通过恢复数据库再次升级。如果读者遇到这种情况,可参考本节介绍的处理办法来解决。