MySQL按月自动设置表分区
开始检查
首先,确保 ticket_history_info表是一个分区表。如果未设置分区,需要修改表结构以支持分区,将 ticket_history_info 表设置为按日期范围进行分区
ALTER TABLE ticket_history_info
PARTITION BY RANGE (TO_DAYS(CALL_DATE)) (
PARTITION p0 VALUES LESS THAN (TO_DAYS('2022-09-01'))
);
1.创建分区函数
-- 创建分区函数
DELIMITER //
CREATE FUNCTION get_partition_name(p_date DATE)
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DECLARE p_month VARCHAR(2);
DECLARE p_year VARCHAR(4);
SET p_month = LPAD(MONTH(p_date), 2, '0');
SET p_year = YEAR(p_date);
RETURN CONCAT('p', p_year, p_month);
END//
DELIMITER ;
检查是否成功创建函数
SHOW FUNCTION STATUS LIKE 'get_partition_name';
2.创建存储过程,用于自动生成分区
-- 存储过程
DELIMITER //
CREATE PROCEDURE create_monthly_partition()
BEGIN
DECLARE next_month VARCHAR(20);
DECLARE next_month_first_day DATE;
-- 计算下一个月份的名称和下个月的第一天
SET next_month = CONCAT('p', DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 MONTH), '%Y%m'));
SET next_month_first_day = LAST_DAY(DATE_ADD(CURDATE(), INTERVAL 1 MONTH)) + INTERVAL 1 DAY;
-- 检查分区是否已存在
IF NOT EXISTS (
SELECT NULL
FROM information_schema.PARTITIONS
WHERE TABLE_NAME = 'ticket_history_info' AND TABLE_SCHEMA = 'ccm' AND PARTITION_NAME = next_month
) THEN
-- 创建新的分区
SET @sql = CONCAT('ALTER TABLE ticket_history_info ADD PARTITION (PARTITION ', next_month, ' VALUES LESS THAN (TO_DAYS(\'', next_month_first_day, '\')))');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END//
DELIMITER ;
进行测试
检查是否成功创建函数
SHOW PROCEDURE STATUS LIKE 'create_monthly_partition';
执行函数
CALL create_monthly_partition();
查询表分区,查看是否成功分区。
SELECT PARTITION_NAME FROM information_schema.PARTITIONS WHERE TABLE_NAME = '表名' AND TABLE_SCHEMA = '数据库名';
可通过修改本地系统时间,来进行反复测试是否可按照月份进行分区。
返回成功,显示已创建表分区。
3.创建自动删除半年以前的表空间函数
DELIMITER //
CREATE PROCEDURE delete_old_partitions()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE drop_partition_name VARCHAR(64);
DECLARE cur CURSOR FOR
SELECT PARTITION_NAME
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = '数据库名'
AND TABLE_NAME = 'ticket_history_info'
AND PARTITION_DESCRIPTION
4.创建调度任务,修改到每月最后一天执行执行存储过程
CREATE EVENT IF NOT EXISTS monthly_partition_event
ON SCHEDULE EVERY 1 MONTH
STARTS CONCAT(DATE_FORMAT(LAST_DAY(CURRENT_DATE), '%Y-%m-'), DAY(LAST_DAY(CURRENT_DATE)), ' 23:00:00')
DO
BEGIN
CALL create_monthly_partition();
CALL delete_old_partitions();
END;
查看事件调度器是否启动
SET GLOBAL event_scheduler = ON;
查看事件
SHOW EVENTS;
或
SHOW EVENTS FROM `数据库名`;
创建成功
5.进行测试
插入测试数据进行测试,根据CALL_DATE字段进行数据分区,
INSERT INTO ticket_history_info (CALL_DATE, SRC_ADD, CALLING_NUM, DURATION) VALUES
('2024-05-24 00:00:00', 'Address1', '1234567890', 60),
('2024-06-20 00:00:00', 'Address2', '0987654321', 120),
('2024-05-10 00:00:00', 'Address3', '1122334455', 180),
('2024-10-01 00:00:00', 'Address4', '5566778899', 240);
-查询每个分区的行数
SELECT PARTITION_NAME, TABLE_ROWS
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = 'ccm' AND TABLE_NAME = 'ticket_history_info';
或者单独查询某一个分区的数据
SELECT *
FROM ticket_history_info PARTITION (p202406);
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!



