zabbix清理監控歷史mysql數據


問題描述:

今天同事說有個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來回收存儲空間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM