关键词搜索

源码搜索 ×
×

mysql navicat 自动执行定时任务/事件

发布2022-02-19浏览9488次

详情内容

问:用navicat 能设置远程服务器吗,设置好了是写到远程服务器上的mysql中定时执行吗?navicat如果卸载了还能执行吗?


答:Navicat可以设置远程服务器,如果你连接的是远程服务器数据库那么就是设置到远程服务器的mysql中,而不是本机中,其实归根揭底这种方式就是在服务器上设置了一个mysql存储过程,然后定时调用这个存储过程而已;所以与你自己本地电脑上安装的Navicat软件无关,删除也没有问题的。

一、先看服务器MYSQL服务是否开启

1.查看是否开启定时任务

show variables like 'event_scheduler';

查看event_scheduler如果为OFF或0就表示关闭

  1. //开启命令-查询中运行
  2. set global event_scheduler = on;

2.设置重启服务器(重启mysql服务)继续执行

提醒:虽然这里用set global event_scheduler = on语句开启了事件,但是每次重启电脑。或重启mysql服务后,会发现,事件自动关闭(event_scheduler=OFF),所以想让事件一直保持开启,最好修改配置文件,让mysql服务启动的时候开启时间,只需要在my.ini配置文件的[mysqld]部分加上event_scheduler=ON 即可,如下:

二、删除表7天以前的数据(开始创建自动运行脚本)

例子:删除表7天以前的数据

2.1 创建函数

选项:过程

  1. CREATE DEFINER=`创建时自动添加的`@`%` PROCEDURE `del_chat_7d`()
  2. BEGIN
  3. #用于删除访客与客服聊天记录7天表,只保留最近7天数据
  4. #定义变量
  5. DECLARE done int DEFAULT(0);#游标标记
  6. DECLARE timestampTmp INT;#时间戳
  7. DECLARE eid INT DEFAULT(0);
  8. DECLARE err INT DEFAULT(0); #是否有sql错误
  9. #创建游标,并且存储数据,获取未处理,已结束的广告活动id
  10. DECLARE cur_ad CURSOR
  11. FOR
  12. SELECT id FROM 库.表;#列出所有企业ID
  13. #游标中的内容执行完后将done设置为1
  14. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  15. #检查sql是否有错
  16. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
  17. DECLARE CONTINUE HANDLER FOR 1146 SET err=0; #没有表的错误码-跳过当前循环往下走
  18. DECLARE CONTINUE HANDLER FOR 1243 SET err=0; #没有处理错误的错误码循环-跳过当前循环往下走
  19. #赋值当前时间
  20. SET timestampTmp = UNIX_TIMESTAMP(CURDATE())-7*24*3600;#7天前时间戳-零点以前
  21. #打开游标
  22. OPEN cur_ad;
  23. #执行循环
  24. posLoop:LOOP
  25. #游标结束或者SQL错误,结束循环
  26. -- SELECT done;#SELECT=打印=echo=输出执行完整状态
  27. -- SELECT err; #SELECT=打印=echo=输出错误状态
  28. IF done = 1 or err = 1 THEN
  29. LEAVE posLoop;#退出循环-不能删除,不然进入死循环
  30. END IF;
  31. #取游标中的值
  32. FETCH cur_ad INTO eid;
  33. SELECT eid;#SELECT=打印=echo=输出 输出表名
  34. #删除数据7天以前的数据
  35. #@STMT作用是因为表名是变量
  36. set @STMT=CONCAT("DELETE FROM dc_chat_",eid,"_7d where time < ",timestampTmp,";");
  37. -- SELECT @STMT;#打印出sql语句
  38. PREPARE STMT FROM @STMT;
  39. EXECUTE STMT;
  40. #结束循环
  41. END LOOP posLoop;
  42. #释放游标
  43. CLOSE cur_ad;
  44. END

2.2 创建事件

代码:调起刚刚创建的函数

call del_chat_7d()

 每天执行一次,从2022-02-18 03:00:00开始执行

 上图AT表示该事件只执行一次

EVERY表示可多次重复执行,前面1表示循环的周期,DAY表示周期-每天(当然这里有很多选择,月,周,小时等等)

STARTS是一个 timestamp 值表示事件开始时间

+INTERVAL表示间隔以指定「由现在开始」的时间量

ENDS表示事件的结束时间

上图所设置的就表示:从2020年五月27号开始,每天0点执行
 

三、把数据从一个表复制到另一个表(有相同数据更新,没相同数据就新增加)

用REPLACE INTO复制数据,一定要有作为唯一字段(自增ID)或索引,不然不能判断是否相同数据来更新;没有自增ID就要设置唯一联合索引

 联合唯一索引设置:

第一种:表中有自增ID字段,那么只能把字段全部写出(把ID字段去掉)

第二种:表没ID自增字段,但是有唯一联合索引,索引用于判断是否同一条记录

