1.建立分区表
CREATE TABLE `brd_collection_01` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`addtime` INT(11) NOT NULL COMMENT '时间',
`sex` INT(1) DEFAULT NULL COMMENT '性别 1男 2女',
`card_type` INT(11) DEFAULT '1' COMMENT '类型',
PRIMARY KEY (`id`,`addtime`)
) ENGINE=MYISAM AUTO_INCREMENT=2581 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (`addtime`)
(PARTITION p20180930 VALUES LESS THAN (1538236800) ENGINE = MyISAM) */;
2.查看分区
SELECT
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
FROM information_schema.partitions WHERE
table_schema = SCHEMA()
AND table_name='brd_collection_01';
用存储过程生成增加分区的语句
ALTER TABLE brd_collection_01 ADD PARTITION (PARTITION p20181001 VALUES LESS THAN (1538323200));
3. 存储过程
DELIMITER $$
USE `ml_test`$$
DROP PROCEDURE IF EXISTS `create_partition`$$
CREATE DEFINER=`root`@`%` PROCEDURE `create_partition`()
BEGIN
/* 事务回滚,其实放这里没什么作用,ALTER TABLE是隐式提交,回滚不了的。*/
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
START TRANSACTION;
/* 到系统表查出这个表的最大分区,得到最大分区的日期。在创建分区的时候,名称就以日期格式存放,方便后面维护 */
SELECT REPLACE(partition_name,'p','') INTO @P12_Name FROM INFORMATION_SCHEMA.PARTITIONS
WHERE table_name='cmf_collection_record' ORDER BY partition_ordinal_position DESC LIMIT 1;
SET @Max_date= DATE(DATE_ADD(@P12_Name+0, INTERVAL 1 DAY))+0;
/* 修改表,在最大分区的后面增加一个分区,时间范围加1天 */
SET @s1=CONCAT('ALTER TABLE cmf_collection_record ADD PARTITION (PARTITION p',@Max_date,' VALUES LESS THAN ( UNIX_TIMESTAMP(',@Max_date,')))');
/* 输出查看增加分区语句*/
SELECT @s1;
PREPARE stmt2 FROM @s1;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt2;
/* 取出最小的分区的名称,并删除掉 。
注意:删除分区会同时删除分区内的数据,慎重 */
/*select partition_name into @P0_Name from INFORMATION_SCHEMA.PARTITIONS
where table_name='tb_3a_huandan_detail' order by partition_ordinal_position limit 1;
SET @s=concat('ALTER TABLE tb_3a_huandan_detail DROP PARTITION ',@P0_Name);
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1; */
/* 提交 */
COMMIT ;
END$$
DELIMITER ;
4.调用
5.用job 自动调用
省略