中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

zabbix表分區詳細步驟

發布時間:2020-08-11 10:10:12 來源:ITPUB博客 閱讀:315 作者:yepkeepmoving 欄目:MySQL數據庫
1、連接數據庫

    mysql -h <database_ip/fqdn> -u<user> -p

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql>
    mysql> use zabbix;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    Database changed
    mysql>

2、改變表索引結構

    mysql> Alter table history_text drop primary key, add index (id), drop index history_text_2, add index history_text_2 (itemid, id);
    Query OK, 0 rows affected (0.49 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    mysql> Alter table history_log drop primary key, add index (id), drop index history_log_2, add index history_log_2 (itemid, id);
    Query OK, 0 rows affected (2.71 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    mysql>

3、存儲過程創建

--增加分區的存儲過程
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 ;

--刪除分區的存儲過程
DELIMITER $$
CREATE PROCEDURE `partition_drop`(SCHEMANAME VARCHAR(64), TABLENAME VARCHAR(64), DELETE_BELOW_PARTITION_DATE BIGINT)
BEGIN
        /*
           SCHEMANAME = The DB schema in which to make changes
           TABLENAME = The table with partitions to potentially delete
           DELETE_BELOW_PARTITION_DATE = Delete any partitions with names that are dates older than this one (yyyy-mm-dd)
        */
        DECLARE done INT DEFAULT FALSE;
        DECLARE drop_part_name VARCHAR(16);

        /*
           Get a list of all the partitions that are older than the date
           in DELETE_BELOW_PARTITION_DATE.  All partitions are prefixed with
           a "p", so use SUBSTRING TO get rid of that character.
        */
        DECLARE myCursor CURSOR FOR
                SELECT partition_name
                FROM information_schema.partitions
                WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND CAST(SUBSTRING(partition_name FROM 2) AS UNSIGNED) < DELETE_BELOW_PARTITION_DATE;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

        /*
           Create the basics for when we need to drop the partition.  Also, create
           @drop_partitions to hold a comma-delimited list of all partitions that
           should be deleted.
        */
        SET @alter_header = CONCAT("ALTER TABLE ", SCHEMANAME, ".", TABLENAME, " DROP PARTITION ");
        SET @drop_partitions = "";

        /*
           Start looping through all the partitions that are too old.
        */
        OPEN myCursor;
        read_loop: LOOP
                FETCH myCursor INTO drop_part_name;
                IF done THEN
                        LEAVE read_loop;
                END IF;
                SET @drop_partitions = IF(@drop_partitions = "", drop_part_name, CONCAT(@drop_partitions, ",", drop_part_name));
        END LOOP;
        IF @drop_partitions != "" THEN
                /*
                   1. Build the SQL to drop all the necessary partitions.
                   2. Run the SQL to drop the partitions.
                   3. Print out the table partitions that were deleted.
                */
                SET @full_sql = CONCAT(@alter_header, @drop_partitions, ";");
                PREPARE STMT FROM @full_sql;
                EXECUTE STMT;
                DEALLOCATE PREPARE STMT;

                SELECT CONCAT(SCHEMANAME, ".", TABLENAME) AS `table`, @drop_partitions AS `partitions_deleted`;
        ELSE
                /*
                   No partitions are being deleted, so print out "N/A" (Not applicable) to indicate
                   that no changes were made.
                */
                SELECT CONCAT(SCHEMANAME, ".", TABLENAME) AS `table`, "N/A" AS `partitions_deleted`;
        END IF;
END$$
DELIMITER ;

--維護分區的存儲過程

DELIMITER $$
CREATE PROCEDURE `partition_maintenance`(SCHEMA_NAME VARCHAR(32), TABLE_NAME VARCHAR(32), KEEP_DATA_DAYS INT, HOURLY_INTERVAL INT, CREATE_NEXT_INTERVALS INT)
BEGIN
        DECLARE OLDER_THAN_PARTITION_DATE VARCHAR(16);
        DECLARE PARTITION_NAME VARCHAR(16);
        DECLARE OLD_PARTITION_NAME VARCHAR(16);
        DECLARE LESS_THAN_TIMESTAMP INT;
        DECLARE CUR_TIME INT;

        CALL partition_verify(SCHEMA_NAME, TABLE_NAME, HOURLY_INTERVAL);
        SET CUR_TIME = UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00'));

        SET @__interval = 1;
        create_loop: LOOP
                IF @__interval > CREATE_NEXT_INTERVALS THEN
                        LEAVE create_loop;
                END IF;

                SET LESS_THAN_TIMESTAMP = CUR_TIME + (HOURLY_INTERVAL * @__interval * 3600);
                SET PARTITION_NAME = FROM_UNIXTIME(CUR_TIME + HOURLY_INTERVAL * (@__interval - 1) * 3600, 'p%Y%m%d%H00');
                IF(PARTITION_NAME != OLD_PARTITION_NAME) THEN
            CALL partition_create(SCHEMA_NAME, TABLE_NAME, PARTITION_NAME, LESS_THAN_TIMESTAMP);
        END IF;
                SET @__interval=@__interval+1;
                SET OLD_PARTITION_NAME = PARTITION_NAME;
        END LOOP;

        SET OLDER_THAN_PARTITION_DATE=DATE_FORMAT(DATE_SUB(NOW(), INTERVAL KEEP_DATA_DAYS DAY), '%Y%m%d0000');
        CALL partition_drop(SCHEMA_NAME, TABLE_NAME, OLDER_THAN_PARTITION_DATE);

END$$
DELIMITER ;

--檢查分區、創建第一個分區的存儲過程
DELIMITER $$
CREATE PROCEDURE `partition_verify`(SCHEMANAME VARCHAR(64), TABLENAME VARCHAR(64), HOURLYINTERVAL INT(11))
BEGIN
        DECLARE PARTITION_NAME VARCHAR(16);
        DECLARE RETROWS INT(11);
        DECLARE FUTURE_TIMESTAMP TIMESTAMP;

        /*
         * Check if any partitions exist for the given SCHEMANAME.TABLENAME.
         */
        SELECT COUNT(1) INTO RETROWS
        FROM information_schema.partitions
        WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_name IS NULL;

        /*
         * If partitions do not exist, go ahead and partition the table
         */
        IF RETROWS = 1 THEN
                /*
                 * Take the current date at 00:00:00 and add HOURLYINTERVAL to it.  This is the timestamp below which we will store values.
                 * We begin partitioning based on the beginning of a day.  This is because we don't want to generate a random partition
                 * that won't necessarily fall in line with the desired partition naming (ie: if the hour interval is 24 hours, we could
                 * end up creating a partition now named "p201403270600" when all other partitions will be like "p201403280000").
                 */
                SET FUTURE_TIMESTAMP = TIMESTAMPADD(HOUR, HOURLYINTERVAL, CONCAT(CURDATE(), " ", '00:00:00'));
                SET PARTITION_NAME = DATE_FORMAT(CURDATE(), 'p%Y%m%d%H00');

                -- Create the partitioning query
                SET @__PARTITION_SQL = CONCAT("ALTER TABLE ", SCHEMANAME, ".", TABLENAME, " PARTITION BY RANGE(`clock`)");
                SET @__PARTITION_SQL = CONCAT(@__PARTITION_SQL, "(PARTITION ", PARTITION_NAME, " VALUES LESS THAN (", UNIX_TIMESTAMP(FUTURE_TIMESTAMP), "));");

                -- Run the partitioning query
                PREPARE STMT FROM @__PARTITION_SQL;
                EXECUTE STMT;
                DEALLOCATE PREPARE STMT;
        END IF;
END$$
DELIMITER ;

--維護上述所有存儲過程的存儲過程
DELIMITER $$
CREATE PROCEDURE `partition_maintenance_all`(SCHEMA_NAME VARCHAR(32))
BEGIN
                CALL partition_maintenance(SCHEMA_NAME, 'history', 28, 24, 14);
                CALL partition_maintenance(SCHEMA_NAME, 'history_log', 28, 24, 14);
                CALL partition_maintenance(SCHEMA_NAME, 'history_str', 28, 24, 14);
                CALL partition_maintenance(SCHEMA_NAME, 'history_text', 28, 24, 14);
                CALL partition_maintenance(SCHEMA_NAME, 'history_uint', 28, 24, 14);
                CALL partition_maintenance(SCHEMA_NAME, 'trends', 730, 24, 14);
                CALL partition_maintenance(SCHEMA_NAME, 'trends_uint', 730, 24, 14);
END$$
DELIMITER ;

4、存儲過程調用方式

--單獨調用維護某個表創建、刪除、增加分區存儲過程
語法格式:
CALL partition_maintenance('<zabbix_db_name>', '<table_name>', <days_to_keep_data>, <hourly_interval>, <num_future_intervals_to_create>)
說明:
zabbix_db_name:數據庫的名稱
table_name:要創建分區表的表名稱
days_to_keep_data:保存分區表數據的天數,超出這個天數的分區表將被刪除,單位是天
hourly_interval:每隔多少小時創建一個分區,單位是小時
num_future_intervals_to_create:每次創建幾個分區
案例:
CALL partition_maintenance('zabbix', 'history', 28, 24, 14);  --對zabbix數據庫的history表創建分區,數據保留28天,每隔24小時創建一個分區,每次創建14個分區

--調用維護預定義的表創建、刪除、增加分區的存儲過程
CALL partition_maintenance_all('zabbix');

5、Housekeeper自維護功能關閉

There are a couple more steps that need to be done on the Zabbix Web UI on 2.2.x (or the zabbix_server.conf file in the case of Zabbix 2.0.x) to shut off housekeeping on the history/trend tables.

Zabbix 2.0.x(這個版本的直接關閉所有Housekeeper功能即可)

For those of you still stuck using the 2.0.x series of Zabbix there is no way to disable specific functionality of the housekeeper. You will have to disable the housekeeper entirely. This can be done by setting the "DisableHousekeeping" parameter in zabbix_server.conf to "1". You then need to restart the zabbix_server process. Keep in mind that with the housekeeper disabled, data in the "housekeeper" table in the database will never be removed. Also, old events, audit entries, and user sessions will never be deleted automatically.

Zabbix 2.2.x(這個版本關閉部分Housekeeper功能即可

Zabbix 2.2 introduced more granular control over the housekeeper. All of the options are available in the Zabbix UI in the "Administration" -> "General" section. Make sure you select "Housekeeping" in the drop-down in the upper right. You should see a screen similar to the following:
zabbix表分區詳細步驟
    Make sure that the checkboxes with the title "Enable internal housekeeping" are unchecked for both History and Trends.
    Make sure that the checkboxes with the title "Override item <trend/history> period" are checked for both History and Trends.
    Set the "Data storage period (in days)" box for history and trends to the amount of time you are retaining both. In the examples that were given, the correct values are 28 and 730 (as seen in the screenshot).

6、創建定時任務,定時對標自動分區

01 01 * * * /opt/software/mysql/bin/mysql -uzabbix -pzabbix zabbix -e "CALL partition_maintenance_all('zabbix');"

--至此 ,zabbix歷史表分區結束

7、說明信息

--四個主要存儲過程
    partition_create - This will create a partition on the given table in the given schema.
    partition_drop - This will drop partitions older than the given timestamp on the given table in the given schema.
    partition_maintenance - This function is what is called by users. It is responsible for parsing the given parameters and then creating/dropping partitions as needed.
    partition_verify - Checks if partitioning is enabled on the given table in the given schema. If it is not enable, it creates a single partition.
--四個存儲過程參數解釋
partition_create

Procedure definition: partition_create(SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64), CLOCK int)
Example: CALL partition_create("zabbix", "history", "p20131216", 1387267200);

    SCHEMANAME = The DB schema in which to make changes
    TABLENAME = The table on which to create PARTITIONNAME
    PARTITIONNAME = The name of the partition to create
    CLOCK = PARTITIONNAME will be created to hold values with a "clock" column value less than this

partition_drop

Procedure definition: partition_drop(SCHEMANAME VARCHAR(64), TABLENAME VARCHAR(64), DELETE_BELOW_PARTITION_DATE VARCHAR(64))
Example: CALL partition_drop("zabbix", "history", "20131216");

    SCHEMANAME = The DB schema in which to make changes
    TABLENAME = The table on which to delete PARTITIONNAME
    DELETE_BELOW_PARTITION_DATE = The oldest partition date to allow. All partitions older than this date will be deleted. The format is yyyymmdd.

partition_maintenance

Procedure definition: partition_maintenance(SCHEMA_NAME VARCHAR(32), TABLE_NAME VARCHAR(32), KEEP_DATA_DAYS INT, HOURLY_INTERVAL INT, CREATE_NEXT_INTERVALS INT)
Example: CALL partition_maintenance('zabbix', 'history', 28, 24, 14);

    SCHEMA_NAME = The DB schema in which to make changes
    TABLE_NAME = The table on which to make changes
    KEEP_DATA_DAYS = The maximum number of days worth of partitions to keep. All partitions older than this number of days will be deleted.
    HOURLY_INTERVAL = The hourly interval between partitions. For example, daily partitioning would have a value of 24, hourly partitioning would have a value of 1.
    CREATE_NEXT_INTERVALS = The number of intervals worth of partitions to create in advance.

partition_verify

Procedure definition: partition_verify(SCHEMANAME VARCHAR(64), TABLENAME VARCHAR(64), HOURLYINTERVAL INT(11))
Example: CALL partition_verify("zabbix", "history");

    SCHEMANAME = The DB schema in which to make changes
    TABLENAME = The table on which to check for partitions
    HOURLY_INTERVAL = The hourly interval between partitions. For example, daily partitioning would have a value of 24, hourly partitioning would have a value of 1.

8、分區參考文檔

https://www.zabbix.org/wiki/Docs/howto/mysql_partition































向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

焉耆| 万全县| 白山市| 利辛县| 桓台县| 密山市| 五原县| 新宁县| 临漳县| 金塔县| 武邑县| 昌吉市| 万安县| 通海县| 宁武县| 连平县| 大荔县| 延寿县| 绥中县| 瑞昌市| 安阳县| 什邡市| 察雅县| 时尚| 车致| 金昌市| 宁晋县| 阳曲县| 洪洞县| 和政县| 富宁县| 中山市| 辽宁省| 志丹县| 中牟县| 海城市| 延安市| 高密市| 沈阳市| 鹤峰县| 台南市|