1. 程式人生 > >mysql 資料庫Event定時任務使用詳解(Navicat 及直接SQL語句建立)

mysql 資料庫Event定時任務使用詳解(Navicat 及直接SQL語句建立)

一、使用Navicat建立Event 1、建立一個儲存過程讓定時任務Event呼叫: 開啟Navicat查詢介面: 在上述儲存過程中將自定義的sql語句填寫到BEGIN與END之間。 2、檢視並開啟event_scheduler排程事件: 再上圖查詢視窗執行檢視: show variables like '%sche%'; 注:如果event_scheduler值為OFF則使用set global event_scheduler =1;開啟。 3、建立Event排程任務: 儲存完畢,則在1中定義的儲存過程scheduler_sync()將會被每隔10秒執行一次!
二、使用純SQL語句建立定時任務Event。 1、進入到mysql ,並開啟event_schduler:
set global event_scheduler =1; show variables like '%event%';
2、進入wishstack建立儲存過程(本次測試資料庫為wishstack):
CREATE PROCEDURE sync_date_2_monitor() BEGIN /*--             下述加入自定義的mysql處理邏輯         --*/ /*-- ----------------------------
-- 先刪除  alert_msg 資料庫表資料 -- 再同步 alert_msg 更新相關資料 -- ----------------------------*/ DELETE FROM monitor_screen.alarm_msg; INSERT INTO monitor_screen.alarm_msg(id, alarm_id, resource_type, alarm_type, created_time, content, `level`) SELECT UUID() AS id,        id AS alarm_id,        "2" AS resource_type, 
        CASE alarm_type             WHEN "state" THEN "狀態告警"         END AS "alarm_type",         created_time,         description AS content,         CASE `level`             WHEN "general" THEN "1"             WHEN "serious" THEN "2"             WHEN "general" THEN "3"         END AS "level" FROM alarm; /*-- ---------------------------- -- 先刪除 overall_statistic 資料庫表資料 -- 再同步 overall_statistic 更新相關資料 -- ----------------------------*/ DELETE FROM monitor_screen.overall_statistic; INSERT INTO monitor_screen.overall_statistic(id, user_num_online, user_num_all, tenant_num, business_num, vm_num) select a.id, b.user_num_online, c.user_num_all, d.tenant_num, e.business_num, f.vm_num FROM (SELECT UUID() AS id) AS a join (SELECT COUNT(id) AS user_num_online from `user` WHERE login_state=0 AND deleted=0) AS b join (SELECT COUNT(id) AS user_num_all from `user` WHERE deleted=0) AS c join (SELECT COUNT(id) AS tenant_num FROM `tenant`  WHERE deleted=0 ) AS d join (SELECT COUNT(id) AS business_num FROM `business`  WHERE deleted=0 ) AS e join (SELECT COUNT(id) AS vm_num FROM `instance`  WHERE deleted=0 ) AS f ; /*-- ---------------------------- -- 先刪除 tenant_res_spnd_t5 資料庫表資料 -- 再同步 tenant_res_spnd_t5 更新相關資料 -- ----------------------------*/ DELETE FROM monitor_screen.tenant_res_spnd_t5; INSERT INTO monitor_screen.tenant_res_spnd_t5 SELECT UUID() AS id,tenant.`name` AS tenant_name, vm_num      FROM (             (SELECT tenant_id, COUNT(id) AS vm_num FROM instance WHERE instance.deleted != 1 GROUP BY tenant_id) AS a                      LEFT JOIN               tenant                      ON a.tenant_id=tenant.id AND tenant.deleted != 1           ); /*-- ---------------------------- -- 先刪除 resource_spending 資料庫表資料 -- 再同步 resource_spending 更新相關資料 -- ----------------------------*/ DELETE FROM monitor_screen.resource_spending; INSERT INTO monitor_screen.resource_spending(id, created_time, `hour`, cpu_use_ratio, memory_use_ratio)  SELECT   UUID() AS id,                  created_time,                   date_format(created_time, '%H') AS `hour`,                  AVG(cpu_rate) AS cpu_use_ratio,                  AVG(memory_rate) AS memory_use_ratio                 FROM instance                 GROUP BY date_format(created_time, '%Y-%m-%d %H'); /*-- ---------------------------- -- 先刪除 cloud_tenant 資料庫表資料 -- 再同步 cloud_tenant 更新相關資料 -- ----------------------------*/ DELETE FROM monitor_screen.cloud_tenant; INSERT INTO monitor_screen.cloud_tenant SELECT  UUID() AS id, tenant.`id` AS tenant_id,  tenant.`name` AS tenant_name, NULL AS lon, NULL AS lat, COUNT(DISTINCT CASE WHEN `user`.login_state = 0 AND `user`.deleted != 1 THEN `user`.id END) AS online_user_num, COUNT(DISTINCT CASE WHEN instance.`status` = 'active' AND instance.deleted != 1 THEN instance.id END) AS online_vm_num, COUNT(DISTINCT CASE WHEN `user`.deleted != 1 THEN `user`.id END) AS user_num, COUNT(DISTINCT CASE WHEN `business`.deleted != 1 THEN business.id END) AS business_num, COUNT(DISTINCT CASE WHEN instance.deleted != 1 THEN instance.id END) AS vm_num, COUNT(DISTINCT CASE WHEN alarm.`status` != 'fix' THEN alarm.id END) AS sec_alarm_num, AVG( instance.cpu_rate) AS vcpu_use_ratio, AVG( instance.memory_rate) AS memory_use_ratio FROM  tenant LEFT JOIN tenant_user ON tenant_user.tenant_id = tenant.id              LEFT JOIN `user` ON tenant_user.user_id = `user`.id              LEFT JOIN business ON  business.tenant_id = tenant.id              LEFT JOIN alarm ON alarm.tenant_uuid = tenant.uuid             LEFT JOIN instance ON instance.tenant_id = tenant.id GROUP BY tenant.id; /*-- ---------------------------- -- 先刪除 data_center 資料庫表資料 -- 再同步 data_center 更新相關資料 -- ----------------------------*/ DELETE FROM monitor_screen.data_center; INSERT INTO monitor_screen.data_center SELECT  UUID() AS id, provider.id AS provider_id, provider.`name` AS provider_name, NULL AS lon, NULL AS lat, COUNT(DISTINCT virtual_server.id) AS computing_server_num, COUNT(DISTINCT storage_device.id) AS storage_server_num, COUNT(DISTINCT network_device.id) AS net_server_num, COUNT(DISTINCT instance.id) AS visual_machine_num, SUM(flavor.vcpus) AS visual_cpu_num, SUM(flavor.memory_mb) AS visual_memory_capacity, SUM(flavor.disk) AS visual_disc_capacity FROM  provider LEFT JOIN virtual_server ON provider.id  = virtual_server.provider_id             LEFT JOIN storage_device ON provider.id  = storage_device.provider_id             LEFT JOIN network_device ON provider.id  = network_device.provider_id             LEFT JOIN instance ON provider.id  = instance.provider_id             LEFT JOIN flavor ON instance.flavor_uuid  = flavor.uuid             LEFT JOIN physical_resource ON provider.id  = physical_resource.provider_id                  GROUP BY provider.id; /*-- ---------------------------- -- 先刪除 link 資料庫表資料 -- 再同步 link 更新相關資料 -- ----------------------------*/ DELETE FROM monitor_screen.link; INSERT INTO monitor_screen.link SELECT  UUID() AS id, tenant_id,  provider_id FROM tenant_provider; /*-- ---------------------------- -- 先刪除 vm_resource_statistic 資料庫表資料 -- 再同步 vm_resource_statistic 更新相關資料 -- ----------------------------*/ DELETE FROM monitor_screen.vm_resource_statistic; INSERT INTO monitor_screen.vm_resource_statistic SELECT  UUID() AS id, SUM(vcpu_used) AS `assigned_vcpu_num`, SUM(memory_used) AS `assigned_vmemory_capacity`, SUM(storage_used) AS `assigned_vdisc_capacity`, SUM(memory) AS `vmemory_capacity`, SUM(`storage`) AS `vdisk_capacity` FROM physical_resource; END
上述綠色內容請填入相應的儲存過程邏輯程式碼!!! 3、測試當前儲存過程是否正確(沒有報錯則說明儲存過程建立成功): 4、建立Event事件:
CREATE EVENT `My_Sync_Event`   /*-- Event事件名稱 --*/ ON SCHEDULE EVERY 10 SECOND  /*--每隔10秒排程一次--*/ ON COMPLETION  PRESERVE  /*--當本次event到期了,event會被disable,但是該event還是會存在--*/ ENABLE /*--開啟Event排程--*/ DO CALL scheduler_sync(); /*--排程任務呼叫上述建立的儲存過程,週期執行任務--*/
5、對於Event的常用操作: 檢視:SHOW EVENTS; 開啟事件: ALTER EVENT My_Sync_EventON COMPLETION PRESERVE ENABLE;
關閉事件: ALTER EVENTMy_Sync_EventON COMPLETION PRESERVE DISABLE;
刪除事件:DROP EVENT IF EXISTS my_scheduler_event; 也可以在linux下用指令碼實現: #//usr/bin/sh
mysql -uroot -p123456 -e "source ./monitor_screen.sql"
mysql -uroot -p123456 -e "source ./monitor_screen_sync.sql"