【存储过程】通过存储过程迁移数据

通过存储过程迁移当前表分区数据到历史表

  1. 记录另外一种非常简单的方法,来迁移当前表分区数据到历史表。
  2. 当表名或表分区是变量时,sql应该如何编写;
  3. 存储过程还包含调试信息,如select @transTime,可打印变量值。
  4. 存储过程有三个变量,分别是迁移数据时间,当前表名,历史表名。
  5. 增加了事务一致性的控制,如果迁移数据异常,则当前表的数据不会被删除。
  6. 增加了存储过程的耗时记录和迁移记录,每次迁移都会被记录到表中,可随时观察迁移的数据量,迁移时间,迁移的表名,迁移状态等。

存储过程

CREATE PROCEDURE `transLogMoveProc2`(in beforMonth int, in currentTableName varchar(32), in hisTableName  varchar(32))
BEGIN

-- 需要定义变量
	-- 当次迁移总数
	DECLARE all_count int default 0;
	DECLARE error_status INTEGER DEFAULT 1;
	-- 当次迁移成功标志
	DECLARE execute_status INT 	DEFAULT FALSE;
	declare partName VARCHAR(200);
	declare sqlStmt VARCHAR(200);
	declare sqlStmt2 VARCHAR(200);
	declare sqlStmt3 VARCHAR(200);
	DECLARE diffTime int default 0;
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET error_status=-1;
	set beginTime = DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%S');	
	-- 计算距离当前时间3个月所在月份时间
	set transTime = DATE_SUB(beginTime,INTERVAL beforMonth MONTH);
	-- 计算分区名字
	set partName = CONCAT('P',SUBSTR(DATE_FORMAT(transTime,'%Y%m') FROM 3 FOR 6));
			-- 当次迁移总数
		set @sqlStmt = CONCAT("select count(1) from ", currentTableName, " PARTITION( ",partName, ") into @all_count ;") ;
		PREPARE stmt from @sqlStmt;
		EXECUTE stmt;
		-- 开启事务
		START TRANSACTION;
			-- 当前表分区数据迁移到历史表中
			set @sqlStmt2 = CONCAT("insert into ",hisTableName, " select * from ", currentTableName, " PARTITION(",partName ,");") ;
			-- 删除当前表分区数据
			set @sqlStmt3 = CONCAT("alter table ", currentTableName, " TRUNCATE1 PARTITION  ",partName ,";") ;
			PREPARE stmt2 from @sqlStmt2;
			EXECUTE stmt2;
			PREPARE stmt3 from @sqlStmt3;
			EXECUTE stmt3;
		IF(error_status = -1) THEN
			ROLLBACK;
		ELSE
			COMMIT;
			set execute_status = TRUE;
		END IF;
		set endTime = DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%S');
		-- 计算存储过程迁移的耗时
		set diffTime = TIMESTAMPDIFF(SECOND,beginTime,endTime);
		-- 迁移记录表中记录当次记录,迁移总数,迁移开始时间,迁移结束时间。迁移月份等
 		insert into t_move_log(`move_count`,`current_Table`,`his_Table`,`begin_time`,`end_time`,`use_time`, `create_time`, `move_status`) VALUES (@all_count,currentTableName, hisTableName, beginTime, endTime, diffTime,DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%S'), execute_status);
			
	END
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值