MySQL事件调度器
MySQL5.1.6版的一项新功能是添加了事件。这些可以是单个事件也可以是时间表,可以为两者都指定多个要运行的命令。
首先,您需要确保事件调度程序正在运行。为此,请打开MySQL查询浏览器(或类似的浏览器)并运行以下MySQL命令。
SHOWPROCESSLIST;
如果事件调度程序,您将在输出中看到如下所示的行:
Id, User, Host, db, Command, Time, State, Info 120, 'event_scheduler', 'localhost', '', 'Daemon', 242, 'Waiting on empty queue', ''
打开和关闭事件计划程序非常简单,可以作为MySQL命令或启动服务器时的参数甚至在ini文件中完成。要将调度程序作为MySQL命令打开,请运行以下命令:
SETGLOBALevent_scheduler=ON;
相反,要关闭它,请运行以下命令:
SETGLOBALevent_scheduler=OFF;
要在启动MySQL服务器时将其关闭,请使用以下参数。将DISABLED与ENABLED交换以将其打开。
--event-scheduler=DISABLED
要在ini文件中将其关闭,请使用以下命令。将DISABLED与ENABLED交换以将其打开。
event_scheduler=DISABLED
对于控制事件调度程序的所有实例,您也可以使用0来关闭它,使用1来打开它,而不是DISABLED和ENABLED。如果这对您不起作用,请尝试使用“开”和“关”作为值。您可以在调度程序关闭时添加和更改事件,但是只有在启用调度程序后,事件才会运行。
要创建事件,您需要使用CREATEEVENT命令。首先创建一个事件,该事件在将来的指定时间向测试数据库中名为test的表中添加一行。该事件称为addTimestamp,插入数据的命令在DO命令之后。这不必放在单独的行上,但是它看起来更好,并且在您开始添加多个命令时会很有意义。
CREATE EVENT addTimestamp ON SCHEDULE AT '2009-03-30 10:20:00' DO INSERT INTO test.test(TIMESTAMP) VALUES (UNIX_TIMESTAMP());
如果您过去创建过一个事件,则会收到以下消息。
EventexecutiontimeisinthepastandONCOMPLETIONNOTPRESERVEisset.Theeventwasdroppedimmediatelyaftercreation.
请注意,这不会运行您的命令,MySQL只会丢弃您的事件而不执行任何操作。ONCOMPLETIONNOTPRESERVE设置告诉MySQL在事件运行时保存事件,或在事件完成后将其丢弃。要在事件运行后保存事件,请在ONSCHEDULE行下面添加以下行。
ONCOMPLETIONPRESERVE
如果设置了该选项并尝试创建另一个具有相同名称的事件,则即使该旧名称是过去的名称,也将显示一条错误消息,指出该名称已存在。
要插入多个MySQL命令,您需要使用BEGIN和END命令。以下命令建立在上一个示例的基础上,但这次表被截断(清除)并添加了新的时间戳。
delimiter | CREATE EVENT addTimestamp ON SCHEDULE AT '2009-03-30 10:28:00' DO BEGIN TRUNCATE TABLE test.test; INSERT INTO test.test(TIMESTAMP) VALUES (UNIX_TIMESTAMP()); END | delimiter ;
分隔符标记告诉MySQL将BEGIN和END之间的整个块传递给服务器,然后将其重置为默认值并分别解析每个MySQL命令。
如果您想在一个小时内运行事件,并且不想被时间所束缚,那么请更改ONSCHEDULE行以读取以下内容:
ONSCHEDULEATCURRENT_TIMESTAMP+INTERVAL1HOUR
很容易看到如何在此处更改时间间隔的值,因此我将其留给读者练习。
要创建一个每小时发生一次的事件,您需要稍微更改命令的语法。而不是给SCHEDULE命令一个时间或将来的间隔,而是使用EVERY命令。
delimiter | CREATE EVENT addTimestamp ON SCHEDULE EVERY 1 HOUR DO BEGIN TRUNCATE TABLE test.test; INSERT INTO test.test(TIMESTAMP) VALUES (UNIX_TIMESTAMP()); END | delimiter ;
通过限制执行窗口,可以采取进一步的措施。假设我们要在接下来的5个小时中每小时运行一个命令或一组命令。以下命令将添加到ONSCHEDULE命令中。
EVERY 1 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR ENDS CURRENT_TIMESTAMP + INTERVAL 5 HOUR
这将导致命令总共运行5次。
如果您想知道当前正在运行什么事件或计划,请运行MySQL命令SHOWEVENTS,这将为您提供一个充满信息的表。该表还将包含过去的所有事件,但已在其创建中添加了ONCOMPLETIONPRESERVE设置。
要删除事件,您需要运行DROPEVENT命令,后跟您创建的事件的名称。
DROPEVENTaddTimestamp;
有关使用CREATEEVENT语法的更多信息,请参见主题的MySQL手册页。事件调度程序上还有更多信息可用。