MYSQL定时任务使用手册

news2024/9/20 13:14:39

       开发和管理数据库时,经常需要定时执行某些任务,比如每天备份数据库、每周统计报表等。MySQL提供了一个非常有用的工具,即事件调度器(Event Scheduler),可以帮助我们实现定时任务调度的功能。本文将介绍如何使用mysql的事件调度器实现定时任务调度,并提供相应的代码示例。注意MYSQL版本为5.1或以上才能使用此功能

1、开启事件调度器
1.1   在使用事件调度器之前,首先需要确认MySQL的事件调度器是否已经 开启。可以通过以下命令查看事件调度器的状态:
方法一
select @@event_scheduler;

--方法二
show variables like 'event_scheduler';

 

SHOW VARIABLES LIKE 'event_scheduler';

如果结果为Off,则需要手动开启事件调度器。可以通过以下命令开启:

1.2   开启定时调度命令,如下命令开启,如果服务器重启以后,此配置未失效,我们在配置文件 中修改,开启调度命令
-- 开启event事件:
-- 方法1
set GLOBAL event_scheduler=ON;
-- 方法2
set GLOBAL event_scheduler=1;

开启成功后,可以通过再次执行SHOW VARIABLES LIKE 'event_scheduler';命令来确认事件调度器已经开启。

 1.3  (建议使用此方法)您也可以在MySQL配置文件(通常是my.cnf或my.ini)中设置:

[mysqld]
event_scheduler = ON

您也可以在MySQL配置文件(通常是my.cnf或my.ini)中设置:

[mysqld]
event_scheduler = ON
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
character-set-server=utf8      
default-storage-engine=innodb
port=50002 
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 2024-08-20 
event_scheduler = ON

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

2、创建定时任务,使用事件调度器创建定时任务需要执行以下步骤:
2.1 创建一个事件调度器

使用CREATE EVENT语句可以创建一个事件调度器。具体语法如下:

CREATE EVENT event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'string']
DO event_body;

其中event_name是事件的名称,schedule是调度周期,event_body是事件的具体操作。

2.1.1 设定调度周期

调度周期可以根据实际需求设定。以下是常用的调度周期:

  • 每秒钟执行一次:EVERY 1 SECOND
  • 每分钟执行一次:EVERY 1 MINUTE
  • 每小时执行一次:EVERY 1 HOUR
  • 每天执行一次:EVERY 1 DAY
  • 每周执行一次:EVERY 1 WEEK
  • 每个月执行一次:EVERY 1 MONTH

可以根据需求选择合适的调度周期。

2.1.2 编写事件的具体操作

        在event_body部分编写具体的操作逻辑。可以使用SQL语句执行数据库操作,也可以调用存储过程或函数。

以下是一个示例的定时任务,每天凌晨3点备份数据库:

CREATE EVENT backup_event
ON SCHEDULE EVERY 1 DAY
STARTS '2022-01-01 03:00:00'
DO
BEGIN

1

2

3

4

5

6

DECLARE backup_file VARCHAR(255);

SET backup_file := CONCAT('/var/backup/db_', DATE_FORMAT(NOW(), '%Y%m%d_%H%i%s'), '.sql');

SET @sql := CONCAT('mysqldump -hlocalhost -uroot -ppassword dbname > ', backup_file);

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

END;

CREATE EVENT backup_event
ON SCHEDULE EVERY 1 DAY
STARTS '2022-01-01 03:00:00'
DO
BEGIN


DECLARE backup_file VARCHAR(255);

SET backup_file := CONCAT('/var/backup/db_', DATE_FORMAT(NOW(), '%Y%m%d_%H%i%s'), '.sql');

SET @sql := CONCAT('mysqldump -hlocalhost -uroot -ppassword dbname > ', backup_file);

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

END;

