文章背景:
由于我們一類節點目前還不支持開啟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 點執行命令
- 確保命令或腳本具有合適的執行權限。
- 要注意時間設置的準確性和合理性,避免設置過于頻繁或不合理的任務導致系統資源過度消耗
- 可以使用特殊字符來表示更靈活的時間安排,如
*(任意值)、,(列舉多個值)、-(范圍)、/(間隔)等。