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 class="bold">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語句。
#代碼位于
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%成功解決問題。但是通過這個案例,我們可以清楚地知道,如果升級失敗,多半是由于表結構更新失敗導致的。最快的解決辦法是,通過恢復數據庫再次升級。如果讀者遇到這種情況,可參考本節介紹的處理辦法來解決。