以上代码创建了一个名为backup_event的事件调度器,设定调度周期为每天执行一次。在event_body部分,首先定义了一个变量backup_file,用于存放备份文件的路径。然后使用CONCAT函数拼接备份文件路径,再使用SET语句将备份命令赋值给@sql变量。最后,使用PREPARE和EXECUTE语句执行备份命令。

2.2 创建任务的实例
CREATE TABLE t_mysql_job (
  id INT AUTO_INCREMENT PRIMARY KEY,
  job_name VARCHAR(50) NOT NULL,
  job_description VARCHAR(100),
  job_status INT DEFAULT 0,
  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE EVENT job_10_minute_test
ON SCHEDULE EVERY 10 MINUTE
-- 从什么时候开始计时
STARTS SYSDATE()
DO
-- 在这里编写定时任务的逻辑代码
INSERT INTO t_mysql_job (job_name, job_description) VALUES ('Daily Job', 'This is a daily job');

2.2.1从当前时间延迟指定时间,每隔10分钟执行一次

     以下SQL用于创建一个循环事件,每个EVERY 10 MINUTE表示该事件每一分钟就执行一次,CURRENT_TIMESTAMP + INTERVAL 5 MINUTE表示从当前时间开始延迟五分钟再执行。

create EVENT job_p_hr_attendance_daily
ON SCHEDULE
EVERY 10 MINUTE STARTS CURRENT_TIMESTAMP + INTERVAL 10 MINUTE
ON COMPLETION PRESERVE
DO  call  p_hr_attendance_daily
;
 2.2.2  指定某个时间开始,每隔5分钟执行一次

CREATE EVENT DelayedSchedulingEvent
ON SCHEDULE
EVERY 5 MINUTE STARTS '2024-03-22 10:10:00'
ON COMPLETION PRESERVE
DO INSERT INTO `template_backend`.`message` (`message`, `message_date`) values ('指定时间2024-03-22 10:10:00后,每隔1分钟执行', now());
3、管理定时任务

使用CREATE EVENT语句创建了定时任务后,可以通过以下命令进行管理:

  • 查看所有事件调度器:SHOW EVENTS;
  • 查看指定事件调度器的信息:SHOW EVENT event_name;
  • 启用事件调度器:ALTER EVENT event_name ENABLE;
  • 禁用事件调度器:ALTER EVENT event_name DISABLE;
  • 修改事件调度器的执行时间:ALTER EVENT event_name ON SCHEDULE AT 'date_time';

通过管理命令,可以方便地查看和管理定时任务。

3.1 查看执行事件,使用命令 show events,显示如下重要的信息

DB:表示用作与哪个库,Name是事件名称。
Definer:表示哪个用户权限执行。
Type:ONE TIME表示只执行一次。
status:ENABLE表示当前事件为可用状态。

show events
 4 定时任务查询(帐号要查询此表的权限)
4.1 执行以下命令来查询事件日志表:
SELECT * FROM mysql.event;

复制代码

  1. 这将列出所有已经创建的事件及其相关信息,如事件名称、状态、创建时间、执行时间等。

  2. 如果想查看特定事件的执行历史,可以通过事件名称来筛选:

4.2 按事件名称来查询,执行记录 

--查询执行情况
SELECT * FROM mysql.event  ;
--查询执行情况
SELECT * FROM mysql.event WHERE name = 'your_event_name';
--查询执行情况
SELECT * FROM information_schema.EVENTS ;

如果不是管理员帐号,切换到管理员下,执行如下命令,给予如下权限,以后便可以查询event的权限

grant select, insert,update,delete  on mysql.event   to 'mes'@'%';


 实际案例代码

参考代码:

-- 创建事件调度器
CREATE EVENT backup_event
ON SCHEDULE EVERY 1 DAY
STARTS '2022-01-01 03:00:00'
DO
BEGIN

1

2

3

4

5

6

DECLARE backup_file VARCHAR(255);

SET backup_file := CONCAT('/var/backup/db_', DATE_FORMAT(NOW(), '%Y%m%d_%H%i%s'), '.sql');

SET @sql := CONCAT('mysqldump -hlocalhost -uroot -ppassword dbname > ', backup_file);

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

END;

-- 查看所有事件调度器
SHOW EVENTS;

-- 查看指定事件调度器的信息
SHOW EVENT backup_event;

-- 启用事件调度器
ALTER EVENT backup_event ENABLE;

-- 禁用事件调度器
ALTER EVENT backup_event DISABLE;

-- 修改事件调度器的执行时间
ALTER EVENT backup_event ON SCHEDULE AT '2023-01-01 03:00:00';

CREATE DEFINER=`root`@`%` PROCEDURE `yuxiu_mes_prd`.`p_hr_attendance_daily`()
BEGIN
	
	DECLARE finished INTEGER DEFAULT 0;  
    DECLARE v_dept_code VARCHAR(100); 
    DECLARE v_dept_name VARCHAR(100);  
    DECLARE v_onjob_qty int;
    DECLARE v_onjob_qty_sum int default  0;  
    DECLARE v_attendance_actual_qty_sum int  default  0;   
	-- 计算在职人数
	DECLARE cur CURSOR FOR select
							dept_code,
							dept_name,
							COUNT(person_num) qty
						from
							md_person
						where
							status = '10'
						group by
							dept_code,
							dept_name;
	-- 声明NOT FOUND的处理程序  
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;  
   
    OPEN cur; -- 打开游标 
    
    execute_do: LOOP  
        FETCH cur INTO v_dept_code, v_dept_name,v_onjob_qty; -- 从游标中获取数据  
        IF finished THEN   
            LEAVE execute_do; -- 如果已经到达结果集的末尾,则退出循环  
        END IF;  
        -- 在这里可以对获取到的数据进行处理,比如打印出来 
        set v_onjob_qty_sum=v_onjob_qty_sum+v_onjob_qty; 
		INSERT
			INTO
			hr_attendance_daily(attendance_date,
			dept_code,
			dept_name,
			onjob_qty,
			attendance_required_qty,
			update_by,
			update_time)
	VALUES 
		(current_date,
		v_dept_code,
		v_dept_name,
		v_onjob_qty,	
		v_onjob_qty,
		'p_hr_attendance_daily',
		now()) ON DUPLICATE KEY
		UPDATE
			onjob_qty = v_onjob_qty,
			attendance_required_qty = v_onjob_qty,		
			update_by = 'p_hr_attendance_daily',
			update_time = now()
			;  
    END LOOP execute_do;  
   -- 更新出勤率
   update hr_attendance_daily set  attendance_rate=attendance_actual_qty/onjob_qty where attendance_date =CURRENT_DATE() ;				
 
  -- 计算出勤人数总数
  select  SUM(attendance_actual_qty) into  v_attendance_actual_qty_sum from hr_attendance_daily 
  where attendance_date =CURRENT_DATE() and dept_code<>'all' ;
 
 -- 计算所有出勤率
 		INSERT
			INTO
			hr_attendance_daily(attendance_date,
			dept_code,
			dept_name,
			onjob_qty,
			attendance_required_qty,
			attendance_actual_qty,
			attendance_rate,
			update_by,
			update_time)
	  VALUES 
		(current_date,
		'all',
		'all',
		v_onjob_qty_sum,	
		v_onjob_qty_sum,
		v_attendance_actual_qty_sum,
		v_attendance_actual_qty_sum/v_onjob_qty_sum,
		'p_hr_attendance_daily',
		now()) ON DUPLICATE KEY
		UPDATE
			onjob_qty = v_onjob_qty_sum,
			attendance_required_qty = v_onjob_qty_sum,
			attendance_actual_qty=v_attendance_actual_qty_sum,
			attendance_rate=v_attendance_actual_qty_sum/v_onjob_qty_sum,
			update_by = 'p_hr_attendance_daily',
			update_time = now()
			;  
  
 
END

执行查看JOB执行的情况 

--执行查看任务
select * from mysql.event  ;
select * from information_schema.events ;
show variables like 'event_scheduler';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel中的“块”操作

在Excel中&#xff0c;有offset、index、indirect三个对“区域”操作的函数&#xff0c;是较高版本Excel中“块”操作的利器。 (笔记模板由python脚本于2024年08月20日 19:25:21创建&#xff0c;本篇笔记适合喜欢用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Pytho…

46、Python之模块和包:一切皆对象,模块和包也不例外

引言 在前面的文章中&#xff0c;我们介绍了变量、函数、类&#xff0c;在实际编程中&#xff0c;始终在贯彻的有两点&#xff1a; 1、在Python中一切皆对象&#xff0c;所以函数、类、模块、包也都是一等公民。 2、不管是基于面向过程还是面向对象&#xff0c;我们在实际编…

使用Element UI组件时,icon图标不显示

问题描述&#xff1a; 我在使用Element UI组件的日期选择器时&#xff0c;发现图标不显示(左边是原图&#xff0c;右边的问题图)。 经过检查我发现&#xff0c;我的JS&#xff0c;CSS文件都没有问题&#xff0c;只是缺少了element-icons.tff和element-icons.woff这两个文件。 …

JSON, YAML, XML, CSV交互可视化

1、jsoncrack https://jsoncrack.com/editor

O2OA(翱途)服务器配置与管理-如何修改服务器内存占用率?

o2server 启动后一般占用大约4G~6G内存空间,在启动脚本中默认设置 -Xms2g 限定heap(堆)的大小最小2G,可以通过设置-Xmx来设置堆的上限. Xms -Xms2g:设置JVM初始堆内存为2g.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存. Xmx -Xmx5g:设置JVM最大堆内存为5g.…

LLM 压缩之二: ShortGPT

0. 资源链接 论文: https://arxiv.org/pdf/2403.03853 项目代码: 待开源 1. 背景动机 现有的大语言模型 LLM 推理存在以下问题&#xff1a; LLM 模型因为 scale law 极大的提高模型的预测能力&#xff0c;但是同样带来较大的推理延时&#xff1b;对于 LLM 应用部署带来较大…

软件设计师全套备考系列文章6 -- 线性表、栈和队列、串、数组、矩阵、广义表

软考-- 软件设计师&#xff08;6&#xff09;-- 线性表、栈和队列、串、数组、矩阵、广义表 文章目录 软考-- 软件设计师&#xff08;6&#xff09;-- 线性表、栈和队列、串、数组、矩阵、广义表前言一、线性表二、栈和队列三、串、数组、矩阵、广义表 前言 考试时间&#xff…

反向代理:定义与核心作用

反向代理&#xff1a;定义与核心作用 一、反向代理的定义二、反向代理的核心作用 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 反向代理&#xff0c;作为网络架构中的重要组件&#xff0c;扮演着关键角色。本文将简洁介绍反向代理的定义及…

出现 2003 - Can’t connect to MySQL server on ‘xxx‘(10060) 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 sql链接远程服务器的时候,出现如下问题: 2003 - Can’t connect to MySQL server on xxx(10060)截图如下所示: 2. 原理分析 错误代码 10060 表示“连接超时”,说明客户端在尝试连接到服务器时,服务器没有响应或者响…

qtsql连接达梦数据库

odbc window和linux都有odbc的中间件&#xff0c;可以通过odbc中间件配合qtsql连接数据库 windows下配置odbc linux配置odbc apt install unixodbc unixodbc-dev /etc/odbcinst.ini配置 [DM8 ODBC DRIVER] DescriptionDM8 ODBC Driver DRIVER/opt/dmdbms/bin/libdodbc.so/et…

LevelDB源码分析(一)安装编译和简单Demo

初识LevelDB 认识LevelDB & 源码下载编译Mac源码下载和编译运行 认识LevelDB & 源码下载编译 LevelDB是 Google 编写的key-value存储库&#xff0c;提供从Key到Value的有序映射。 LevelDB的代码量相比其他开源项目较少&#xff0c;除了测试之外大约有不到两万行代码。 …

LabVIEW软件定制开发公司的前景如何?

LabVIEW软件定制开发公司的前景在当前的技术发展环境下展现出一定的潜力与挑战。这一领域的市场前景主要受到工业自动化、物联网、智能制造等技术趋势的推动&#xff0c;同时也受到行业竞争、技术更新以及人才市场的制约。 ​ 市场需求与增长潜力 随着工业4.0、物联网和智能制…

halcon的HObject被释放

经过简述 某项目由我统一管理HObject(区域和图像)的释放。发现某区域被系统外部所释放。可能有两种情况&#xff1a;a&#xff0c;区域交给我后&#xff0c;释放了。b&#xff0c;获取我的区域后释放了。 最终证明是第二种情况&#xff0c;证明如下&#xff1a; a&#xff0c;…

百度地图SDK Android版开发 7 覆盖物示例1

百度地图SDK Android版开发 7 覆盖物示例1 前言界面布局MapMarker类常量成员变量初始值Marker点击事件Marker拖拽事件创建覆盖物移除覆盖物设置属性 MapMarkerActivity类控件响应事件 运行效果图 前言 文本介绍Marker的常用属性、交互和碰撞示例。 示例功能如下&#xff1a; …

设计模式六大原则(一)–单一职责原则(C#)

文章目录 1. 什么是单一职责原则&#xff1f;2. 单一职责原则的定义3. 单一职责原则的重要性4. 单一职责原则的示例&#xff08;C#&#xff09;5.如何判断是否违反单一职责原则6. 单一职责原则的应用场景7. 总结 在软件开发领域&#xff0c;设计模式是解决常见问题的经典解决方…

【实现100个unity特效之24】使用ShaderGraph将图片转变为像素艺术

ShaderGraph连线图 效果 参考 https://www.youtube.com/watch?vBmhj7RgVDzc 完结 赠人玫瑰&#xff0c;手有余香&#xff01;如果文章内容对你有所帮助&#xff0c;请不要吝啬你的点赞评论和关注&#xff0c;你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章…

@DateTimeFormat和@JsonFormat

DateTimeFormat 用于接收前端传入的参数&#xff0c;变成自己想要的格式 JsonFormat用于格式化后端返回给前端的参数 DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss") JsonFormat(pattern "yyyy-MM-dd HH:mm:ss", timezone "GMT8") private …

深入理解Faiss:高效向量检索的利器

近年来&#xff0c;随着人工智能和机器学习技术的飞速发展&#xff0c;向量检索技术变得越来越重要。无论是在推荐系统、图像搜索还是自然语言处理等领域&#xff0c;向量检索都扮演着至关重要的角色。而在众多向量检索库中&#xff0c;Faiss&#xff08;Facebook AI Similarit…

-Wl,-rpath= 编译器链接器指定动态库路径 与 LD_LIBRARY_PATH

实例先行&#xff0c; 1&#xff0c;情景 三互相依赖的小项目&#xff1a; &#xff08;1&#xff09;libbottom.so&#xff0c;无特别依赖&#xff0c;除系统文件 &#xff08;2&#xff09;libtop.so&#xff0c;依赖libbottom.so &#xff08;3&#xff09;app 可执行程…

【Deep Live Cam】只需一张图片,就可实现视频的人脸替换。

Deep Live Cam 运用尖端AI技术&#xff0c;将实时换脸和视频深伪推向新的境界。只需一张图片&#xff0c;即可实现高质量的人脸替换。 用户在X上对Deep Live Cam的评价。 如何安装它&#xff1f; 1、环境 python (推荐 3.10 ) pip git ffmpeg https://www.youtube.com…