如需定时每天删除数据库中某个数据表30天前的数据。
使用数据库 mysql的event(事件)
参考资料可以自行百度。下面提供2个我找的教程:
教程一:详细讲解
教程二:
-- 开启事件
SET GLOBAL event_scheduler = 1;
SET @@global.event_scheduler = 1;
SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;
-- 创建存储过程
CREATE PROCEDURE `prc_del_alarm`(IN date_inter int) COMMENT '自动删除告警'
BEGIN
delete from yd_alarminfo where (TO_DAYS(NOW()) - TO_DAYS(eventTime))>=date_inter;
END
-- 创建事件,调度。每天执行一次
CREATE EVENT `auto_delete_alarm` ON SCHEDULE EVERY 1 DAY STARTS '2020-06-08 11:00:00'
ON COMPLETION PRESERVE ENABLE COMMENT '自动删除90天以前的告警数据'
DO call prc_del_alarm(90);
-- 手动执行存储过程
call prc_del_alarm(90);
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;
-- 查看库下的存储过程,两个都可以
select name from mysql.proc where db='test01';
show procedure status where db='test01';
-- 查看事件
SHOW EVENTS
-- 删除事件
DROP EVENTS IF EXISTS updateInfoStatus
-- 临时关闭事件
ALTER EVENTS updateInfoStatus DISABLE
-- 开启事件
ALTER EVENTS updateInfoStatus ENABLE
下面用一个使用了宝塔面板的范例:
要求:每天0点自动删除数据表30天前的数据
①用root用户登录数据库,找到相应网站数据库;
②创建定时事件
DELETE FROM `数据表名` WHERE (TO_DAYS(NOW()) - TO_DAYS(时间字段名))>=30
进行相比,然后超过30天得就删除
这样就可以每天定时删除了,如果没有被删除,请看下事件开关是不是被系统关了。
具体查看☞宝塔服务器重启事件自动关闭处理方法
MySQL的事件同时支持多条语句
当你在创建事件时,你可以在EVENT
定义中列出多条语句,它们会按照你给出的顺序依次执行。
CREATE EVENT a
ON SCHEDULE EVERY 1 DAY
DO
BEGIN
-- 这是第一条语句
aaa;
-- 这是第二条语句
bbb;
END;
宝塔面板也支持多条语句事件同样可以直接在语句前后分别加上BEGIN
和 END;
比如下面的宝塔面板事件多条sql语句
忽略最后的代码错误提示,添加成功后还是会执行的。
如果提交出现错误提示不能提交,请从下面检查:
我们可以分析以下几个可能的问题:
- 权限问题:事件创建者可能没有足够的权限来执行这些删除操作。确保事件创建者(在这个例子中是
root
@localhost
)有足够的权限来删除这些表中的数据。 - 表不存在:确保所有提到的表(例如
wp_usermeta
、wp_ice_info
等)都存在。如果表不存在,那么查询将会失败。 - 子查询问题:在删除操作中,你使用了子查询来获取
ID
。确保这些子查询返回有效的结果。如果子查询没有返回任何结果,那么对应的删除操作将会失败。 - 日期和时间格式:确保你提供的开始时间格式正确。错误信息中的时间格式看起来是正确的,但始终确保它符合MySQL的日期和时间格式要求。
- 事件语法:确保事件的定义语法是正确的。事件定义可能包含语法错误或其他问题,导致查询失败。
为了解决这个问题,你可以尝试以下步骤:
- 检查权限:确保事件创建者有足够的权限来执行这些删除操作。
- 检查表是否存在:使用
SHOW TABLES;
命令来确认所有提到的表都存在。 - 检查子查询:运行子查询,确保它们返回有效的结果。
- 检查事件语法:仔细检查事件定义,确保语法正确。
- 查看详细的错误日志:通常,MySQL会提供更详细的错误信息,可以帮助你更准确地确定问题所在。
如果以上步骤都不能解决问题,你可能需要提供更多的上下文信息或错误日志,以便进一步分析问题原因。
时间戳相关问题
如果是时间戳格式,可以用当天时间戳减去相应天数插值,
MySQL获取当前时间戳方式:
SELECT unix_timestamp(now())
一天的时间戳值就是24*60*60,3天前的时间搓就是当前时间戳减去3*24*60*60
比如删除3天前的数据(数据是时间戳格式)
DELETE FROM `数据表名` WHERE `数据字段名` < (unix_timestamp(now()) -259200)