欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL實(shí)現(xiàn)清空分區(qū)表單個(gè)分區(qū)數(shù)據(jù)

 更新時(shí)間:2023年03月13日 09:00:21   作者:Demonson  
這篇文章主要介紹了MySQL實(shí)現(xiàn)清空分區(qū)表單個(gè)分區(qū)數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

MySQL清空分區(qū)表單個(gè)分區(qū)數(shù)據(jù)

1.單個(gè)分區(qū)清空

ALTER TABLE xxx TRUNCATE PARTITION p20220104;

2.編輯存儲過程

功能:指定清空之前某一天的數(shù)據(jù),直接調(diào)用存儲過程實(shí)現(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 ;

實(shí)例:

call managerdb.partition_trunc('test','t_001',1);

清空test.t_001一天前的單個(gè)分區(qū)數(shù)據(jù)

MySQL自動分區(qū)自動清理

mysql分區(qū)表功能特別有用,其中一個(gè)應(yīng)用就是保存固定時(shí)間的數(shù)據(jù)信息,自動分區(qū)自動purge,不用擔(dān)心數(shù)據(jù)量越積累越多。

比較實(shí)用的一個(gè)實(shí)現(xiàn)方式是表一天一個(gè)分區(qū),保持固定天數(shù)的數(shù)據(jù)。

完整的SQL

以數(shù)據(jù)庫log為例,里面有一個(gè)表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ū)。

存儲過程和事件結(jié)合使用就實(shí)現(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';

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL主從同步設(shè)置中主服務(wù)器二進(jìn)制日志無法開啟的問題

    MySQL主從同步設(shè)置中主服務(wù)器二進(jìn)制日志無法開啟的問題

    這篇文章主要介紹了MySQL主從同步設(shè)置中主服務(wù)器二進(jìn)制日志無法開啟的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 從ibd文件恢復(fù)MySQL數(shù)據(jù)的操作步驟及常見錯(cuò)誤

    從ibd文件恢復(fù)MySQL數(shù)據(jù)的操作步驟及常見錯(cuò)誤

    MySQL數(shù)據(jù)恢復(fù)是數(shù)據(jù)庫管理中的一項(xiàng)重要任務(wù),尤其是在遭遇意外數(shù)據(jù)丟失、硬件故障或軟件錯(cuò)誤時(shí),下面這篇文章主要給大家介紹了關(guān)于從ibd文件恢復(fù)MySQL數(shù)據(jù)的操作步驟及常見錯(cuò)誤,需要的朋友可以參考下
    2024-08-08
  • MySQL的主從備份方式(一主一從)

    MySQL的主從備份方式(一主一從)

    這篇文章主要介紹了MySQL的主從備份方式(一主一從),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Mysql數(shù)據(jù)庫使用concat函數(shù)執(zhí)行SQL注入查詢

    Mysql數(shù)據(jù)庫使用concat函數(shù)執(zhí)行SQL注入查詢

    這篇文章主要介紹了Mysql數(shù)據(jù)庫使用concat函數(shù)執(zhí)行SQL注入查詢,concat函數(shù)在SQL注入查詢中會有意想不到的作用,本文就起講解它的使用,需要的朋友可以參考下
    2015-04-04
  • mysql 5.7.18 zip版安裝使用教程

    mysql 5.7.18 zip版安裝使用教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.18 zip版安裝使用教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • MySQL使用組合查詢的示例代碼

    MySQL使用組合查詢的示例代碼

    本文主要介紹了MySQL使用組合查詢的示例代碼,如何使用UNION操作符來組合SELECT語句,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • 最全的mysql查詢語句整理

    最全的mysql查詢語句整理

    這篇文章主要介紹了最全的mysql查詢語句整理,需要的朋友可以參考下
    2016-06-06
  • mysql觸發(fā)器同步表的數(shù)據(jù)方式

    mysql觸發(fā)器同步表的數(shù)據(jù)方式

    這篇文章主要介紹了mysql觸發(fā)器同步表的數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Mysql給普通分頁查詢結(jié)果加序號實(shí)操

    Mysql給普通分頁查詢結(jié)果加序號實(shí)操

    這篇文章主要介紹了Mysql給普通分頁查詢結(jié)果加序號實(shí)操,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • MySQL外鍵設(shè)置的方法實(shí)例

    MySQL外鍵設(shè)置的方法實(shí)例

    這篇文章主要介紹了MySQL外鍵設(shè)置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論