MySQL實現(xiàn)清空分區(qū)表單個分區(qū)數(shù)據(jù)
MySQL清空分區(qū)表單個分區(qū)數(shù)據(jù)
1.單個分區(qū)清空
ALTER TABLE xxx TRUNCATE PARTITION p20220104;
2.編輯存儲過程
功能:指定清空之前某一天的數(shù)據(jù),直接調用存儲過程實現(xiàn)
DELIMITER $$
USE `managerdb`$$
DROP PROCEDURE IF EXISTS `partition_trunc`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `partition_trunc`(p_schema_name VARCHAR(64), p_table_name VARCHAR(64), p_trunc_before_date INT)
BEGIN
/*
p_trunc_before_date 清空分區(qū)表第N天的數(shù)據(jù)
*/
DECLARE trunc_part_name VARCHAR(16);
SET trunc_part_name = CONCAT('p',DATE_FORMAT(DATE_SUB(CURDATE(),INTERVAL p_trunc_before_date DAY),'%Y%m%d'));
SET @trunc_partitions = CONCAT("ALTER TABLE ", p_schema_name, ".", p_table_name, " TRUNCATE PARTITION ",trunc_part_name); -- 拼執(zhí)行語句
SELECT @trunc_partitions; -- 打印刪除詳情
PREPARE STMT FROM @trunc_partitions;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
END$$
DELIMITER ;實例:
call managerdb.partition_trunc('test','t_001',1);清空test.t_001一天前的單個分區(qū)數(shù)據(jù)
MySQL自動分區(qū)自動清理
mysql分區(qū)表功能特別有用,其中一個應用就是保存固定時間的數(shù)據(jù)信息,自動分區(qū)自動purge,不用擔心數(shù)據(jù)量越積累越多。
比較實用的一個實現(xiàn)方式是表一天一個分區(qū),保持固定天數(shù)的數(shù)據(jù)。
完整的SQL
以數(shù)據(jù)庫log為例,里面有一個表tb_log, 按天分區(qū),始終保存最新的30天的數(shù)據(jù)。
存儲過程sp_create_log_partition和sp_drop_log_partition用于創(chuàng)建和刪除分區(qū)。
事件event_log_auto_partition每天執(zhí)行一次,用于向前創(chuàng)建新的分區(qū)和刪除過期的分區(qū)。
存儲過程和事件結合使用就實現(xiàn)了tb_log數(shù)據(jù)的自動分區(qū)自動刪除。
--
-- Definition for database log
--
DROP DATABASE IF EXISTS log;
CREATE DATABASE IF NOT EXISTS log
CHARACTER SET utf8
COLLATE utf8_general_ci;
--
-- Set default database
--
USE log;
--
-- Definition for table tb_log
--
CREATE TABLE IF NOT EXISTS tb_log (
id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
log varchar(512) NOT NULL DEFAULT '',
PRIMARY KEY (id, created_at)
)
ENGINE = INNODB
AUTO_INCREMENT = 1
AVG_ROW_LENGTH = 16384
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci
PARTITION BY RANGE(TO_DAYS(created_at))
(
PARTITION pbasic VALUES LESS THAN (0)
);
DELIMITER $$
--
-- Definition for procedure sp_create_log_partition
--
CREATE DEFINER = 'uiadmin'@'%'
PROCEDURE sp_create_log_partition (day_value datetime, tb_name varchar(128))
BEGIN
DECLARE par_name varchar(32);
DECLARE par_value varchar(32);
DECLARE _err int(1);
DECLARE par_exist int(1);
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND SET _err = 1;
START TRANSACTION;
SET par_name = CONCAT('p', DATE_FORMAT(day_value, '%Y%m%d'));
SELECT
COUNT(1) INTO par_exist
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = 'log' AND TABLE_NAME = tb_name AND PARTITION_NAME = par_name;
IF (par_exist = 0) THEN
SET par_value = DATE_FORMAT(day_value, '%Y-%m-%d');
SET @alter_sql = CONCAT('alter table ', tb_name, ' add PARTITION (PARTITION ', par_name, ' VALUES LESS THAN (TO_DAYS("', par_value, '")+1))');
PREPARE stmt1 FROM @alter_sql;
EXECUTE stmt1;
END IF;
END
$$
--
-- Definition for procedure sp_drop_log_partition
--
CREATE DEFINER = 'uiadmin'@'%'
PROCEDURE sp_drop_log_partition (day_value datetime, tb_name varchar(128))
BEGIN
DECLARE str_day varchar(64);
DECLARE _err int(1);
DECLARE done int DEFAULT 0;
DECLARE par_name varchar(64);
DECLARE cur_partition_name CURSOR FOR
SELECT
partition_name
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_SCHEMA = 'log' AND table_name = tb_name
ORDER BY partition_ordinal_position;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND SET _err = 1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
SET str_day = DATE_FORMAT(day_value, '%Y%m%d');
OPEN cur_partition_name;
REPEAT
FETCH cur_partition_name INTO par_name;
IF (str_day > SUBSTRING(par_name, 2)) THEN
SET @alter_sql = CONCAT('alter table ', tb_name, ' drop PARTITION ', par_name);
PREPARE stmt1 FROM @alter_sql;
EXECUTE stmt1;
END IF;
UNTIL done END REPEAT;
CLOSE cur_partition_name;
END
$$
--
-- Definition for event event_log_auto_partition
--
CREATE
DEFINER = 'uiadmin'@'%'
EVENT event_log_auto_partition
ON SCHEDULE EVERY '1' DAY
STARTS '1972-01-01 00:00:00'
ON COMPLETION PRESERVE
DO
BEGIN
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL - 3 DAY), 'tb_log');
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL - 2 DAY), 'tb_log');
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL - 1 DAY), 'tb_log');
CALL sp_create_log_partition(NOW(), 'tb_log');
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL 1 DAY), 'tb_log');
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL 2 DAY), 'tb_log');
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL 3 DAY), 'tb_log');
CALL sp_drop_log_partition(DATE_ADD(NOW(), INTERVAL - 30 DAY), 'tb_log');
END
$$
--
-- Create partitions based on current time
--
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL - 3 DAY), 'tb_log')$$
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL - 2 DAY), 'tb_log')$$
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL - 1 DAY), 'tb_log')$$
CALL sp_create_log_partition(NOW(), 'tb_log')$$
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL 1 DAY), 'tb_log')$$
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL 2 DAY), 'tb_log')$$
CALL sp_create_log_partition(DATE_ADD(NOW(), INTERVAL 3 DAY), 'tb_log')$$
DELIMITER ;查看分區(qū)
select TABLE_SCHEMA, TABLE_NAME,PARTITION_NAME from INFORMATION_SCHEMA.PARTITIONS where TABLE_SCHEMA='log' and table_name='tb_log';

