问:用navicat 能设置远程服务器吗,设置好了是写到远程服务器上的mysql中定时执行吗?navicat如果卸载了还能执行吗?
答:Navicat可以设置远程服务器,如果你连接的是远程服务器数据库那么就是设置到远程服务器的mysql中,而不是本机中,其实归根揭底这种方式就是在服务器上设置了一个mysql存储过程,然后定时调用这个存储过程而已;所以与你自己本地电脑上安装的Navicat软件无关,删除也没有问题的。
一、先看服务器MYSQL服务是否开启
1.查看是否开启定时任务
show variables like 'event_scheduler';
查看event_scheduler如果为OFF或0就表示关闭
- //开启命令-查询中运行
- 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 创建函数
选项:过程
- CREATE DEFINER=`创建时自动添加的`@`%` PROCEDURE `del_chat_7d`()
- BEGIN
-
- #用于删除访客与客服聊天记录7天表,只保留最近7天数据
-
- #定义变量
- DECLARE done int DEFAULT(0);#游标标记
- DECLARE timestampTmp INT;#时间戳
- DECLARE eid INT DEFAULT(0);
- DECLARE err INT DEFAULT(0); #是否有sql错误
-
-
- #创建游标,并且存储数据,获取未处理,已结束的广告活动id
- DECLARE cur_ad CURSOR
- FOR
- SELECT id FROM 库.表;#列出所有企业ID
-
-
- #游标中的内容执行完后将done设置为1
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
- #检查sql是否有错
- DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
- DECLARE CONTINUE HANDLER FOR 1146 SET err=0; #没有表的错误码-跳过当前循环往下走
- DECLARE CONTINUE HANDLER FOR 1243 SET err=0; #没有处理错误的错误码循环-跳过当前循环往下走
-
-
- #赋值当前时间
- SET timestampTmp = UNIX_TIMESTAMP(CURDATE())-7*24*3600;#7天前时间戳-零点以前
-
- #打开游标
- OPEN cur_ad;
-
- #执行循环
- posLoop:LOOP
- #游标结束或者SQL错误,结束循环
- -- SELECT done;#SELECT=打印=echo=输出执行完整状态
- -- SELECT err; #SELECT=打印=echo=输出错误状态
-
-
- IF done = 1 or err = 1 THEN
- LEAVE posLoop;#退出循环-不能删除,不然进入死循环
- END IF;
-
- #取游标中的值
- FETCH cur_ad INTO eid;
- SELECT eid;#SELECT=打印=echo=输出 输出表名
-
- #删除数据7天以前的数据
- #@STMT作用是因为表名是变量
- set @STMT=CONCAT("DELETE FROM dc_chat_",eid,"_7d where time < ",timestampTmp,";");
- -- SELECT @STMT;#打印出sql语句
- PREPARE STMT FROM @STMT;
- EXECUTE STMT;
-
-
- #结束循环
- END LOOP posLoop;
-
- #释放游标
- CLOSE cur_ad;
- 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自增字段,但是有唯一联合索引,索引用于判断是否同一条记录
第一种缺点表中第个字段都要写出来;第二种不用写表字段
- //表字段:id,title,type,statu
-
- //1.不判断重复数据,有相同数据都当新数据插入
- INSERT INTO `power_node`(title,type,status) SELECT title,type,status FROM power_node WHERE id < 5;
-
- //2.判断重复数据,有相同数据更新数据(但是数据中要唯一的联合索引)
- REPLACE INTO `power_node` SELECT * FROM power_node WHERE id < 5;
创建函数,并创建事件,按上面一样的设置
- CREATE DEFINER=`fncmscom`@`%` PROCEDURE `card_7d_goto_3m`()
- BEGIN
-
- #1.把7天表中超过7天的数据移动到3月表中,同时把超过7天的从7天表中删除-dc_chat_card_x_
- #2.把3月表中超过3月的数据移动到3月之前表中,同时把超过3月的从3月表中删除-dc_chat_card_x_
-
- #定义变量
- DECLARE done int DEFAULT(0);#游标标记
- DECLARE timestampTmp7d INT;#时间戳-7天-7d
- DECLARE timestampTmp3m INT;#时间戳-3月-3m
- DECLARE eid INT DEFAULT(0);
- DECLARE err INT DEFAULT(0); #是否有sql错误
-
-
-
- #创建游标,并且存储数据,获取未处理,已结束的广告活动id
- DECLARE cur_ad CURSOR
- FOR
- #SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME like 'dc_chat_%_7d';
- SELECT id FROM www_datacms_com.dc_enterprise;#列出所有企业ID
-
-
- #游标中的内容执行完后将done设置为1
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
- #检查sql是否有错
- DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
- DECLARE CONTINUE HANDLER FOR 1146 SET err=0; #没有表的错误码-跳过当前循环往下走
- DECLARE CONTINUE HANDLER FOR 1243 SET err=0; #没有处理错误的错误码循环-跳过当前循环往下走
-
-
- #赋值当前时间
- SET timestampTmp7d = UNIX_TIMESTAMP(CURDATE())-7*24*3600;#7天前时间戳-零点以前
- SET timestampTmp3m = UNIX_TIMESTAMP(CURDATE())-90*24*3600;#90天前时间戳-零点以前
-
- #打开游标
- OPEN cur_ad;
-
- #执行循环
- posLoop:LOOP
- #游标结束或者SQL错误,结束循环
- -- SELECT done;#SELECT=打印=echo=输出执行完整状态
- -- SELECT err; #SELECT=打印=echo=输出错误状态
-
-
- IF done = 1 or err = 1 THEN
- LEAVE posLoop;#退出循环-不能删除,不然进入死循环
- END IF;
-
- #取游标中的值
- FETCH cur_ad INTO eid;
- -- SELECT eid;#SELECT=打印=echo=输出 输出表名
-
- #1.插入-把7天表中超过7天的数据移动到3月表中
- #@STMT作用是因为表名是变量
- #REPLACE into 作用当存在数据就修改没有新增加,但是不能自增ID字段,我们设置了唯一的联合索引uid
- set @STMT=CONCAT("REPLACE into dc_chat_card_",eid,"_3m select * from dc_chat_card_",eid,"_7d where time < ",timestampTmp7d,";");#在3月表中插入7天表中超过7天的数据
- -- 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天的数据
- -- set @STMT=CONCAT("SELECT * FROM dc_chat_card_",eid,"_7d where time < ",timestampTmp7d,";");#查询超过7天的数据
- SELECT @STMT;#打印出sql语句
- PREPARE STMT FROM @STMT;
- EXECUTE STMT;
-
- #2.删除-把7天表中超过7天的数据删除
- set @STMT=CONCAT("DELETE FROM dc_chat_card_",eid,"_7d where time < ",timestampTmp7d,";");#删除
- SELECT @STMT;#打印出sql语句
- PREPARE STMT FROM @STMT;
- EXECUTE STMT;
-
-
- #结束循环
- END LOOP posLoop;
-
- #释放游标
- CLOSE cur_ad;
- 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