调度器组件是 MySQL Enterprise Edition 的一部分,属于商业产品。要了解更多关于商业产品的信息,请参阅 https://www.mysql.com/products/。
调度器组件提供了一个实现 mysql_scheduler
服务的实现,该服务使应用程序、组件或插件能够每 N
秒配置、运行和卸载任务。例如,audit_log 服务器插件在其初始化时调用调度器组件,并配置了其内存缓存的定期刷新(参阅 启用审核日志刷新任务)。
-
目的:实现
component_scheduler.enabled
系统变量,该变量控制调度器是否活动执行任务。在启动时,调度器组件注册了performance_schema.component_scheduler_tasks
表,该表列出了当前计划的任务和每个任务的一些运行时数据。 -
URN:
file://component_sheduler
有关安装说明,请参阅 第 7.5.1 节,“安装和卸载组件”。
调度器组件使用以下元素实现服务:
-
一个优先级队列,包含已注册的、非活动的计划任务,按下一次运行时间排序(升序)。
-
一个列表,包含已注册的活动任务。
-
一个后台线程:
-
如果没有任务或顶部任务需要更多时间来运行,则休眠。它周期性地醒来检查是否到了结束时间。
-
编译一个需要运行的任务列表,将它们从非活动队列中移出,添加到活动队列中,并单独执行每个任务。
-
执行任务列表后,删除活动列表中的任务,添加到非活动列表中,并计算下一次需要运行的时间。
-
当调用者调用 mysql_scheduler.create()
服务时,它创建一个新的计划任务实例,以添加到队列中,并信号后台线程的信号量。调用者将收到新任务的句柄,并将其保留到调用 mysql_scheduler.destroy()
服务时。调用者调用 destroy()
并传递从 create()
中收到的句柄时,服务将等待任务变为非活动(如果正在运行),然后从非活动队列中删除它。
组件服务按时间顺序调用每个应用程序提供的回调函数(函数指针),一次一个,基于每个任务需要的运行时间。
开发者如果想将调度器队列功能集成到应用程序、组件或插件中,应该查看 MySQL 源代码分布中的 mysql_scheduler.h
文件。