在工业监控里面, 需要对每天的数据, 进行记录, 时间长了之后, 数据库很容易撑爆. 这时候, 如果允许, 可以对之前的数据进行一次清除, 只记录几个月内的数据.

delimiter $
DROP PROCEDURE if exists p_clearOldData;
/*
g_date_limit 时间限制, 如 2019_08 , 则删除 该时间之前的表
g_date_length 时间格式的长度, 如 后缀时间是 2019_08, 则此处应该传 7
*/
CREATE PROCEDURE `p_clearOldData`(in g_date_limit varchar(30) , in g_date_length int )
begin
/*查询到的表名*/
DECLARE g_table VARCHAR(100); /*查询到的表名对应的后缀时间*/
DECLARE g_date VARCHAR(30) DEFAULT ''; /*定义done, 用于跳出循环使用*/
DECLARE done bit DEFAULT 0; ###DECLARE g_date_limit VARCHAR(30) DEFAULT ''; ###DECLARE g_date_length int default 10; /*声明游标*/
DECLARE g_cursor CURSOR FOR select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='abc' and TABLE_NAME like 'tbl_abc_%'; /*游标查询时, 如果找不到下一个了, 会将done置为1, 用于跳出 REPEAT 循环*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; /*待执行动态sql*/
set @v_full_sql := ''; ###set g_date_limit = DATE_FORMAT(date_add(NOW(), interval -90 day),'%Y_%m_%d'); /*打开游标*/
open g_cursor; /*循环*/
REPEAT FETCH g_cursor into g_table; set g_date = right(g_table, g_date_length); if g_date < g_date_limit then set @v_full_sql = CONCAT('drop table if exists ',g_table); /*预编译此动态sql, 并存入stmt中*/
PREPARE stmt from @v_full_sql; /*执行此动态sql, 此动态sql的作用, 是删除表*/
execute stmt; /*释放此资源*/
DEALLOCATE PREPARE stmt; /*对执行情况进行记录*/
INSERT into tbl_event_log (name, time) values (g_table, NOW()); end if; /*结束repeat循环*/
UNTIL done END REPEAT; /*关闭游标*/
close g_cursor; select 'OK'; end $
delimiter;

在数据库中, 进行测试:

CREATE TABLE `t_bk001_2019_02` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

执行脚本:

call p_clearOldData('2019_03', 7);

会发现, 表确实被删除了, 且别的表并未受到影响.

在不能发后台包的情况下, 可以通过mysql定时任务和存储过程, 来实现定时删表操作.

不过, 如果通过这种方式, 还需要对此存储过程进行改动, 或者再创建一个存储过程, 对此进行封装成一个没有参数的存储过程.

对于这种定时任务的执行情况和执行时机, 最好能加入一个日志进去:

CREATE TABLE `tbl_event_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL COMMENT '表名',
`time` datetime DEFAULT NULL COMMENT '时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

*注:

以上操作, 不推荐在mysql中, 通过定时任务和存储过程来实现此功能, 推荐通过后台定时任务, 执行删表操作.

Mysql - 存储过程 - 定时删表的更多相关文章

  1. MySQL 存储过程删除大表

    1.权限问题 alter routine 编辑或删除存储过程 create routine 建立存储过程 execute 创建存储过程 2.存储过程相关的一些命令 show procedure sta ...

  2. mysql存储过程分库分表

    -- 存储过程创建库  分为两条语句删除和创建DELIMITER $$USE myplan $$DROP PROCEDURE IF EXISTS createDBN $$CREATE PROCEDUR ...

  3. 关于mysql存储过程创建动态表名及參数处理

      转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)  近期游戏開始第二次内測,開始处理操作日志.最開始把日志放到同一个表里面,发现一天时间,平均100玩家 ...

  4. mysql存储过程批量向表插入数据

    业务需要,往某个表中批量插入数据,使用存储过程插入 首先,要建立一张mysql表,表明为phone_number, 三个字段,id 自增,number 就是要插入的表格,is_used 表示十分已经使 ...

  5. Mysql定时器定时删除表数据

    由于测试环境有张日志表没定时2分钟程序就狂插数据,导致不到1一个月时间,这张日志表就占用了6.7G的空间,但是日志刷新较快,有些日志就没什么作用,就写了个定时器,定期删除这张表的数据 首先先查看mys ...

  6. 【转】MYSQL 存储过程定时操作数据库

    这个涉及2个步骤,第一个就是建立存储过程: create procedure clear_table() begin drop database XXX end 第二步就是让其定时运行: 查看even ...

  7. Mysql 存储过程批量建表

    CREATE DEFINER=`root`@`%` PROCEDURE `createTables`() begin declare i int; declare suffix varchar(20) ...

  8. mysql创建定时执行存储过程任务

    sql语法很多,是一门完整语言.这里仅仅实现一个功能,不做深入研究. 目标:定时更新表或者清空表. 案例:曾经做过定时清空位置信息表的任务.(然而,当时并未考虑服务器挂掉后的情况) 本次测试:每5s更 ...

  9. MYSQL定时创建表分区

    MYSQL定时创建表分区 一.存储过程-表分区-----------------------------------------------------------------需求: 每月创建一个分区 ...

随机推荐

  1. Java之Map接口(双列集合)

    Map集合概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对 ...

  2. [考试反思]1113csp-s模拟测试114:一梦

    自闭.不废话.写一下低错. T1:觉得信心赛T1不会很恶心一遍过样例直接没对拍(其实是想写完T2之后回来对拍的) 状态也不好,基本全机房都开始码了我还没想出来(skyh已经开T2了).想了40多分钟. ...

  3. c++.net学习笔记

    Notes for c++ learning 程序根据什么特征来区分调用哪个重载函数? 只能靠参数而不能靠返回值类型的不同来区分重载函数. 编译器根据参数为每个重载函数产生不同的内部标识符 在Visu ...

  4. shell生成指定长度的随机数

    生成指定长度是随机数 # 8位纯数字的随机数 tr -cd '0-9' </dev/urandom | head -c 8 # 16位包含字母.数字的随机数 tr -cd '[:alnum:]' ...

  5. (转)颜色直方图, HSV直方图, histogram bins

    原文链接:https://www.xuebuyuan.com/3256564.html 一个histogram,通常可以用一个列向量表示(例子中的a,b),列向量里面的每一个值就是一个bin(a,b) ...

  6. wx-show与!show

    切换的表示 <!--index.wxml--> <view class="container"> <view class="item&quo ...

  7. IDEA中安装EasyCode插件并连接数据库生成代码

    场景 EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml).只要是与数据库相关的代码都可以通过自定义模板来生成.支持数据库类型与j ...

  8. SAP MCH1表和MCHA表更新逻辑

    SAP MCH1表和MCHA表更新逻辑 笔者所在的A项目里,批次是在material level 唯一, 意味着不同物料号可以有相同的批次号,只要物料号+批次号组合是唯一的即可. SE11 看MCH1 ...

  9. JUnit与MSTest

    执行test类的每个方法时,需要做一些初始化.比如初始化applicationcontext.JUnit使用@Before注解. import org.junit.Before; import org ...

  10. 26-限制容器对CPU的使用

    默认设置下,所有容器可以平等地使用 host CPU 资源并且没有限制. Docker 可以通过 -c 或 --cpu-shares 设置容器使用 CPU 的权重.如果不指定,默认值为 1024. 与 ...