zabbix 一次慘痛的分區經歷
問題
今天來到公司,像往常一樣打開zabbix,突然發現沒有數據被收集,於是快速檢查了其他的圖形,發現都沒有數據,於是定位到了服務端的問題,檢查日誌發現:zabbix日誌突然報查詢history和history_uint失敗,分區裏找不到這個 clock?
解決過程
以下僅是以history為例的解決路線,暫不探討history_unit
初次認知是分區問題,分區不夠了,開始在網上查分區創建方法
alter table history partition by range (clock)(partition p1 values less than MAXVALUE);
在此我給了MAXVALUE一個很大的值,執行了20分鐘沒有執行完,發現這種方式不行檢查是不是設置了自動分區
show create table history;
發現有一大堆以clock的分區,發現clock是日期,正好是今天淩晨,而一上午沒有生成分區,所以導致數據存不進去。知道了原因,先解決,先不探討為什麽有自動分區的問題。發現問題了,就先解決問題,創建分區吧
CALL partition_create("zabbix", "history", "p201706140000", 1497456000);
創建這個存儲過程,建議參考:https://www.zabbix.org/wiki/Docs/howto/mysql_partition#partition_create ( 網上不靠譜的太多了)
進入數據庫執行下面語句:(root登錄,不知道有沒有影響)
DELIMITER $$CREATE PROCEDURE `partition_create`(SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64), CLOCK int)BEGIN /* SCHEMANAME = The DB schema in which to make changes TABLENAME = The table with partitions to potentially delete PARTITIONNAME = The name of the partition to create */ /* Verify that the partition does not already exist */ DECLARE RETROWS INT; SELECT COUNT(1) INTO RETROWS FROM information_schema.partitions WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_description >= CLOCK; IF RETROWS = 0 THEN /* 1. Print a message indicating that a partition was created. 2. Create the SQL to create the partition. 3. Execute the SQL from #2. */ SELECT CONCAT( "partition_create(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" ) AS msg; SET @sql = CONCAT( ‘ALTER TABLE ‘, SCHEMANAME, ‘.‘, TABLENAME, ‘ ADD PARTITION (PARTITION ‘, PARTITIONNAME, ‘ VALUES LESS THAN (‘, CLOCK, ‘));‘ ); PREPARE STMT FROM @sql; EXECUTE STMT; DEALLOCATE PREPARE STMT; END IF;END$$ DELIMITER ;
然後執行創建
ok,此時把不存在分區的表都創建上,然後重啟zabbix。
現在要查找問題的原因了
因為前面處理zabbix的同事,做了分區分表,然後又在cron內設置了定時任務,定時添加幾天的表區 mysql -uzabbix -pxxx -e "CALL partition_maintenance_all(‘zabbix‘);" 因為我接手後,不知道這是什麽,把zabbix服務器歸納整理後,mysql密碼變了,執行不了了,消耗了一上午的時間,不過清晰了zabbix分區過程,也是有收獲的現在要開始總結下分區分表了
查看存儲過程:select specific_name from mysql.proc ;
查看過程邏輯:show create procedure partition_create \G
刪除存儲過程:drop procedure if exists partition_maintenance_all ;
查看存儲過程:show procedure status like ‘partition_maintenance%‘ \G;
修改存儲過程:ALTER {PROCEDURE|FUNCTION} sp_name [characteriss] 根據官方文檔,創建存儲過程,包括:create、drop、maintenance、verify、maintenance_all 最好根據自身情況對maintenance_all,進行修改,用於減輕數據庫壓力;
DELIMITER $$CREATE PROCEDURE `partition_maintenance_all`(SCHEMA_NAME VARCHAR(32))BEGIN CALL partition_maintenance(SCHEMA_NAME, ‘history‘, 15, 24, 7); CALL partition_maintenance(SCHEMA_NAME, ‘history_log‘, 30, 24, 7); CALL partition_maintenance(SCHEMA_NAME, ‘history_str‘, 30, 24, 7); CALL partition_maintenance(SCHEMA_NAME, ‘history_text‘, 30, 24, 7); CALL partition_maintenance(SCHEMA_NAME, ‘history_uint‘, 15, 24, 7); CALL partition_maintenance(SCHEMA_NAME, ‘trends‘, 60, 24, 7); CALL partition_maintenance(SCHEMA_NAME, ‘trends_uint‘, 60, 24, 7);END$$ DELIMITER ;
最後做項收尾工作
為了避免我們經常去執行創建刪除過程,創建刪除分區,我們要充分利用partition_maintenance_all存儲過程,加入cron中 ,每周一八點執行一次,創建及刪除過程
0 8 1 * * mysql -uroot -pxxx zabbix -e "CALL partition_maintenance_all(‘zabbix‘);"
本文出自 “北冰--Q” 博客,請務必保留此出處http://beibing.blog.51cto.com/10693373/1939178
zabbix 一次慘痛的分區經歷