1. 程式人生 > 其它 >第十五章 監控系統-zabbix升級

第十五章 監控系統-zabbix升級

升級 Zabbix 分為兩種情況:一是同版本升級,不涉及資料庫的升級更新;二是跨版本升級,涉及資料庫表結構的更改。

一、同版本升級

同版本升級,執行命令即可,以下是操作步驟。

#1.備份軟體相關檔案和配置檔案,命令如下: 
[root@prd-apm001 ~]$ mkdir -p /data/zabbix/backup 
[root@prd-apm001 ~]$ cp -r /etc/zabbix  /data/zabbix/backup/zabbix_conf 
[root@prd-apm001 ~]$ cp -r /usr/share/zabbix /data/zabbix/backup/zabbix_web 
[root@prd-apm001 ~]$ cp -r /usr/sbin/zabbix_server /data/zabbix/backup/zabbix_server 
[root@prd-apm001 ~]$ cp -r /usr/sbin/zabbix
[root@prd-apm001 ~]$ cp -r /usr/share/doc/zabbix-* /data/zabbix-backup/ 

#2.備份資料庫
[root@prd-apm001 ~]$ sh /usr/sbin/zabbix_mysqldump.sh mysqldump    #備份資料 

#3.升級軟體,相關操作命令如下: 
[root@prd-apm001 ~]$ rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.centos.noarch.rpm
[root@prd-apm001 ~]$ systemctl stop zabbix-server    #停止 zabbix-server 
[root@prd-apm001 ~]$ systemctl stop zabbix-proxy	#停止 zabbix-proxy
[root@prd-apm001 ~]$ yum  upgrade  zabbix-server-mysql  zabbix-web-mysql  zabbix-agent zabbix-get -y 
[root@prd-apm001 ~]$ systemctl start zabbix-server  #開啟 zabbix-server 
[root@prd-apm001 ~]$ systemctl start zabbix-proxy   #開啟 zabbix-proxy 
[root@prd-apm001 ~]$ ps -ef |grep zabbix             #檢視程序
[root@prd-apm001 ~]$ tail -f /var/log/zabbix/zabbix_server.log #檢視日誌  

二、跨版本升級

跨版本升級,其步驟與同版本升級的步驟一致。由於之前版本存有監控資料,因此在升級過程中執行 SQL 語句更改的速度會比較慢。一般跨版本升級不會涉及 history、trends 這些儲存監控歷史資料的表結構的改動,故升級過程時間不會特別長,具體視資料庫狀況和伺服器效能而定。

從啟動 zabbix_server 程序的那一刻起,後臺就執行了對錶結構進行更改的操作,此過程不可逆。此時,切記不可以強行中斷 zabbix_server 程序;否則,再次啟動程序,可能會造成表結構更改失敗的後果,從而導致升級失敗。如果遇到這種情況,最簡單的方法是將表結構刪除(history、trends 表需保留),使用之前的備份進行恢復,等資料庫恢復完成後,再重新啟動zabbix_server 程序,資料庫可再次進行自動升級。

三、資料庫自動升級的原理

資料庫升級的過程是由 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;
}