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 EVENT My_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"
mysql -uroot -p123456 -e "source ./monitor_screen.sql"
mysql -uroot -p123456 -e "source ./monitor_screen_sync.sql"