1. 程式人生 > >zabbix 一次慘痛的分區經歷

zabbix 一次慘痛的分區經歷

zabbix mysql 分區

問題

今天來到公司,像往常一樣打開zabbix,突然發現沒有數據被收集,於是快速檢查了其他的圖形,發現都沒有數據,於是定位到了服務端的問題,檢查日誌發現:zabbix日誌突然報查詢history和history_uint失敗,分區裏找不到這個 clock?技術分享

解決過程

以下僅是以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是日期,正好是今天淩晨,而一上午沒有生成分區,所以導致數據存不進去。知道了原因,先解決,先不探討為什麽有自動分區的問題。

    技術分享

  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 ;

然後執行創建
技術分享

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‘);"


本文出自 “北冰--Q” 博客,請務必保留此出處http://beibing.blog.51cto.com/10693373/1939178

zabbix 一次慘痛的分區經歷