Mysql分区创建与删除
实例代码
CREATE PROCEDURE `add_table_partition`() COMMENT '增加表分区' BEGIN /****************************************************************** * Creator: Donne * Create Date: 2019-05-29 * Description: 增加所有表的分区,分区类型为p_date_20190529 每月最后一天执行,生成下一个月所有分区 ******************************************************************/ DECLARE v_table_name varchar(50); DECLARE v_par_name varchar(20); DECLARE i int DEFAULT 0; DECLARE no_more int DEFAULT 0; ##将表名和分区名放入游标 DECLARE cursor_employee CURSOR FOR SELECT table_name,max(partition_name) FROM information_schema.partitions WHERE table_schema='test' and partition_name is not null and partition_name<>'p_date_min' GROUP BY table_name; DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more= 1; ##打开游标 OPEN cursor_employee; FETCH cursor_employee INTO v_table_name,v_par_name; ##循环 1:ture, 0:false,!0:ture,!1:false ##select 1 from where !0 WHILE !no_more DO my_loop: LOOP ##从当前开始 SET @j:= DATE_ADD(curdate(),INTERVAL i DAY); ##下个月最后一天 SET @end_date:= last_day(DATE_ADD(last_day(curdate()),INTERVAL 1 DAY)); IF @j > @end_date THEN LEAVE my_loop; END IF; #计数 SET i=i+1; #分区使用values less than,所以+1 SET @par_value:= UNIX_TIMESTAMP(DATE_ADD(curdate(),INTERVAL i DAY)); SET @par_name:= concat('p_date_',date_format(@j,'%Y%m%d')); #如果新建分区大于已有分区,则创建 IF @par_name>v_par_name THEN SET @add_par:= concat('ALTER TABLE ',v_table_name,' ADD PARTITION(PARTITION ',@par_name,' VALUES LESS THAN (',@par_value,'));'); PREPARE stmt from @add_par; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; END LOOP; #重新计数 SET i= 0; #从游标中取出下一条数据 FETCH cursor_employee INTO v_table_name,v_par_name; END WHILE; CLOSE cursor_employee; END
CREATE PROCEDURE `drop table partition`( in start_date date , in end_date date ) COMMENT '删除分区' BEGIN /****************************************************************** * Creator: Donne * Create Date: 2019-05-29 * Description: 删除表分区 ******************************************************************/ DECLARE v_table_name varchar(50); DECLARE v_par_name varchar(20); DECLARE i int DEFAULT 0; DECLARE no_more int DEFAULT 0; ##将表名和分区名放入游标 DECLARE cursor_employee CURSOR FOR SELECT table_name,partition_name FROM information_schema.partitions WHERE table_schema='test' and partition_name is not null and partition_name<>'p_date_min' AND partition_name>=concat('p_date_',date_format(end_date,'%Y%m%d')) AND partition_name<=concat('p_date_',date_format(end_date,'%Y%m%d')); DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more= 1; ##打开游标 OPEN cursor_employee; FETCH cursor_employee INTO v_table_name,v_par_name; ##循环 WHILE !no_more DO SET @drop_par:= concat('ALTER TABLE ',v_table_name,' DROP PARTITION ',v_par_name,';'); PREPARE stmt from @drop_par; EXECUTE stmt; DEALLOCATE PREPARE stmt; FETCH cursor_employee INTO v_table_name,v_par_name; END WHILE; CLOSE cursor_employee; END
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。