文章背景:
由于我们一类节点目前还不支持开启event_scheduler功能,而客户业务上又有这方面需求,所以我们需要用其他工具来代替这个功能。
一、为什么不支持?
相关说明:
A、每个节点实例,存在event_scheduler定时任务大开关;
B、每个event事件都有启用状态,比如enabled、slaveside_disabled、disabled;
所有的event事件,创建成功后的状态是:
A、主库是enabled(即主库启用)
B、从库是slaveside_disabled(即从库禁用)
切换后,event事件状态是:
A、主库slaveside_disabled(实际上是禁用)
B、从库enabled(从库只读,read_only=1, 以普通用户执行该事件会报错,以super权限用户强行运行 也是从库产生事务,数据不一致、且相关数据不会同步到主库)
基于以上基础,
1、主库的slaveside_disabled状态的小事件需要用户自行改为enabled才能正常运行;
2、高可用组件无法做到“切换后 自动将主库的所有event事件修改为enabled”,因为可能存在客户自行定义的slaveside_disabled、disabled禁用状态的事件,全部修改为enabled是不合理的动作。
总结:如果开启event_scheduler,高可用实例无法保证 event_scheduler始终在主节点运行,因为会存在高可用切换。
二、使用Crontab代替Event来定期执行SQL语句
操作步骤如下:
1.创建一个包含要执行的 MySQL 命令的脚本,例如 mysql_task.sh
,脚本内容类似这样:
#!/bin/bash
mysql -u [username] -p[password] [database] -e "your mysql command here"
确保将 [username]
、[password]
和 [database]
替换为实际的数据库用户名、密码和数据库名,以及将 "your mysql command here"
替换为具体的 MySQL 命令。
2.给脚本添加执行权限:
chmod +x mysql_task.sh
3.使用 crontab -e 编辑定时任务,添加类似这样的一行来指定定期执行该脚本:
* * * * * /path/to/mysql_task.sh
/path/to/mysql_task.sh
替换为实际脚本的路径)。例如,如果你想每天凌晨 2 点执行这个脚本,可以这样写:0 2 * * * /path/to/mysql_task.sh
4.Crontab命令说明:
Crontab 是用于在 Linux 系统中设置定时任务的命令,他的主要功能有创建、编辑、查看和删除定时任务列表。以下是对它的详细介绍:
常用操作:
crontab -e
:打开编辑器以编辑当前用户的定时任务列表crontab -l
:列出当前用户的所有定时任务crontab -r
:删除当前用户的所有定时任务
定时任务格式:
- 在分钟字段(第一个 *)表示每分钟,分钟(0-59)
- 在小时字段(第二个 *)表示每小时,小时(0-23)
- 在日字段(第三个 *)表示每一天,日(1-31)
- 在月字段(第四个 *)表示每个月,月(1-12)
- 在星期字段(第五个 *)表示每星期,周(0-6,0 表示星期日)
- * * * * * command 就表示该命令每分钟都执行。再比如 0 * * * * command 表示每小时的第 0 分钟(即整点)执行命令
- 30 2 * * * /path/to/script.sh:表示每天凌晨 2 点 30 分执行指定脚本
- 0 8 1 * * /path/to/command:表示每月 1 日上午 8 点执行命令
- 确保命令或脚本具有合适的执行权限。
- 要注意时间设置的准确性和合理性,避免设置过于频繁或不合理的任务导致系统资源过度消耗
- 可以使用特殊字符来表示更灵活的时间安排,如
*
(任意值)、,
(列举多个值)、-
(范围)、/
(间隔)等。