您好,登錄后才能下訂單哦!
今天來到公司,像往常一樣打開zabbix,突然發(fā)現(xiàn)沒有數(shù)據(jù)被收集,于是快速檢查了其他的圖形,發(fā)現(xiàn)都沒有數(shù)據(jù),于是定位到了服務(wù)端的問題,檢查日志發(fā)現(xiàn):zabbix日志突然報查詢history和history_uint失敗,分區(qū)里找不到這個 clock?
以下僅是以history為例的解決路線,暫不探討history_unit
初次認(rèn)知是分區(qū)問題,分區(qū)不夠了,開始在網(wǎng)上查分區(qū)創(chuàng)建方法
alter table history partition by range (clock)(partition p1 values less than MAXVALUE);
在此我給了MAXVALUE一個很大的值,執(zhí)行了20分鐘沒有執(zhí)行完,發(fā)現(xiàn)這種方式不行
檢查是不是設(shè)置了自動分區(qū)
show create table history;
發(fā)現(xiàn)有一大堆以clock的分區(qū),發(fā)現(xiàn)clock是日期,正好是今天凌晨,而一上午沒有生成分區(qū),所以導(dǎo)致數(shù)據(jù)存不進去。知道了原因,先解決,先不探討為什么有自動分區(qū)的問題。
發(fā)現(xiàn)問題了,就先解決問題,創(chuàng)建分區(qū)吧
CALL partition_create("zabbix", "history", "p201706140000", 1497456000);
提示沒有這個partition_create存儲過程,所以無法執(zhí)行,挺納悶,先不解決這個;
創(chuàng)建這個存儲過程,建議參考:https://www.zabbix.org/wiki/Docs/howto/mysql_partition#partition_create ( 網(wǎng)上不靠譜的太多了)
進入數(shù)據(jù)庫執(zhí)行下面語句:(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 ;
然后執(zhí)行創(chuàng)建
ok,此時把不存在分區(qū)的表都創(chuàng)建上,然后重啟zabbix。
現(xiàn)在要查找問題的原因了
因為前面處理zabbix的同事,做了分區(qū)分表,然后又在cron內(nèi)設(shè)置了定時任務(wù),定時添加幾天的表區(qū) mysql -uzabbix -pxxx -e "CALL partition_maintenance_all('zabbix');" 因為我接手后,不知道這是什么,把zabbix服務(wù)器歸納整理后,mysql密碼變了,執(zhí)行不了了,消耗了一上午的時間,不過清晰了zabbix分區(qū)過程,也是有收獲的
現(xiàn)在要開始總結(jié)下分區(qū)分表了
查看存儲過程: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] 根據(jù)官方文檔,創(chuàng)建存儲過程,包括:create、drop、maintenance、verify、maintenance_all 最好根據(jù)自身情況對maintenance_all,進行修改,用于減輕數(shù)據(jù)庫壓力;
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 ;
最后做項收尾工作
為了避免我們經(jīng)常去執(zhí)行創(chuàng)建刪除過程,創(chuàng)建刪除分區(qū),我們要充分利用partition_maintenance_all存儲過程,加入cron中 ,每周一八點執(zhí)行一次,創(chuàng)建及刪除過程
0 8 1 * * mysql -uroot -pxxx zabbix -e "CALL partition_maintenance_all('zabbix');"
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。