`

MySql中的事件

阅读更多
一、前言
自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。
事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的,区别也就在这里。
在使用这个功能之前必须确保event_scheduler已开启,可执行

SET GLOBAL event_scheduler = 1;
---或我们可以在配置my.ini文件 中加上 event_scheduler = 1



SET GLOBAL event_scheduler = ON;

来开启,也可以直接在启动命令加上“–event_scheduler=1”,例如:

mysqld ... --event_scheduler=1

要查看当前是否已开启事件调度器,可执行如下SQL:

SHOW VARIABLES LIKE 'event_scheduler';



SELECT @@event_scheduler;



SHOW PROCESSLIST;

二、创建事件(CREATE EVENT)
先来看一下它的语法:

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

1) 首先来看一个简单的例子来演示每秒插入一条记录到数据表

USE test;
CREATE TABLE aaa (timeline TIMESTAMP);
CREATE EVENT e_test_insert
ON SCHEDULE EVERY 1 SECOND
DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);

等待3秒钟后,再执行查询看看:

mysql> SELECT * FROM aaa;
+---------------------+
| timeline |
+---------------------+
| 2007-07-18 20:44:26 |
| 2007-07-18 20:44:27 |
| 2007-07-18 20:44:28 |
+---------------------+

2) 5天后清空test表:

CREATE EVENT e_test
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;

3) 2007年7月20日12点整清空test表:

CREATE EVENT e_test
ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'
DO TRUNCATE TABLE test.aaa;

4) 每天定时清空test表:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
DO TRUNCATE TABLE test.aaa;

5) 5天后开启每天定时清空test表:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;

6) 每天定时清空test表,5天后停止执行:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;

7) 5天后开启每天定时清空test表,一个月后停止执行:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
DO TRUNCATE TABLE test.aaa;

[ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。
8) 每天定时清空test表(只执行一次,任务完成后就终止该事件):

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ON COMPLETION NOT PRESERVE
DO TRUNCATE TABLE test.aaa;

[ENABLE | DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为ENABLE。
[COMMENT ‘comment’]可以给该事件加上注释。
三、修改事件(ALTER EVENT)

ALTER EVENT event_name
[ON SCHEDULE schedule]
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[COMMENT 'comment']
[ENABLE | DISABLE]
[DO sql_statement]

1) 临时关闭事件

ALTER EVENT e_test DISABLE;

2) 开启事件

ALTER EVENT e_test ENABLE;

3) 将每天清空test表改为5天清空一次:

ALTER EVENT e_test
四、删除事件(DROP EVENT)
语法很简单,如下所示:

DROP EVENT [IF EXISTS] event_name

例如删除前面创建的e_test事件

DROP EVENT e_test;

当然前提是这个事件存在,否则会产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS

DROP EVENT IF EXISTS e_test;
注意:如果你将event执行了Alter event event_name disable.那么当你重新启动mysql服务
器后,该event将被删除(测试版本:5.1.30)
应用案例
本案例是利用 event scheduler 的特性,每秒钟调用一次存储过程,用于判断 SLAVE 是否正常运行,如果发现 SLAVE 关闭了,忽略 0 次错误,然后重新启动 SLAVE。

    首先创建存储过程

    delimiter //
     create procedure `Slave_Monitor`()
     begin
     SELECT VARIABLE_VALUE INTO @SLAVE_STATUS
     FROM information_schema.GLOBAL_STATUS
     WHERE VARIABLE_NAME='SLAVE_RUNNING';
     IF ('ON' != @SLAVE_STATUS) THEN
     SET GLOBAL SQL_SLAVE_SKIP_COUNTER=0;
     SLAVE START;
     END IF;
     end; //
     delimiter ;

    由于存储过程中无法调用类似 SHOW SLAVE STATUS 这样的语句,因此无法得到确切的复制错误信息和错误代码,不能进一步的处理 SLAVE 停止的各种情况。
    接着,创建任务

    CREATE EVENT IF NOT EXISTS `Slave_Monitor`
     ON SCHEDULE EVERY 5 SECOND
     ON COMPLETION PRESERVE
     DO
     CALL Slave_Monitor();
    

    创建了一个任务,每 5秒钟执行一次,任务结束后依旧保留该任务,而不是删除。当然了,在本例中的任务不会结束,除非将它手动禁止了。
    如果在运行中想要临时关闭一下某个任务,执行 ALTER EVENT 语句即可:

     (root:localhost:)test> alter event `Slave_Monitor` ON
     COMPLETION PRESERVE DISABLE;
     (root:localhost:)test> alter event `Slave_Monitor` ON
     COMPLETION PRESERVE ENABLE;
分享到:
评论

相关推荐

    MySQL中文参考手册

    9. **触发器与存储过程**:MySQL支持定义触发器以在特定事件(如INSERT、UPDATE或DELETE)后自动执行操作,以及创建存储过程来封装复杂的业务逻辑。 10. **视图**:视图是虚拟表,基于一个或多个表的查询结果。学习...

    mysql-事件,触发器,事务-实验七.docx

    MySQL 事件调度器是 MySQL 中的一种机制,可以根据指定的时间间隔执行特定的 SQL 语句。事件调度器有两个优点:一是可以用于定期统计、清理、检查等操作;二是可以提高数据库的自动性和可靠性。但是,事件调度器也...

    MySQL_5.1_zh.rar_MYSQL_MySQL_5.1_zh_mysql 中文

    6. **事件调度器**:MySQL 5.1 引入了事件调度器,允许用户定时执行特定任务,比如定期备份或清理过期数据。 7. **性能监视和优化**:MySQL 5.1 提供了更强大的性能分析工具,如 Performance Schema,用于监控...

    [数据库] Navicat for MySQL事件Event实现数据每日定期操作1

    【数据库】Navicat for MySQL事件(Event)是MySQL数据库中的一种功能,用于实现定期自动执行的任务,类似于操作系统中的计划任务。在上述情境中,Event主要应用于数据的日常管理,包括定时备份、数据清理以及状态更新...

    mysql中event事件使用详解.docx

    在这个例子中,`student_bak_event`是事件名称,设置在当前时间+1天的时间点执行(即每天凌晨),事件完成后保留,事件开启,并且添加了一个注释说明其功能。`DO BEGIN...END`之间是事件执行的主体,这里调用了存储...

    MySQL 8 中文参考手册.zip chm格式,中英文对照

    手册中包含的中英文对照内容,对于学习和理解MySQL 8的各种概念、语法和操作提供了极大的便利。无论是初学者还是经验丰富的开发者,都可以从中受益匪浅。以下是手册可能涵盖的一些关键知识点: 1. **安装与配置**:...

    mysql中文帮助文档

    2. **数据库和表的创建与管理**:在MySQL中,可以创建、修改和删除数据库。创建表时,需要定义字段、数据类型、主键等元素。文档会指导如何进行这些操作,并解释各种数据类型的特点。 3. **索引与查询优化**:索引...

    MySQL 5.1中文手冊

    2.7. 在其它类Unix系统中安装MySQL 2.8. 使用源码分发版安装MySQL 2.8.1. 源码安装概述 2.8.2. 典型配置选项 2.8.3. 从开发源码树安装 2.8.4. 处理MySQL编译问题 2.8.5. MIT-pthreads注意事项 2.8.6. 在Windows下从...

    MySQL_4.1.0 中文参考手册.chm MySQL 4.1.0 中文参考手册

    MySQL 4.1.0 中文参考手册是MySQL数据库开发者不可或缺的重要参考资料,它详细阐述了在MySQL 4.1.0版本中所包含的各种特性和功能。MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),以其高效、稳定和易用性...

    mysql触发器之创建多个触发器操作实例分析

    在mysql 5.7.2+版本之前,我们只能为表中的事件创建一个触发器,例如,只能为BEFORE UPDATE或AFTER UPDATE事件创建一个触发器。 mysql 5.7.2+版本解决了这样限制,并允许我们为表中的相同事件和动作时间创建多个...

    MySQL中文参考手册HTML

    8. **触发器与事件**:讲解触发器的定义和应用,以及如何设置定时执行的事件。 9. **视图与游标**:说明视图的概念,用于简化复杂查询和提供数据安全,以及游标的使用,用于迭代处理查询结果集。 10. **事务处理**...

    Navicat for MySQL(绿色简体中文)

    它可以用于任何版本 3.21 或以上的MySQL 数据库服务器,并支持大部份MySQL最新版本的功能,包括触发器、存储过程、函数、事件、视图、管理用户等。 Navicat 的功能足以符合专业开发人员的所有需求,但是对MySQL 的...

    MySQl中文培训手册

    本手册将向你介绍视图、存储过程、触发器、事件调度器等高级特性,以及它们在实际应用中的作用和优势。 在MySQL与其他技术的集成部分,本手册将重点介绍MySQL与PHP、Python等主流编程语言的集成,以及MySQL在Web...

    MySql 中文帮助手册

    通过阅读这份“MySQL中文帮助手册”,你可以全面了解MySQL的功能,掌握数据库设计、管理和维护的技巧,从而在实际工作中更加得心应手。对于每个主题,手册都可能提供实例演示和详细解释,帮助读者更好地理解和应用。...

    MySql MySql使用方法 Mysql例子

    在本文中,我们将深入探讨MySQL的使用方法,通过具体的例子来帮助你理解和掌握其核心概念。 1. 安装与配置MySQL 在开始使用MySQL之前,你需要在你的操作系统上安装MySQL服务器。这通常可以通过下载并运行安装程序...

    mysql使用实例book-MySQL

    通过对本书的学习,你可以深入了解MySQL在实际工作中的应用,提升数据库管理、查询优化以及数据存储的能力。 首先,我们要理解MySQL的核心概念。MySQL是一种关系型数据库管理系统(RDBMS),它支持SQL语言,广泛...

    MySQL OCP进阶 题库中文版包含答案.pdf

    2. **键缓存(Key Buffer)**:这是MySQL中用于提高性能的特性,问题2中提到,键缓存仅缓存MyISAM表的索引块,并且是一个全局缓冲区。这意味着所有连接都可以共享这个缓存,而不是每个连接有自己的键缓存。InnoDB...

    2021年MySQL高级教程视频.rar

    02.MySQL高级Linux上安装MySQL.avi 03.MySQL高级启动及登录MySQL.avi 04.MySQL高级索引概述.avi 05.MySQL高级索引优势和劣势.avi 06.MySQL高级索引数据结构.avi 07.MySQL高级索引数据结构BTREE.avi 08.MySQL高级索引...

    MySQL_5.5中文参考手册.pdf

    * MySQL 的发展历程和重要事件 MySQL 信息源 * MySQL 邮件列表和 IRC 社区支持 * MySQL 论坛和社区支持 MySQL 标准的兼容性 * MySQL 遵从的标准是什么 * 选择 SQL 模式和 ANSI 模式 * MySQL 对标准 SQL 的扩展和...

Global site tag (gtag.js) - Google Analytics