实现自动备份的方法很多,这里说的是客户需要始终保持某个表中存储两个月的记录,以便保持性能。过期数据我们建议存储到另外一个表中,以备以后查询使用。
我们采用存储过程+linux Crontab的方式实现。
创建存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `bl_order_bak`()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
-- 将旧表数据暂存起来
drop table if exists `bl_order_old`;
create table `bl_order_old` as (select * from bl_order);
-- 将超过两个月的数据保存到一个以时间为后缀的表中
set @str = date_format(now(), '%Y%m%d%H%i%s');
set @SQLString = CONCAT('create table bl_order_',@str,' as (select * from bl_order where add_time < date_sub(now(),interval 2 month))');
PREPARE stmt from @SQLString;
EXECUTE stmt;
-- 删除这些已经备份的数据,并清理表的空间
delete from `bl_order` where add_time < date_sub(now(),interval 2 month);
optimize table `bl_order`;
END
为执行此存储过程创建脚本
#!/bin/bash
mysql -hlocalhost -uroot -pbei666999 -P3306 -e "call boli.bl_order_bak" ;
将文件存储起来:File:/data/order_bak.sh
并赋予执行权限:chmod +x /data/order_bak.sh
创建计划任务
crontab -e
59 23 1 * * sh /webdata/order_bak.sh
设定每月1号23点59分执行脚本调用存储过程。