Mysql存儲過程歷史表備份


應用背景

SCADA采集系統需要將實時數據存入歷史表。問題1:如何更簡單的添加歷史數據?2.海量歷史數據,比如年數據,如何快速篩選 畫曲線?

  1. 利用mysql的事件,每小時存一次采集數據;
  2. 每月備份歷史表,並且將原表清空。每個月1號凌晨1點,將歷史表備份,名稱命名為his_aic_20190501 01:00,將原表清空。

1.歷史表備份

1.1存儲過程

BEGIN
INSERT INTO his_dic (ParentID,PointID,DICName,DICValue,StateDesc,AlarmThreshold,AlarmLevel,AlarmEnable,UpdatedTime)
select ParentID,PointID,DICName,DICValue,StateDesc,AlarmThreshold,AlarmLevel,AlarmEnable,UpdatedTime
FROM dic on duplicate key update
ParentID=VALUES( ParentID),PointID=VALUES(PointID ),DICName=VALUES(DICName ),DICValue=VALUES(DICValue ),StateDesc=VALUES(StateDesc ),AlarmThreshold=VALUES( AlarmThreshold),AlarmLevel=VALUES(AlarmLevel ),AlarmEnable=VALUES( AlarmEnable),UpdatedTime=VALUES(UpdatedTime );


INSERT INTO his_doc (ParentID,PointID,DOCName,DetectDOStatus,DOCValue,StateDesc,ControlEnable,UpdatedTime)
SELECT ParentID,PointID,DOCName,DetectDOStatus,DOCValue,StateDesc,ControlEnable,UpdatedTime
FROM doc on duplicate key update
ParentID=VALUES(ParentID ),PointID=VALUES(PointID ),DOCName=VALUES(DOCName ),DetectDOStatus=VALUES( DetectDOStatus),DOCValue=VALUES(DOCValue ),StateDesc=VALUES(StateDesc ),ControlEnable=VALUES( ControlEnable),UpdatedTime=VALUES(UpdatedTime );


INSERT INTO his_aic (ParentID,PointID,AICName,AICValue,Unit,sAICValue,MaxAICValue,MinAICValue,`Enable`,UpdatedTime)
SELECT ParentID,PointID,AICName,AICValue,Unit,sAICValue,MaxAICValue,MinAICValue,`Enable`,UpdatedTime
FROM aic on duplicate key update
ParentID=VALUES(ParentID ),PointID=VALUES(PointID ),AICName=VALUES(AICName ),AICValue=VALUES( AICValue),Unit=VALUES(Unit ),sAICValue=VALUES(sAICValue ),MaxAICValue=VALUES(MaxAICValue ),MinAICValue=VALUES(MinAICValue ),`Enable`=VALUES( `Enable`),UpdatedTime=VALUES(UpdatedTime);

END

1.2使用說明

步驟1 使用navicat工具管理Mysql,函數右鍵新建函數,在跳出得向導框選擇過程,點擊下一步。

步驟2 這里不需要任何操作,直接點擊完成,因為沒有參數傳入傳出。

步驟3 將上面的存儲過程代碼復制進如下圖框,點擊運行即可。

步驟4點擊保存,輸入名稱。

結果運行結果如下。

2.創建每隔一小時保存歷史數據任務

2.1 建立事件任務event_To_His:

CREATE EVENT if not exists event_To_His
          on schedule every 1 hour 
          on completion preserve 
 do call  To_His();

2.2 使用說明

步驟1選擇自己的數據,點擊右鍵,選擇cmd模式輸入。

步驟2將以上代碼拷貝運行即可。

結果運行結果如下。

備注
如果報錯查看event是否開啟: show variables like '%sche%';

將事件計划開啟: set global event_scheduler=1;

關閉事件任務: alter event e_test ON COMPLETION PRESERVE DISABLE;

開戶事件任務: alter event e_test ON COMPLETION PRESERVE ENABLE;

3.歷史表按月備份

3.1存儲過程

BEGIN
	
create table his_aic_temp like his_aic;
set @i=now();
set @sqlstr=CONCAT('rename table his_aic to `his_aic_',cast(@i as char),'`');
select @sqlstr;
PREPARE renameHisBak FROM @sqlstr;
EXECUTE renameHisBak;
rename table his_aic_temp to his_aic;

create table his_dic_temp like his_dic;
set @i=now();
set @sqlstr=CONCAT('rename table his_dic to `his_dic_',cast(@i as char),'`');
select @sqlstr;
PREPARE renameHisBak FROM @sqlstr;
EXECUTE renameHisBak;
rename table his_dic_temp to his_dic;


create table his_doc_temp like his_doc;
set @i=now();
set @sqlstr=CONCAT('rename table his_doc to `his_doc_',cast(@i as char),'`');
select @sqlstr;
PREPARE renameHisBak FROM @sqlstr;
EXECUTE renameHisBak;
rename table his_doc_temp to his_doc;

END

3.2使用說明

詳見1.2

4.建立每個月的第一天凌晨1點執行事件

4.1建立任務event_HistoryBak:

CREATE DEFINER=`root`@`localhost` 
EVENT `event_HistoryBak` 
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR)
ON COMPLETION PRESERVE ENABLE 
DO call HistoryBak();

4.2使用說明

詳見2.2

QQ群:20120449


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM