我的编程空间,编程开发者的网络收藏夹
学习永远不晚

zabbix 一次惨痛的分区经历

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

zabbix  一次惨痛的分区经历

问题

今天来到公司,像往常一样打开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
        
         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                
                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');"


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

zabbix 一次惨痛的分区经历

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

记一次惨痛经历(安装Android Studio3.6)

前言:首先,坐下来想一想,到底有多惨痛。 目的:安装AS3.6时间消耗12.26号17点到8点半(3个半小时)时间消耗22.27号早8点到11点(3个小时)总时长6个半小时仅仅就是安装一个AS,这么长时间,所以怀疑人生,怀疑智商(成功之后欲
2022-06-06

编程热搜

目录