MySQL 定時任務,解放雙手,輕鬆實現自動化

1 概念

Mysql 事件是一種在特定時間點自動執行的數據庫操作,也可以稱呼爲定時任務,它可以自動執行更新數據、插入數據、刪除數據等操作,無需人工干預。

優勢:

常見的應用場景有定時備份數據庫,清理和統計數據。

2 常見操作

事件調度器操作

查看事件調度器是否開啓:ON 表示已開啓。

show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+

開啓和關閉事件調度器:

# 開啓事件調度器
set global event_scheduler = ON;
# 關閉事件調度器
set global event_scheduler = OFF;

更改配置文件:進入 my.ini 文件修改,重啓 Mysql 服務器,永久生效。

# 事件調度器啓動狀態
event_scheduler = on
查看事件

使用 show 或者 select 語句查看當前數據庫中所有的事件。

show events;
select * from information_schema.events;
創建事件

使用 create event 語句創建一個事件,

基本語法:

create
    [definer = user]
    event
    [if not exists]
    event_name
    on schedule schedule_body
    [on completion [not] preserve]
    [enable | disable | disable on slave]
    [comment 'comment']
    do event_body;

schedule_body 語法:

at timestamp [+ interval interval] ...
    | every interval
        [starts timestamp [+ interval interval] ...]
        [ends timestamp [+ interval interval] ...]

at timestamp:用於一次性活動,指定事件僅在 timestamp 給出的日期和時間執行一次,時間戳必須同時包含日期和時間,或者必須是解析爲日期時間值的表達式,如果日期已過,則會出現警告。

# 相當於“三週兩天後”。此類子句的每個部分必須以+ interval。
at current_timestamp + interval 3 week + interval 2 day

interval 語法:

interval:
    quantity {year | quarter | month | day | hour | minute |
              week | second | year_month | day_hour | day_minute |
              day_second | hour_minute | hour_second | minute_second}

常見時間調度:

# 每30分鐘執行一次
on schedule every 30 minute
# 從 2024-01-03 18:00:00 開始,每1小時執行一次
on schedule every 1 hour
  starts '2024-01-03 18:00:00'
# 從現在起30分鐘後開始,四周後結束,這段期間內每12小時執行一次
on schedule every 12 hour 
    starts current_timestamp + interval 30 minute 
    ends current_timestamp + interval 4 week
刪除事件

使用 drop event 語句刪除該事件。

drop event [if exists] event_name;
啓動與關閉事件

使用 alter event 語句對事件進行修改。

# 啓動事件
alter event event_name enable;
# 關閉事件
alter event event_name disable;

3 精選示例

構造實時數據

需求:每分鐘錄入關於產品、省份的訂單銷售數據。

# 表新建
drop table if exists sql_test1.face_sales_data;
create table if not exists sql_test1.face_sales_data
(
    sales_date date comment '銷售日期',
    order_code varchar(255) comment '訂單編碼',
    user_code varchar(255) comment '客戶編號',
    product_name varchar(255) comment '產品名稱',
    sales_province varchar(255) comment '銷售省份',
    sales_number int comment '銷量',
    create_time datetime default current_timestamp comment '創建時間',
    update_time datetime default current_timestamp on update current_timestamp comment '更新時間'
);
# 創建事件任務,多條語句用 begin ... end; 包住。
drop event if exists face_sales_data_task1;
create event if not exists face_sales_data_task1
on schedule every 1 minute
starts '2024-01-03 21:17:00'
on completion preserve enable
do
begin
    set @user_code = floor(rand()*900000000 + 100000000);-- 隨機生成用戶編碼,
    set @order_code = md5(floor(rand()*900000000 + 100000000));-- 根據隨機用戶編碼加密成編碼
    set @product_name = ELT(CEILING(RAND() * 8) ,'iPhone 15','iPhone 15 Pro','iPhone 15 Pro Max','Xiaomi 14','Xiaomi 14 Pro','Huawei Mate 60','Huawei Mate 60 Pro','Huawei Mate 60 Pro+');-- 隨機從中選擇產品
    set @sales_province = ELT(CEILING(RAND() * 34) ,'河北省','山西省','遼寧省','吉林省','黑龍江省','江蘇省','浙江省','安徽省','福建省','江西省','山東省','河南省','湖北省','湖南省','廣東省','海南省','四川省','貴州省','雲南省','陝西省','甘肅省','青海省','臺灣省','內蒙古自治區','廣西壯族自治區','西藏自治區','寧夏回族自治區','新疆維吾爾自治區','北京市','上海市','天津市','重慶市','香港特別行政區','澳門特別行政區');
    set @sales_number = floor(rand()*1000);-- 隨機生成銷量
    select @user_code,@order_code,@product_name,@sales_province,@sales_number;-- 查看生成的數據
    insert into sql_test1.face_sales_data(sales_date, order_code, user_code, product_name, sales_province, sales_number)
    values (curdate(),@order_code,@user_code,@product_name,@sales_province,@sales_number);-- 數據錄入
end;
select * from sql_test1.face_sales_data;

通過創建事件後,過一段時間再一次查看錶,可以發現每條記錄 create_time 相差 1,說明任務調度設置成功,這樣就可以自動模擬實時銷售數據啦。

如果要停止錄入,可以執行以下代碼關閉事件。

alter event face_sales_data_task1 disable;
定時統計數據

除了能模擬實時數據操作數據表外,也可以執行存儲過程統計數據。

drop event if exists get_table_info1_task1;
create event if not exists get_table_info1_task1
    on schedule every 10 minute 
    starts current_timestamp 
    ends current_timestamp + interval 1 week
    on completion preserve enable
    do call get_table_info1();
# 下線
alter event get_table_info1_task1 disable;

4 總結

創建事件或定時任務可以解決很多重複性工作,配合着動態 sql 和存儲過程能起到實時更新數據功能,不需要人工干預,提高了工作效率,讓我們有更多的時間學習和處理其它問題。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/IyXebZ1han7HmMMqxtsbTQ