mysql数据库如何实现定期删除数据库一些东西
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql数据库如何实现定期删除数据库一些东西相关的知识,希望对你有一定的参考价值。
mysql 5.1以后版本中有 Event ,这是类似Oracle中的job 可以通过创建Event,然后在里面调用删除过期记录的存储过程即可实现 定时每天备份mysql并定时删除上月记录(脚本) ouwsh | September 3, 2009 10:41 | Linux/Unix相关 | 阅读(1536) | 评论(0) shell脚本:备份的脚本比较简单:
#!/bin/bash
# 定义年 月 日
year=`date +%Y`
month=`date +%m`
day=`date +%d`
# 定义备份的目录
BACKDIR=/bak_1/mysql/$year/$month/$day
# MySQL的root密码
ROOTPASS=123456
# 建立目录
mkdir -p $BACKDIR
# 获取数据库列表
DBLIST=`ls -p /var/lib/mysql | grep / | tr -d /`
# 备份
for dbname in $DBLIST
do
mysqlhotcopy $dbname -u root -p $ROOTPASS $BACKDIR | logger -t mysqlhotcopy
done
复制代码上面的脚本将数据库按"年/月/日"目录结构备份,将脚本存为back.sh添加到cron里每天凌晨3点执行
crontab -e
00 03 * * * root /root/back.sh
下面的是每月3号删除上个月的备份,存为del_bak.sh,每月3号3点3分执行
03 03 03 * * root /root/del_bak.sh
注意脚本上传后,要chmod一下权限,比如
chmod 755 /root/back.sh
#!/bin/bash
# 定义年 月 日
year=`date +%Y`
month=`date +%m`
#day=`date +%d`
# 取上一个月
month=`expr $month - 1`
# 如果是1月,则上一月为12,并且年也减1
if [ $month -eq 0 ]; then
month=12
day=31
year=`expr $year - 1`
fi
# 因为备份时小于10月的月份有前导零,所以这里判断如果小于10月,则加前导零
if [ $month -lt 10 ]; then
pre=0
fi
#获取要删除的目录名
BACKDIR=/bak1/mysql/$year/$pre$month
#删除了
rm -rf $BACKDIR
重新启动crond
/etc/rc.d/init.d/crond restart 参考技术A
mysql定时任务
自 MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得 一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精 确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。
如:每隔30秒将执行存储过程test,将当前时间更新到examinfo表中id=14的记录的endtime字段中去.
CREATE PROCEDURE test ()BEGIN
update examinfo SET endtime = now() WHERE id = 14;
END;
create event if not exists e_test
on schedule every 30 second
on completion preserve
do call test();
2. windows、linux 的定时任务 这个就不举例了,通过脚本定时去调用mysql执行
参考技术B 写个批处理。然后将批处理添加到计划里mysql 隔段时间自动删除数据
设计了一个数据库,其中有user表,有一个表项是time,存储用户上一次登陆时间,想设计一下如果用户隔了两个月还没有进行第二次登陆,则自动删除此条目。请问如何实现
参考技术A 使用event_scheduler实现,这是个事件的自动调度机制,会定期执行事件中定义的语句;1 配置开启event scheduler
配置my.ini文件 中加上 event_scheduler = 1
重启mysql服务
验证event_scheduler是否已经开启: show variables like '%event%'; #值为 ON 表明已开启
2 创建event
drop event event_test_a;
CREATE EVENT event_test_a
ON SCHEDULE EVERY 1 day STARTS date_add(concat(current_date(), ' 00:00:00'), interval 0 second)
ON COMPLETION PRESERVE ENABLE
DO
delete from dbname.`user` where (`name`, `time` ) =
(
select `name`, max_time from
(select `name`, max(`time`) max_time from dbname.`user` group by 1) t
where max_time < date_add(current_timestamp, interval -2 month)
);
#说明:
ON SCHEDULE EVERY 1 day 指定循环间隔为每天执行
STARTS date_add(concat(current_date(), ' 23:59:00'), interval 0 second) 指定运行时间为23:59:00
ON COMPLETION PRESERVE ENABLE 指定创建完成后即启用,否则需手动启动
替换DO后边的语句中的相关部分(如数据库dbname, 表名,字段名等),DO 中也可以执行一个自定义的存储过程(该存储过程自已实现业务逻辑)
3 察看是否开始工作
SHOW PROCESSLIST; --看是否有event_scheduler的user的进程;
4 手动关闭事件
ALTER EVENT event_test_a DISABLE;
5 手动该事件为可用
ALTER EVENT event_test_a ENABLE;追问
select `name`, max(`time`) max_time from dbname.`user` group by 1 这个group by 1是什么意思,还有后边的t。求解释
追答这是个子查询,查出每个名称的最大时间,group by 是按名称分组,这样每个名称只有一条记录。
然后这个子查询的结果作为一个临时表,起别名为表 t 。
然后再加条件 max_time < date_add(current_timestamp, interval -2 month) 取出最大时间小于当前时间两月之前的。
最后把这个存在的 (name, time) 作为要删除的条件,可理解为 (`name`, `time` ) = (`name`, `time`)。
谢谢!
本回答被提问者采纳以上是关于mysql数据库如何实现定期删除数据库一些东西的主要内容,如果未能解决你的问题,请参考以下文章