第一种缺点表中第个字段都要写出来;第二种不用写表字段

  1. //表字段:id,title,type,statu
  2. //1.不判断重复数据,有相同数据都当新数据插入
  3. INSERT INTO `power_node`(title,type,status) SELECT title,type,status FROM power_node WHERE id < 5;
  4. //2.判断重复数据,有相同数据更新数据(但是数据中要唯一的联合索引)
  5. REPLACE INTO `power_node` SELECT * FROM power_node WHERE id < 5;

 创建函数,并创建事件,按上面一样的设置

  1. CREATE DEFINER=`fncmscom`@`%` PROCEDURE `card_7d_goto_3m`()
  2. BEGIN
  3. #1.把7天表中超过7天的数据移动到3月表中,同时把超过7天的从7天表中删除-dc_chat_card_x_
  4. #2.把3月表中超过3月的数据移动到3月之前表中,同时把超过3月的从3月表中删除-dc_chat_card_x_
  5. #定义变量
  6. DECLARE done int DEFAULT(0);#游标标记
  7. DECLARE timestampTmp7d INT;#时间戳-7天-7d
  8. DECLARE timestampTmp3m INT;#时间戳-3月-3m
  9. DECLARE eid INT DEFAULT(0);
  10. DECLARE err INT DEFAULT(0); #是否有sql错误
  11. #创建游标,并且存储数据,获取未处理,已结束的广告活动id
  12. DECLARE cur_ad CURSOR
  13. FOR
  14. #SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME like 'dc_chat_%_7d';
  15. SELECT id FROM www_datacms_com.dc_enterprise;#列出所有企业ID
  16. #游标中的内容执行完后将done设置为1
  17. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  18. #检查sql是否有错
  19. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
  20. DECLARE CONTINUE HANDLER FOR 1146 SET err=0; #没有表的错误码-跳过当前循环往下走
  21. DECLARE CONTINUE HANDLER FOR 1243 SET err=0; #没有处理错误的错误码循环-跳过当前循环往下走
  22. #赋值当前时间
  23. SET timestampTmp7d = UNIX_TIMESTAMP(CURDATE())-7*24*3600;#7天前时间戳-零点以前
  24. SET timestampTmp3m = UNIX_TIMESTAMP(CURDATE())-90*24*3600;#90天前时间戳-零点以前
  25. #打开游标
  26. OPEN cur_ad;
  27. #执行循环
  28. posLoop:LOOP
  29. #游标结束或者SQL错误,结束循环
  30. -- SELECT done;#SELECT=打印=echo=输出执行完整状态
  31. -- SELECT err; #SELECT=打印=echo=输出错误状态
  32. IF done = 1 or err = 1 THEN
  33. LEAVE posLoop;#退出循环-不能删除,不然进入死循环
  34. END IF;
  35. #取游标中的值
  36. FETCH cur_ad INTO eid;
  37. -- SELECT eid;#SELECT=打印=echo=输出 输出表名
  38. #1.插入-把7天表中超过7天的数据移动到3月表中
  39. #@STMT作用是因为表名是变量
  40. #REPLACE into 作用当存在数据就修改没有新增加,但是不能自增ID字段,我们设置了唯一的联合索引uid
  41. set @STMT=CONCAT("REPLACE into dc_chat_card_",eid,"_3m select * from dc_chat_card_",eid,"_7d where time < ",timestampTmp7d,";");#在3月表中插入7天表中超过7天的数据
  42. -- set @STMT=CONCAT("REPLACE into dc_chat_card_",eid,"_3m(",allfield,") select ",allfield," from dc_chat_card_",eid,"_7d where time < ",timestampTmp7d,";");#在3月表中插入7天表中超过7天的数据
  43. -- set @STMT=CONCAT("SELECT * FROM dc_chat_card_",eid,"_7d where time < ",timestampTmp7d,";");#查询超过7天的数据
  44. SELECT @STMT;#打印出sql语句
  45. PREPARE STMT FROM @STMT;
  46. EXECUTE STMT;
  47. #2.删除-把7天表中超过7天的数据删除
  48. set @STMT=CONCAT("DELETE FROM dc_chat_card_",eid,"_7d where time < ",timestampTmp7d,";");#删除
  49. SELECT @STMT;#打印出sql语句
  50. PREPARE STMT FROM @STMT;
  51. EXECUTE STMT;
  52. #结束循环
  53. END LOOP posLoop;
  54. #释放游标
  55. CLOSE cur_ad;
  56. END

参考:

https://blog.csdn.net/weixin_44052462/article/details/106380101
https://blog.csdn.net/baochao95/article/details/45951201

MySQL数据篇(九)--存储过程实现定时每天清理过期数据 - 在斑马线上散布 - 博客园

mysql事件每天执行一次_MySQL-事件_真力 GENELEC的博客-CSDN博客

https://blog.csdn.net/laowang2915/article/details/79665001
https://www.cnblogs.com/chenpi/p/5137310.html
https://blog.csdn.net/xishining/article/details/85241941
https://blog.csdn.net/z919167107/article/details/90550912

https://www.cnblogs.com/xiaozhouyuxiaohou/p/9184248.html
https://www.cnblogs.com/camg/p/11890448.html
https://blog.csdn.net/business122/article/details/7528859
https://www.jianshu.com/p/cb0152efac32
https://blog.csdn.net/ruohan520/article/details/4694777
https://blog.csdn.net/weixin_32873435/article/details/113540671
https://blog.csdn.net/iteye_12421/article/details/82075393
https://blog.csdn.net/qq_34769161/article/details/88247203
https://blog.csdn.net/fengchengwu2012/article/details/106240161

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载