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

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. LeetCode--回文数(简单)

    题目描述: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解 ...

  2. JVM基础回顾记录(一):JVM的内存模型

    JVM的内存模型&垃圾收集算法 JVM内存模型 JAVA程序执行的基本流程(基于HotSpot): 图1 1.程序计数器 程序计数器是一块较小的内存空间,是当前线程执行字节码的行号指示器,字节 ...

  3. Python的filter方法实现筛选功能

    filter方法可以实现筛选,第一个参数是一个函数,返回值是True或者False,第二个参数可以是str.tuple.list,将后面的参数依次传递给函数,依次判断结果,留下结果为 True的.比如 ...

  4. 12. java ArrayList类

    一.ArrayList定义 ​ java.util.ArrayList是大小可变的数组的实现,存储在内的数据成为元素.此类提供一些方法来操作内部存储的元素.ArrayList中可不断添加元素,其大小也 ...

  5. 西北师大-2108Java】第十三次作业成绩汇总

    [西北师大-2108Java]第十三次作业成绩汇总 作业题目 面向对象程序设计(JAVA) 第15周学习指导及要求 实验目的与要求 (1)掌握菜单组件用途及常用API: (2)掌握对话框组件用途及常用 ...

  6. Spring afterPropertiesSet方法

    1.init-method方法,初始化bean的时候执行,可以针对某个具体的bean进行配置.init-method需要在applicationContext.xml配置文档中bean的定义里头写明. ...

  7. C#冒泡算法

    冒泡算法:先看代码吧,我不喜欢先说一大堆,看不懂了再说 class Program { static void Main(string[] args) { , , , , , }; ; i <a ...

  8. mac怎么连接windows远程桌面

    首先需要下载一个软件,因为苹果电脑并没有提供免费的软件给我们,所以不能像windows一样, 直接在任务管理中搜素远程桌面然后输入ip地址,用户名,密码就可以远程连接, 而苹果也有提供一个软件,但要付 ...

  9. ETCD:gRPC命名与发现

    原文地址:gRPC naming and discovery etcd提供一个gRPC解析器支持备用的命名系统,该命名系统从etcd获取主机以发现gRPC服务.以下机制基于监视对以服务名称为前缀的Ke ...

  10. 工作笔记 之 Python应用技术

    python socket编程详细介绍 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,建立网络通信连接至少要一对端口号(socket). Socket本质是 ...