• ADADADADAD

    zabbix 一次惨痛的分区经历[ mysql数据库 ]

    mysql数据库 时间:2024-12-25 09:55:02

    作者:文/会员上传

    简介:

    问题今天来到公司,像往常一样打开zabbix,突然发现没有数据被收集,于是快速检查了其他的图形,发现都没有数据,于是定位到了服务端的问题,检查日志发现:zabbix日志突然报查询history

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    问题

    今天来到公司,像往常一样打开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);
    提示没有这个partition_create存储过程,所以无法执行,挺纳闷,先不解决这个;
    创建这个存储过程,建议参考:https://www.zabbix.org/wiki/Docs/howto/mysql_partition#partition_create( 网上不靠谱的太多了)
    进入数据库执行下面语句:(root登录,不知道有没有影响)

    DELIMITER$$CREATEPROCEDURE`partition_create`(SCHEMANAMEvarchar(64),TABLENAMEvarchar(64),PARTITIONNAMEvarchar(64),CLOCKint)BEGIN/*SCHEMANAME=TheDBschemainwhichtomakechangesTABLENAME=ThetablewithpartitionstopotentiallydeletePARTITIONNAME=Thenameofthepartitiontocreate*//*Verifythatthepartitiondoesnotalreadyexist*/DECLARERETROWSINT;SELECTCOUNT(1)INTORETROWSFROMinformation_schema.partitionsWHEREtable_schema=SCHEMANAMEANDtable_name=TABLENAMEANDpartition_description>=CLOCK;IFRETROWS=0THEN/*1.Printamessageindicatingthatapartitionwascreated.2.CreatetheSQLtocreatethepartition.3.ExecutetheSQLfrom#2.*/SELECTCONCAT("partition_create(",SCHEMANAME,",",TABLENAME,",",PARTITIONNAME,",",CLOCK,")")ASmsg;SET@sql=CONCAT('ALTERTABLE',SCHEMANAME,'.',TABLENAME,'ADDPARTITION(PARTITION',PARTITIONNAME,'VALUESLESSTHAN(',CLOCK,'));');PREPARESTMTFROM@sql;EXECUTESTMT;DEALLOCATEPREPARESTMT;ENDIF;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$$CREATEPROCEDURE`partition_maintenance_all`(SCHEMA_NAMEVARCHAR(32))BEGINCALLpartition_maintenance(SCHEMA_NAME,'history',15,24,7);CALLpartition_maintenance(SCHEMA_NAME,'history_log',30,24,7);CALLpartition_maintenance(SCHEMA_NAME,'history_str',30,24,7);CALLpartition_maintenance(SCHEMA_NAME,'history_text',30,24,7);CALLpartition_maintenance(SCHEMA_NAME,'history_uint',15,24,7);CALLpartition_maintenance(SCHEMA_NAME,'trends',60,24,7);CALLpartition_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');"


    zabbix 一次惨痛的分区经历.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mysql分区zabbix