当前位置: 首页 > news >正文

MYSQL定时任务使用手册

       开发和管理数据库时,经常需要定时执行某些任务,比如每天备份数据库、每周统计报表等。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=0log-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
BEGINDECLARE 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`()
BEGINDECLARE 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 selectdept_code,dept_name,COUNT(person_num) qtyfrommd_personwherestatus = '10'group bydept_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; INSERTINTOhr_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 KEYUPDATEonjob_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' ;-- 计算所有出勤率INSERTINTOhr_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 KEYUPDATEonjob_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';

相关文章:

MYSQL定时任务使用手册

开发和管理数据库时&#xff0c;经常需要定时执行某些任务&#xff0c;比如每天备份数据库、每周统计报表等。MySQL提供了一个非常有用的工具&#xff0c;即事件调度器&#xff08;Event Scheduler&#xff09;&#xff0c;可以帮助我们实现定时任务调度的功能。本文将介绍如何…...

SAP 预扣税配置步骤文档【Withholding Tax]

1. 配置预扣税的基本概念 预扣税是对某些支付进行扣除的税&#xff0c;可能适用于各种财务交易&#xff08;例如&#xff0c;供应商支付、股息支付等&#xff09;。预扣税通常包括几种类型&#xff0c;如个人所得税、企业所得税和其他税务种类。 2. 配置步骤 以下是一般的预…...

Ubuntu ssh配置

下面给出配置和使用ubuntu ssh的指南。 环境 Ubuntu22.04 安装Install sudo apt update && sudo apt upgrade sudo apt install openssh-server使用start service ssh status sudo systemctl enable --now ssh sudo ufw allow ssh连接Connect search "conn…...

Spring Boot OAuth2.0应用

本文展示Spring Boot中&#xff0c;新版本OAuth2.0的简单实现&#xff0c;版本信息&#xff1a; spring-boot 2.7.10 spring-security-oauth2-authorization-server 0.4.0 spring-security-oauth2-client 5.7.7 spring-boot-starter-oauth2-resource-server 2.7.10展示三个服务…...

Java | Leetcode Java题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; class Solution {public int maxSumSubmatrix(int[][] matrix, int k) {int ans Integer.MIN_VALUE;int m matrix.length, n matrix[0].length;for (int i 0; i < m; i) { // 枚举上边界int[] sum new int[n];for (int j i; j <…...

AI作画提示词(Prompts)工程:技巧与最佳实践

在人工智能领域&#xff0c;AI作画已成为一个令人兴奋的创新点&#xff0c;它结合了艺术与科技&#xff0c;创造出令人惊叹的视觉作品。本文将探讨在使用AI作画时的提示词工程&#xff0c;提供技巧与最佳实践。 理解AI作画 AI作画通常依赖于深度学习模型&#xff0c;尤其是生成…...

leetcode滑动窗口问题

想成功先发疯&#xff0c;不顾一切向前冲。 第一种 定长滑动窗口 . - 力扣&#xff08;LeetCode&#xff09;1456.定长子串中的元音的最大数目. - 力扣&#xff08;LeetCode&#xff09; No.1 定长滑窗套路 我总结成三步&#xff1a;入-更新-出。 1. 入&#xff1a;下标为…...

QT 控件使用案例

常用控件 表单 按钮 Push Button 命令按钮。Tool Button&#xff1a;工具按钮。Radio Button&#xff1a;单选按钮。Check Box&#xff1a;复选框按钮。Command Link Button&#xff1a;命令链接按钮。Dialog Button Box&#xff1a;按钮盒。 容器组控件(Containers) Group Box…...

【MySQL 10】表的内外连接 (带思维导图)

文章目录 &#x1f308; 一、内连接⭐ 0. 准备工作⭐ 1. 隐式内连接⭐ 2. 显式内连接 &#x1f308; 二、外连接⭐ 0. 准备工作⭐ 1. 左外连接⭐ 2. 右外连接 &#x1f308; 一、内连接 内连接实际上就是利用 where 子句对两张表形成的笛卡儿积进行筛选&#xff0c;之前所有的…...

【C语言】:与文件通信

1.文件是什么&#xff1f; 文件通常是在磁盘或固态硬盘上的一段已命名的存储区。C语言把文件看成一系列连续的字节&#xff0c;每个字节都能被单独的读取。这与UNIX环境中&#xff08;C的 发源地&#xff09;的文件结构相对应。由于其他环境中可能无法完全对应这个模型&#x…...

HTTPS通讯全过程

HTTPS通讯全过程 不得不说&#xff0c;https比http通讯更加复杂惹。在第一次接触https代码的时候&#xff0c;不知道为什么要用用证书&#xff0c;公钥是什么&#xff1f;私钥是什么&#xff1f;他们作用是什么&#xff1f;非对称加密和对称加密是啥&#xff1f;天&#xff0c;…...

建筑物规则化(实现) --- 特征边分组、重构、直角化

规则化建筑物 一、摘 要 建筑物多边形在地图综合中的两类处理模型:化简与直角化。 建筑物矢量数据来源广泛&#xff0c;在数据获取过程中&#xff0c;受GPS精确度、遥感影像分辨率或人为因素的影响&#xff0c;数据往往存在不同程度的误差。其中&#xff0c;图像分割、深度学习…...

pytorch的优化

在pytorch中&#xff0c;tensor是基于numpy与array的。内存共享。 在pythorch中&#xff0c;自定义层是继承nn.Module。将层与模型看成是模块&#xff0c;层与模型堪称模块&#xff0c;两者之间没有明确界限&#xff0c;定义方式与定义模型一样_init_与forward。 1、先定义全…...

React 入门第一天:从Vue到React的初体验

作为一名合格的前端工程师&#xff0c;怎么能只会Vue呢&#xff1f;学习React不仅是一场新技术的探索&#xff0c;更是对前端开发思维的一次重新审视。在这里&#xff0c;我将分享学习React的心得&#xff0c;希望能帮助那些和我一样从Vue转向React的开发者。 1. 为什么选择Re…...

Golang | Leetcode Golang题解之第357题统计各位数字都不同的数字个数

题目&#xff1a; 题解&#xff1a; func countNumbersWithUniqueDigits(n int) int {if n 0 {return 1}if n 1 {return 10}ans, cur : 10, 9for i : 0; i < n-1; i {cur * 9 - ians cur}return ans }...

【Linux】 gdb-调试器初入门(简单版使用)

&#x1f525;系列文章&#xff1a;《Linux入门》 目录 一、背景 二、什么是GDB &#x1f337;定义 &#x1f337;GDB调试工具---提供的帮助 三、GDB的安装教程-Ubuntu &#x1f337;gdb的安装 四、哪类程序可被调试 &#x1f337;程序的发布方式 &#x1f337;Debug版…...

Spring 的事务支持

文章目录 1、Spring如何管理事务2、编程式事务1_基本用法2_创建TransactionTemplate实例3_TransactionTemplate的内部结构4_总结 3、声明式事务1_使用Transactional注解2_事务的传播行为3_配置4_总结 1、Spring如何管理事务 Spring为事务管理提供了一致的编程模板&#xff0c;…...

基于STM32开发的智能家居照明控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化传感器数据采集显示与控制逻辑Wi-Fi通信应用场景 家庭智能照明办公室节能照明控制常见问题及解决方案 常见问题解决方案结论 1. 引言 智能家居照明控制系统通过集成光照传感器、继…...

程序员的底层思维~张建飞

前言 ◆ 成人学习的目的不是获取更多的信息量&#xff0c;而是学习更好的思维模型。 ◆ 好的思维能力是可以被复制和迁移的&#xff0c;它应该是普适的&#xff0c;而不应该有行业的界限。 第一部分 基础思维能力 ◆ 因为语言的抽象性&#xff0c;我在团队中会要求大家使用通用…...

美股收涨,半导体板块领涨;苹果iPhone出货预测上调

市场概况 在昨夜的交易中&#xff0c;美股三大股指全线收涨。道琼斯工业平均指数上涨1.39%&#xff0c;纳斯达克综合指数上涨2.34%&#xff0c;标准普尔500指数上涨1.61%。值得注意的是&#xff0c;英伟达股票涨幅近4%&#xff0c;推动了科技股的整体表现。美国十年期国债收益…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...