問題描述:
今天同事說有個zabbix監控數據庫歷史數據越來越多了,
讓我幫忙清一下,順便熟悉練練手,做個筆記
zabbix監控運行一段時間以后,會留下大量的歷史監控數據
zabbix數據庫一直在增大可能會造成系統性能下降,查看歷史數據室查詢速度緩慢。
zabbix里面最大的表就是history和history_uint兩個表,但是我這邊查看到history_log表也是最大的。
而且zabbix里面的時間是使用的時間戳方式記錄,所以可以根據時間戳來刪除歷史數據。
解決方法:
1、首先需要關閉zabbix和httpd服務:
我的系統是centos7系統,關閉服務是這種
[root@awza ~]# systemctl stop zabbix-server.service
[root@awza ~]# systemctl stop httpd.service
2、查看數據庫目錄文件的大小
[root@awza zabbix]# pwd /database/mysql/zabbix [root@awza zabbix]# ll -h |grep G total 129G -rw-rw---- 1 mysql mysql 2.9G Nov 4 15:15 history.ibd -rw-rw---- 1 mysql mysql 121G Nov 4 15:15 history_log.ibd -rw-rw---- 1 mysql mysql 4.2G Nov 4 15:15 history_uint.ibd
生成一個Unix時間戳,例如想刪除2019-05-01號之前的數據(保留19年5月1號以后的監控數據)
或者使用站長時間戳工具生成:https://tool.lu/timestamp/
[root@awza zabbix]# date +%s -d "May 1, 2019 00:00:00" 1556640000
3、數據庫備份(重要的話最好做一下備份)
我這邊備份磁盤空間不足,說不用備份,出現了mysqldump: Got errno 28 on write就是磁盤空間不足
[root@awza ~]# /usr/bin/mysqldump -uzabbix -p --triggers --routines --events zabbix > /database/backup/zabbix-mysql-20191104.sql Enter password: mysqldump: Got errno 28 on write
4、查詢歷史表數據數:
[root@awza backup]# mysql -uzabbix -p Enter password: MariaDB [(none)]> use zabbix MariaDB [zabbix]> select max(itemid) from history; +-------------+ | max(itemid) | +-------------+ | 62944 | +-------------+ 1 row in set (0.00 sec) MariaDB [zabbix]> select max(itemid) from history_uint; +-------------+ | max(itemid) | +-------------+ | 62950 | +-------------+ 1 row in set (0.00 sec) MariaDB [zabbix]> select max(itemid) from history_log; +-------------+ | max(itemid) | +-------------+ | 62863 | +-------------+ 1 row in set (0.00 sec)
5、按時間戳清理監控歷史數據:
這邊清理相關表按照歷史表的大小來清理,根據(2、查看數據庫目錄文件的大小)
第一種清理方法:
use zabbix; MariaDB [zabbix]> delete from history where clock < 1556640000; Query OK, 0 rows affected (41.70 sec) MariaDB [zabbix]> delete from history_uint where clock < 1556640000; Query OK, 0 rows affected (3 min 51.22 sec) MariaDB [zabbix]> delete from history_log where clock < 1556640000; ERROR 1206 (HY000): The total number of locks exceeds the lock table size ##注意:這邊時間戳按照自己的條件寫,1556640000這個是我前面按照2019-05-01計算出來的時間戳 這邊刪除第三個表的時候,因為數據量太大,導致報錯: 錯誤1206(HY000):鎖的總數超過了鎖表的大小 這個表也不重要,所以就執行下面的truncate命令來清理
第二種清理方法:
truncate table history; optimize table history;------------------------------------------------------- truncate table history_log; optimize table history_log; ------------------------------------------------------- truncate table history_uint; optimize table history_uint; 注意:這些命令會把zabbix所有的監控數據清空,操作前注意備份數據庫 truncate是清空整張表,然后根據表結構重新建立,delete刪除的是記錄的數據沒有修改表 truncate執行刪除比較快,但是在事務處理安全性方面不如delete 如果我們執行truncate的表正在處理事務,這個命令退出並會產生錯誤信息
MariaDB [zabbix]> 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 (7 min 4.03 sec)
6、開啟服務
[root@awza database]# systemctl start zabbix-server.service
[root@awza database]# systemctl start httpd.service
注意提示:
當你刪除數據時,mysql並不會回收已刪除的數據所占據的存儲空間,以及索引位。
而是空在那里,而是等待新的數據來彌補這個空缺,這樣就有一個缺少,如果一時半會,沒有數據來填補這個空缺,那這樣就太浪費資源了。
所以對於寫比較頻繁的表,要定期進行optimize,看實際情況而定了,所以刪除了歷史數據,可以使用optimize來回收存儲空間。