美文网首页
mysql 每月自动创建分区

mysql 每月自动创建分区

作者: 皮皮铭 | 来源:发表于2020-11-04 16:57 被阅读0次

每月自动创建分区逻辑,通过创建一个事件定时任务去执行存储过程
数据表结构,分区字段必须是主键索引中的字段,这里用时间来分


0b67f3b79e08028bc02520de9632c40.png

自动创建分区需要先添加几个分区

#添加分区
ALTER TABLE attribute_data PARTITION by RANGE (UNIX_TIMESTAMP(create_time))
(
    PARTITION p20200701 VALUES LESS THAN (UNIX_TIMESTAMP('2020-07-01 00:00:00')),
    PARTITION p20200801 VALUES LESS THAN (UNIX_TIMESTAMP('2020-08-01 00:00:00')),
    PARTITION p20200901 VALUES LESS THAN (UNIX_TIMESTAMP('2020-09-01 00:00:00')),
    PARTITION p20201001 VALUES LESS THAN (UNIX_TIMESTAMP('2020-10-01 00:00:00')),
    PARTITION p20201101 VALUES LESS THAN (UNIX_TIMESTAMP('2020-11-01 00:00:00')),
    PARTITION p20201201 VALUES LESS THAN (UNIX_TIMESTAMP('2020-12-01 00:00:00'))
)

查看分区

#查看分区
SELECT PARTITION_NAME,SUBPARTITION_NAME,TABLE_ROWS
FROM INFORMATION_SCHEMA.`PARTITIONS`
WHERE TABLE_NAME = 'attribute_data'

添加存储过程

#添加存储过程
DELIMITER $$
 USE `desert_cloud`$$
 DROP PROCEDURE IF EXISTS `create_attribute_data_partition`$$
 CREATE DEFINER=`root`@`localhost` PROCEDURE `create_attribute_data_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='attribute_data' ORDER BY partition_ordinal_position DESC LIMIT 1;
      SET @Max_date= DATE(DATE_ADD(@P12_Name+0, INTERVAL 1 MONTH))+0;
 /* 修改表,在最大分区的后面增加一个分区,时间范围加1天 */
     SET @s1=CONCAT('ALTER TABLE attribute_data ADD PARTITION (PARTITION p',@Max_date,' VALUES LESS THAN (UNIX_TIMESTAMP (''',DATE(@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;

查看存储过程

#查看存储过程
show procedure status

调用存储过程

#调用存储过程
call create_attribute_data_partition()

添加事件

#添加事件
CREATE EVENT create_attribute_data_even
ON SCHEDULE
EVERY 1 MONTH STARTS '2020-12-01 00:00:00'
DO
CALL create_attribute_data_partition()

停止事件

ALTER EVENT create_attribute_data_even ON COMPLETION PRESERVE DISABLE;

相关文章

  • mysql 每月自动创建分区

    每月自动创建分区逻辑,通过创建一个事件定时任务去执行存储过程数据表结构,分区字段必须是主键索引中的字段,这里用时间...

  • MySQL分区表

    确认mysql是否支持分区表 mysql分区表的特点 创建mysql数据表为hash表 常用mysql分区的类型 ...

  • Mysql分区表及自动创建分区

    sql语句如下,存储过程支持对指定的库、表,创建未来指定数量的分区;未定义分区定义分区;不会重复创建分区。建议使用...

  • Mysql 分区表删除

    分区表删除部分分区 使用场景:从 MySQL 5.1 开始,支持分区 创建日志表时建议使用分区方式 在上表的分区表...

  • MYSQL数据库创建表分区

    MySQL数据库通过日期创建表分区,日期需要使用日期函数(年月日时分秒) 1.用日期创建分区事例 DROP TAB...

  • mysql分区:每天自动添加新分区

    对test数据库中position表按日期(天)分区:需要做: 对已有数据分区 添加过程存储(相当于函数) 添加事...

  • 高性能mysql之分区表

    mysql在创建表时使用PARTITION BY子句定义每个分区存放的数据。在执行查询的时候优化器会根据分区定义过...

  • 硬盘自动挂载的配置

    查看Linux硬盘信息 格式化硬盘 创建目录 挂载分区 查看磁盘分区的UUID 配置开机自动挂载: mount命令...

  • Mysql创建分区表

    今天看到生产数据库中,其中一个日志表的数据超过130W,并且增长迅速。担心数据过大会影响CR效率(日志表,所以没有...

  • Flink --通过讲mysql数据插入到iceberg

    1. 创建表 2.创建分区表 3. 插入数据 4. 将mysql 数据插入到iceberg 表中

网友评论

      本文标题:mysql 每月自动创建分区

      本文链接:https://www.haomeiwen.com/subject/ewbgvktx.html