MySQL按月自動設置表分區(qū)的實現(xiàn)
開始檢查
首先,確保 ticket_history_info表是一個分區(qū)表。如果未設置分區(qū),需要修改表結構以支持分區(qū),將 ticket_history_info 表設置為按日期范圍進行分區(qū)
ALTER TABLE ticket_history_info
PARTITION BY RANGE (TO_DAYS(CALL_DATE)) (
PARTITION p0 VALUES LESS THAN (TO_DAYS('2022-09-01'))
);
1.創(chuàng)建分區(qū)函數(shù)
-- 創(chuàng)建分區(qū)函數(shù)
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 ;
檢查是否成功創(chuàng)建函數(shù)
SHOW FUNCTION STATUS LIKE 'get_partition_name';
2.創(chuàng)建存儲過程,用于自動生成分區(qū)
-- 存儲過程
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;
-- 檢查分區(qū)是否已存在
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
-- 創(chuàng)建新的分區(qū)
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 ;進行測試
檢查是否成功創(chuàng)建函數(shù)
SHOW PROCEDURE STATUS LIKE 'create_monthly_partition';
執(zhí)行函數(shù)
CALL create_monthly_partition();
查詢表分區(qū),查看是否成功分區(qū)。
SELECT PARTITION_NAME FROM information_schema.PARTITIONS WHERE TABLE_NAME = '表名' AND TABLE_SCHEMA = '數(shù)據(jù)庫名';
可通過修改本地系統(tǒng)時間,來進行反復測試是否可按照月份進行分區(qū)。

返回成功,顯示已創(chuàng)建表分區(qū)。

3.創(chuàng)建自動刪除半年以前的表空間函數(shù)
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 = '數(shù)據(jù)庫名'
AND TABLE_NAME = 'ticket_history_info'
AND PARTITION_DESCRIPTION < TO_DAYS(NOW() - INTERVAL 6 MONTH);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO drop_partition_name;
IF done THEN
LEAVE read_loop;
END IF;
SET @sql = CONCAT('ALTER TABLE ticket_history_info DROP PARTITION ', drop_partition_name);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
-- 刪除超過半年的數(shù)據(jù)
DELETE FROM ticket_history_info_copy1
WHERE CALL_DATE < CURDATE() - INTERVAL 6 MONTH;
END//
DELIMITER ;
4.創(chuàng)建調度任務,修改到每月最后一天執(zhí)行執(zhí)行存儲過程
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 `數(shù)據(jù)庫名`;
創(chuàng)建成功

5.進行測試
插入測試數(shù)據(jù)進行測試,根據(jù)CALL_DATE字段進行數(shù)據(jù)分區(qū),
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);-查詢每個分區(qū)的行數(shù)
SELECT PARTITION_NAME, TABLE_ROWS FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = 'ccm' AND TABLE_NAME = 'ticket_history_info';
或者單獨查詢某一個分區(qū)的數(shù)據(jù)
SELECT * FROM ticket_history_info PARTITION (p202406);
到此這篇關于MySQL按月自動設置表分區(qū)的實現(xiàn)的文章就介紹到這了,更多相關MySQL 表分區(qū)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL中的RIGHT?JOIN和CROSS?JOIN操作示例
本文詳細介紹了MySQL中的RIGHT?JOIN和CROSS?JOIN操作,RIGHT?JOIN返回右表中的所有記錄及與左表中的記錄相匹配的記錄,而CROSS?JOIN返回兩個表中所有可能的組合,通過實際示例和輸出結果,我們展示了如何使用RIGHT?JOIN和CROSS?JOIN進行數(shù)據(jù)庫查詢,一起看看吧2023-07-07
在win10系統(tǒng)下安裝Mysql 5.7.17圖文教程
因為想要在公司電腦上安裝Mysql,于是到官網(wǎng)上下載了最新版本的Mysql-5.7.17,其實安裝方法也很簡單,下面小編把安裝過程分享到腳本之家平臺供大家參考2017-03-03
SQL使用聚集函數(shù)實現(xiàn)對數(shù)據(jù)匯總
這篇文章主要介紹了SQL使用聚集函數(shù)實現(xiàn)對數(shù)據(jù)匯總,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
安裝MySQL 5后無法啟動(不能Start service)解決方法小結
有時候我們在安裝mysql軟件時,卻無法啟動,或服務器安全設置以后都可能導致mysql無法運行2012-07-07
Win 8或以上系統(tǒng)下MySQL最新版5.7.17(64bit ZIP綠色版)安裝部署教程
這篇文章主要為大家詳細介紹了Win 8或以上系統(tǒng)下MySQL最新版5.7.17 64bit ZIP綠色版安裝部署教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05

