每天必须定时去执行一条sql语句 或更新或删除或执行特定的sql语句。
MySQL的客户端工具Navicat for MySQL提供了计划任务的形式,可以很好地实现该功能,而且也确实可行,比如像定时备份就做的很好。
然而当在执行的语句中包含有中文的时候,却无法定时执行了。
那么就想到用mysql的event计划任务去实现:
要想执行event事件,就必须保证mysql的版本的5.1.6以上,否则会报如下错误:
1、要想保证能够执行event事件,就必须保证定时器是开启状态,默认为关闭状态
set GLOBAL event_scheduler = 1
或
set GLOBAL event_scheduler = ON
要查看当前是否已开启事件调度器,可执行如下SQL:
SHOW VARIABLES LIKE 'event_scheduler'
2、如果原来存在该名字的任务计划则先删除
drop event if exist upload_to_sdmp
3、执行事件
event事件语法格式:
[sql] view plain copy print?
<pre name="code" class="sql">CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement
schedule:
AT TIMESTAMP [+ INTERVAL INTERVAL]
| EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]
INTERVAL:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
例如:
-- 设置时区并设置计划事件调度器开启,也可以 event_scheduler = ON
[sql] view plain copy print?
set time_zone = '+8:00'
set GLOBAL event_scheduler = 1
-- 设置该事件使用或所属的数据库base数据库
use test
# 如果原来存在该名字的任务计划则先删除
drop event if exists upload_to_sdmp
# 设置分隔符为 '$$' ,mysql默认的语句分隔符为 '' ,这样在后续的 create 到 end 这段代码都会看成是一条语句来执行
DELIMITER $$
# 创建计划任务,设置第一次执行时间为'2014-07-30 10:00:00',并且每天执行一次
create event upload_to_sdmp
on schedule every 1 day starts timestamp '2014-07-30 10:00:00'
#on schedule every 1 SECOND
do
# 开始该计划任务要做的事
begin
-- do something 编写你的计划任务要做的事
INSERT aaa VALUES (3,'222')
INSERT aaa VALUES (2,'222')
-- 结束计划任务
end $$
# 将语句分割符设置回 ''
DELIMITER
4、查询事件的运行状态
修改事件语法格式:
[sql] view plain copy print?
ALTER EVENT event_name
[ON SCHEDULE schedule]
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[COMMENT 'comment']
[ENABLE | DISABLE]
[DO sql_statement]
5、关闭\打开事件:
[sql] view plain copy print?
关闭事件:
ALTER EVENT upload_to_sdmp DISABLE
[sql] view plain copy print?
开启事件:
ALTER EVENT upload_to_sdmp ENABLE
6、查询事件是否开启
[sql] view plain copy print?
select * from mysql.event
注意:真实的开发环境中,会遇到mysql服务重启或者断电的情况,此时则会出现事件调度器被关闭的情况,所有事件都不在起作用,要想解决这个办法,则需要在mysql.ini文件中加入event_scheduler = ON的语句
打开navicat客户端,连上mysql后,双击左边你想要备份的数据库。点击“计划”,再点击“新建批处理作业”。双击上面的可用任务,它就会到下面的列表里去,代表你选择了这个任务。
点击保存,d出个命名对话框,给这个任务取个名字,点击“确定”。
点击“设置”计划任务。
d出的对话框,选择“计划”,再点击“新建”。
这里设置为从2014年1月24号起每天早上九点备份该数据库。如果你想提高备份频率、或者设置备份截止日期,请点击“高级”。
高级选项可以把备份设置的更精细,比如这里设置的是在24小时内每隔2小时就备份一次。加上前面的基本设置,任务计划就是:从2014年1月24号开始,每天九点,每隔2小时备份一次,每天的备份都持续24小时。
最后,输入电脑密码就大功告成。
首先你要知道字段endtime的值,假如为$endtimemysql_query("delete from end where endtime='$endtime'",$conn)
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点执行
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)