Mysql 程序分区 table

Mysql Procedure Partitioning table

我不知道为什么我的脚本不起作用!!! 我开发了划分 tables 的程序。我已经 运行 使用调度程序的过程,但没有创建分区。

我想在程序中每月使分区 table 与变量 months_future 一样多。 因此我使用了 'while'.

有没有人能帮帮我??

有程序。

DELIMITER $$

DROP PROCEDURE IF EXISTS CreatePartitions $$

-- Procedure to delete old partitions and create new ones based on a given date.
-- enough new partitions will be made to cover until (today_date + days_future)
CREATE PROCEDURE CreatePartitions (dbname TEXT, tblname TEXT, months_future INT)
BEGIN

DECLARE curdate date;
DECLARE newpart_date date;

DECLARE partition_table_name varchar(50);
DECLARE i INT;




SELECT CURDATE()
INTO curdate;

SELECT 1 INTO i;

WHILE(i <= months_future)
DO

SET partition_table_name = CONCAT('p_',CAST(((curdate + INTERVAL i MONTH)+0) as char(6)));

IF NOT EXISTS (
    SELECT *
    FROM information_schema.PARTITIONS
    WHERE TABLE_NAME=tblname
    AND TABLE_SCHEMA=dbname
    AND PARTITION_NAME = partition_table_name
)
THEN
    SET @sql := CONCAT('ALTER TABLE '
    , tblname
    , ' ADD PARTITION (PARTITION '
    , partition_table_name
    , ' VALUES LESS THAN ('
    ,'\''
    , DATE_FORMAT(DATE_ADD(curdate, INTERVAL i + 1 MONTH), '%Y%m01')
    ,'\''
    , '));');

    SELECT @sql;
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END IF;

SET i = i + 1;


END WHILE;


END $$

DELIMITER ;

不要建立超过一个未来的分区;它减慢了速度。只需在需要前一天为下个月构建分区即可。同时保留一个 future 分区,以防处理无法及时构建分区。

更多讨论在这里:http://mysql.rjweb.org/doc.php/partitionmaint

请注意,每月分区的唯一用途是如果您打算通过快速 DROP PARTITION 代替慢速 DELETE 来清除“旧”数据。