zabbix 一次惨痛的分区经历
admin
2023-05-18 03:02:08
0次

问题

今天来到公司,像往常一样打开zabbix,突然发现没有数据被收集,于是快速检查了其他的图形,发现都没有数据,于是定位到了服务端的问题,检查日志发现:zabbix日志突然报查询history和history_uint失败,分区里找不到这个 clock?zabbix  一次惨痛的分区经历

解决过程

以下仅是以history为例的解决路线,暂不探讨history_unit

  1. 初次认知是分区问题,分区不够了,开始在网上查分区创建方法 
    alter table history partition by range (clock)(partition p1 values less than MAXVALUE); 
    在此我给了MAXVALUE一个很大的值,执行了20分钟没有执行完,发现这种方式不行

  2. 检查是不是设置了自动分区 
    show create table history; 
    发现有一大堆以clock的分区,发现clock是日期,正好是今天凌晨,而一上午没有生成分区,所以导致数据存不进去。知道了原因,先解决,先不探讨为什么有自动分区的问题。

    zabbix  一次惨痛的分区经历

  3. 发现问题了,就先解决问题,创建分区吧 
    CALL partition_create("zabbix", "history", "p201706140000", 1497456000); 
    提示没有这个partition_create存储过程,所以无法执行,挺纳闷,先不解决这个; 
    创建这个存储过程,建议参考: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 ;

然后执行创建 
zabbix  一次惨痛的分区经历

ok,此时把不存在分区的表都创建上,然后重启zabbix。

  1. 现在要查找问题的原因了 
    因为前面处理zabbix的同事,做了分区分表,然后又在cron内设置了定时任务,定时添加几天的表区 mysql -uzabbix -pxxx -e "CALL partition_maintenance_all('zabbix');" 因为我接手后,不知道这是什么,把zabbix服务器归纳整理后,mysql密码变了,执行不了了,消耗了一上午的时间,不过清晰了zabbix分区过程,也是有收获的

  2. 现在要开始总结下分区分表了 
    查看存储过程: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 ;
  1. 最后做项收尾工作 
    为了避免我们经常去执行创建删除过程,创建删除分区,我们要充分利用partition_maintenance_all存储过程,加入cron中 ,每周一八点执行一次,创建及删除过程
    0 8 1 * * mysql -uroot -pxxx zabbix -e "CALL partition_maintenance_all('zabbix');"


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...