問題描述
zabbix server 平穩運行有一段時間了,但是最近問題卻來了,今天早上收到zabbixserver磁盤空間不足的告警。通過查看之后發現是大部分數據是zabbix 庫的的數據 在進一步查看發現是history表和history_uint數據太多導致磁盤占用過多。
問題分析
history_uint
該表存儲的是監控項的無符號整型的數據。
該數據的保存時長,取決於在監控項設置的 歷史數據保留時長。
history
這個表保存的是浮點型的。
像 history_str 等保存的是 字符型數據。這些都是我們在設置監控項的對應的信息類型決定的。
該數據的保存時長,取決於在監控項設置的 歷史數據保留時長
針對這個問題,我打算刪除 history_uint 和 history 的一些歷史數據。
要刪除history_uint里的數據,還需要注意一點,由於數據量比較多,我建議可以分多次少量數據進行刪除,因為我一次刪除90天的時候CPU已經吃不消了...


這樣可以避免一次性刪除數據過多導致數據庫的負載比較大。(或者可以使用limit 10000)
處理過程
我這里需要刪除90天以前的數據下面是我的操作過程
獲取時間戳
#通過如下命令進行獲取90天以前的時間戳
[root@zabbix-server ~]# date -d $(date -d "-90 day" +%Y%m%d) +%s 1590105600
登錄數據庫操作
[root@zabbix-server ~]# mysql -uzabbix -p Enter password: mysql> use zabbix; Database changed #delete history_uint mysql> delete from history_uint where clock < 1590105600 LIMIT 10000; Query OK, 1653 rows affected (1 min 45.42 sec) #delete history mysql> delete from history where clock < 1590105600 LIMIT 10000; Query OK, 0 rows affected (24.72 sec)
釋放空間
上面執行刪除后,數據的存儲空間是沒有減少的,因為對於delete from table_name where xxx 帶條件的刪除,不管是innodb還是MyISAM都不會釋放空間,需要進行OPTIMIZE TABLE操作,進行釋放空間。
注意:在optimize table '表名' 運行過程中,MySQL會進行鎖表。
optimize table history_uin
mysql> optimize table history_uint; +---------------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------------+----------+----------+-------------------------------------------------------------------+ | zabbix.history_uint | optimize | note | Table does not support optimize, doing recreate + analyze instead | | zabbix.history_uint | optimize | status | OK | +---------------------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (5 min 33.76 sec)
optimize table history
mysql> optimize table history; +----------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------------+----------+----------+-------------------------------------------------------------------+ | zabbix.history | optimize | note | Table does not support optimize, doing recreate + analyze instead | | zabbix.history | optimize | status | OK | +----------------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (1 min 39.51 sec)
問題解決
待以上步驟都完成以后,檢查磁盤可以看到問題解決。
不過想要一勞永益的話的話 還是需要寫一個腳本來處理這個問題
#!/bin/bash
User="zabbix"
Passwd="zabbix"
Date=`date -d $(date -d "-90 day" +%Y%m%d) +%s`
echo $Date
$(which mysql) -u${User} -p${Passwd} -e "
use zabbix;
DELETE FROM history WHERE 'clock' < '$Date';
optimize table history;
DELETE FROM history_str WHERE 'clock' < '$Date';
optimize table history_str;
DELETE FROM history_uint WHERE 'clock' < '$Date';
optimize table history_uint;
DELETE FROM history_text WHERE 'clock' < '$Date';
optimize table history_text;
DELETE FROM trends WHERE 'clock' < '$Date';
optimize table trends;
DELETE FROM trends_uint WHERE 'clock' < '$Date';
optimize table trends_uint;
DELETE FROM events WHERE 'clock' < '$Date';
optimize table events;
"
另外歷史數據過多是由於我們保存的歷史數據的時間所致,我們可以根據需求設置歷史數據的保留時長,例如一些相對不太重要的數據,我們可以將該值設置的更短一些,這樣數據量也就隨着減少了。