MySql定期備份數據到歷史表的解決方案

前言

互聯網項目最大不瓶頸還是在於數據庫,80%的數據請求只針對20%的數據;特別是電商項目,體現的更爲明顯,大量的數據請求,即使MySql在一主多從,讀寫分離,使用了Elasticsearch、Memcached、Redis、MongoDB等等後,在海量用戶請求的情況下,數據庫仍然無法支撐。

需求

商城數據庫的訂單數據一個月差不多就可以產生100w數據,訂單明細表數據更多,導致訂單表的數據量一直增大,即便有索引查詢已經慢。
解決方案
    1、自動遷移程序定期遷移數據
    優點;穩定,
    缺點;難維護,並且頻繁的對訂單表移除歷史數據和對歷史表插入會導致大量的索引更新,這些操作會導致binglog增加,主從複製變慢,延遲加大
    
    2、通過改表名生成歷史表,並生成一個新的表來存儲數據
    優點;速度快,高效,產生的binglog少,不影響主從複製
    缺點;分表相比單表來說,讀取數據麻煩

表複製

DROP PROCEDURE IF EXISTS P_BackupDataTable;  -- 刪除之前的存儲過程
CREATE PROCEDURE `P_BackupDataTable`(`copy_tablename` varchar(255))
BEGIN
  if exists (select * from information_schema.statistics where table_name = copy_tablename ) then
    set @oldTable = CONCAT(copy_tablename,"_",date_format(now(), '%Y%m%d'));	
    if not exists (select * from information_schema.statistics where table_name = @oldTable ) then
      set @beginNum=(SELECT IFNULL(AUTO_INCREMENT,0) as a FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='dataTableName' AND TABLE_NAME=copy_tablename LIMIT 1);
      set @newTable=CONCAT("new_",copy_tablename);
			
      CALL P_Statement(CONCAT("drop table if exists ",@newTable,";"));
      CALL P_Statement(CONCAT("CREATE TABLE ",@newTable," LIKE ",copy_tablename,";"));
      CALL P_Statement(CONCAT("alter table ",@newTable," auto_increment=",@beginNum,";"));
      CALL P_Statement(CONCAT("RENAME TABLE ",copy_tablename," TO ",@oldTable,",",@newTable," TO ",copy_tablename,";"));
    else 
      SELECT '備份表已存在' as Message;
    end if;
  ELSE
    SELECT '複製的表不存在' as Message;
  end if;	
END;


DROP PROCEDURE IF EXISTS P_Statement;
CREATE PROCEDURE P_Statement(IN dynamic_statement TEXT)
BEGIN
  SET @dynamic_statement := dynamic_statement;
  PREPARE prepared_statement FROM @dynamic_statement; -- 預編譯一條sql語句,並命名爲prepared_statement
  EXECUTE prepared_statement;-- 執行預編譯sql					
  DEALLOCATE PREPARE prepared_statement;-- 要解除分配生成的預準備語句 PREPARE
END ;
CALL P_BackupDataTable('tbale_Name');   -- 執行存儲過程

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章