Mysql 数据库 EVENT 功能——定期删除数据
前言
本篇文章介绍下如何在 mysql 数据库中设置,定期(类似 rotate 功能)删除 Mysql 数据库一个指定数据表中一段时间之前的数据。
Mysql 可以通过 event 功能实现此需求,Mysql5.1 版本开始引进 event 概念。
开启事件功能
## 首先查看 是否已经开启事件功能
mysql>
mysql> select @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| ON |
+-------------------+
mysql> show variables like 'event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
1 row in set, 1 warning (0.00 sec)
## 如果是未开启状态 通过以下命令开启
mysql> SET GLOBAL event_scheduler = ON; SET GLOBAL event_scheduler = 1; — 0代表关闭
## 也可以通过配置文件开启,编写 my.cnf 文件后重启 mysqld 服务生效
[mysqld]
event_scheduler=ON
创建事件
- 可以直接创建事件,指定定期执行 sql 语句
mysql> create event e_delete_wififlows on schedule every 5 second
do delete from wififlows where
timestamp < (CURRENT_TIMESTAMP() + INTERVAL -2 MINUTE);
- 也可以先创建一个 PROCEDURE 存储(类似函数),然后创建事件调用这个PROCEDURE。
- 创建 PROCEDURE
## 修改结束符的方法
mysql> delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> CREATE PROCEDURE `del_record_month`(IN `date_inter` INT)
-> BEGIN
-> DELETE FROM request_log
-> WHERE
-> (TO_DAYS(NOW()) - TO_DAYS(FROM_UNIXTIME(unix_timestamp(create_time),'%Y%m%d'))) >=date_inter
-> END$$
mysql> delimiter ; #将语句的结束符号恢复为分号
## 直接一句话创建的方法
mysql> CREATE PROCEDURE `del_record_month`(IN `date_inter` INT) BEGIN DELETE FROM request_log WHERE (TO_DAYS(NOW()) - TO_DAYS(FROM_UNIXTIME(unix_timestamp(create_time),'%Y%m%d'))) >=date_inter END ;
- 创建 event 调用上面创建的 PROCEDURE
mysql> CREATE EVENT `del_record_month_event` ON SCHEDULE EVERY 1 DAY STARTS '2020-05-27 12:55:00' ON COMPLETION NOT PRESERVE ENABLE DO CALL del_record_month(2);
查看已有定时事件任务
## 查看 procedure
mysql> show procedure status where Db='management';
+------------+------------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+------------+------------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| management | del_record_month | PROCEDURE | root@localhost | 2020-05-27 12:48:45 | 2020-05-27 12:48:45 | DEFINER | | utf8 | utf8_general_ci | utf8_general_ci |
+------------+------------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
mysql> show create PROCEDURE del_record_month ;
+------------------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation |
+------------------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| del_record_month | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `del_record_month`(IN `date_inter` INT)
DELETE FROM request_log WHERE (TO_DAYS(NOW()) - TO_DAYS(FROM_UNIXTIME(unix_timestamp(create_time),'%Y%m%d'))) >=date_inter | utf8 | utf8_general_ci | utf8_general_ci |
+------------------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
mysql>
## 查看 EVENTS
mysql> SHOW EVENTS;
+------------+------------------------+----------------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| Db | Name | Definer | Time zone | Type | Execute at | Interval value | Interval field | Starts | Ends | Status | Originator | character_set_client | collation_connection | Database Collation |
+------------+------------------------+----------------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| management | del_record_month_event | root@localhost | SYSTEM | RECURRING | NULL | 1 | DAY | 2020-05-27 12:55:00 | NULL | ENABLED | 1 | utf8 | utf8_general_ci | utf8_general_ci |
+------------+------------------------+----------------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME = 'del_record_month_event' ;
+---------------+--------------+------------------------+----------------+-----------+------------+--------------------------+------------+------------+----------------+----------------+-----------------------------------------------------------------------------------------------------------------------+---------------------+------+---------+---------------+---------------------+---------------------+---------------------+---------------+------------+----------------------+----------------------+--------------------+
| EVENT_CATALOG | EVENT_SCHEMA | EVENT_NAME | DEFINER | TIME_ZONE | EVENT_BODY | EVENT_DEFINITION | EVENT_TYPE | EXECUTE_AT | INTERVAL_VALUE | INTERVAL_FIELD | SQL_MODE | STARTS | ENDS | STATUS | ON_COMPLETION | CREATED | LAST_ALTERED | LAST_EXECUTED | EVENT_COMMENT | ORIGINATOR | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | DATABASE_COLLATION |
+---------------+--------------+------------------------+----------------+-----------+------------+--------------------------+------------+------------+----------------+----------------+-----------------------------------------------------------------------------------------------------------------------+---------------------+------+---------+---------------+---------------------+---------------------+---------------------+---------------+------------+----------------------+----------------------+--------------------+
| def | management | del_record_month_event | root@localhost | SYSTEM | SQL | CALL del_record_month(2) | RECURRING | NULL | 1 | DAY | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | 2020-05-27 12:55:00 | NULL | ENABLED | NOT PRESERVE | 2020-05-27 12:46:28 | 2020-05-27 12:46:28 | 2020-05-27 12:55:00 | | 1 | utf8 | utf8_general_ci | utf8_general_ci |
+---------------+--------------+------------------------+----------------+-----------+------------+--------------------------+------------+------------+----------------+----------------+-----------------------------------------------------------------------------------------------------------------------+---------------------+------+---------+---------------+---------------------+---------------------+---------------------+---------------+------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
mysql>
事件的开启与关闭
开启某事件:
mysql> ALTER EVENT del_record_month_event ON COMPLETION PRESERVE ENABLE;
关闭某事件:
mysql> ALTER EVENT del_record_month_event ON COMPLETION PRESERVE DISABLE;

浙公网安备 33010602011771号