在磁盤上一個分區(qū)表現(xiàn)為一個文件,所以刪除操作會很快完成的。

總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
傻瓜式用Eclipse連接MySQL數(shù)據(jù)庫
本來不想寫這么簡單人文章,在百度上搜索我這個標題,完全符合標題的一大堆。但我按照那些文章?lián)v鼓了很久,就是不行。2015-09-09
Navicat連接MySQL出現(xiàn)2059錯誤的解決方案
當使用Navicat連接MySQL時,如果出現(xiàn)錯誤代碼2059,表示MySQL服務器不接受Navicat提供的加密插件,解決方法主要有兩種:一是修改MySQL用戶的認證插件為mysql_native_password,二是升級Navicat到最新版本以支持MySQL8.0及其默認的caching_sha2_password認證插件2024-10-10
MySQL自動填充create_time和update_time的兩種方式
當我們創(chuàng)建業(yè)務表的時候 通常都需要設置create_time 和 update_time,下面這篇文章主要給大家介紹了關于MySQL自動填充createTime和updateTime的兩種方式,需要的朋友可以參考下2022-05-05
mysql 5.7.17 安裝配置方法圖文教程(windows)
這篇文章主要為大家分享了mysql 5.7.17 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01
Windows下MySQL?8.0.29?安裝和刪除圖文教程
這篇文章主要為大家詳細介紹了Windows下MySQL?8.0.29?安裝和刪除圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07

