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');   -- 执行存储过程

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡老汉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值