cursor 与 insert ...select 对比:  

  cursor:安全,不会造成死锁,可以在服务运行阶段跑,比较稳定。

  insert...select :速度快,但是可能造成死锁,相比cursor能够成倍提升,在服务停止的情况下迁移,速度快

数据迁移案例:

  首先数据的迁移绝对不是一朝一夕能够快速迁移完成的 ,如果可以很快完成的 dump便可以搞定,没必要大费周折了。

  既然不是一朝一夕能完成的,那么有关键的日志记录表能够良好的反应数据迁移的过程

  迁移日志表脚本:

DROP TABLE IF EXISTS `cx_delete_log`;
CREATE TABLE `cx_delete_log` (
`id` int(30) NOT NULL,
`table_name` varchar(30) DEFAULT NULL,
`start_tm` datetime DEFAULT NULL,
`end_tm` datetime DEFAULT NULL,
`status` int(10) DEFAULT NULL,
`pro_create_time` datetime DEFAULT NULL,
`pro_end_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ----------------------------
-- Records of cx_delete_log
-- ----------------------------
INSERT INTO `cx_delete_log` VALUES ('', 'cx_waybill', '2017-01-01 00:00:00', '2017-01-01 00:10:00', '', '2017-03-21 14:06:21', null); ALTER TABLE `cx_delete_log`
ADD INDEX `index_end_date` (`end_tm`) USING BTREE ;

  首先迁移的增量字段确定。这里存在一个最优解,即你每分钟的数据量,与你mysql的性能,我们可以在此之间寻找到一个平衡点(cursor与insert...select并不相同),设置每次迁移多次时间段的数据,这样能,最大效率的利用我们数据库的性能。

  我们插入了一条日志数据,有这个来控制每次数据迁移的间隔时间段,与开始时间

如:2017-01-01 00:00:00 start_tm数据迁移增量字段的开始时间,2017-01-01 00:10:00 end_tm数据增量字段迁移的结束时间,时间间隔10分钟。

状态为1代表成功,2017-03-21 14:06:21  代表执行这段时间数据迁移的执行时间,pro_end_time代表执行这段时间数据迁移的执行完毕时间时间。

存储过程:

  存储过程分为两个部分,1.日志的写入2.迁移操作的进行

  日志写入:

   delimiter |
drop procedure if exists batch_move_cx_waybill_partition_by_minute;
create procedure batch_move_cx_waybill_partition_by_minute()
begin
DECLARE proNo INTEGER;
DECLARE startDate TIMESTAMP;
DECLARE endDate TIMESTAMP;
DECLARE nextDate TIMESTAMP;
DECLARE pro_endDate TIMESTAMP;
SET pro_endDate='2017-03-20 00:00:00';
REPEAT
SELECT ID, end_tm,DATE_ADD(end_tm,INTERVAL '00:10:00' hour_second) INTO proNo,startDate ,endDate from cx_delete_log ORDER BY end_tm desc limit 1;
IF curtime()>'06:00:00' THEN
SET startDate =pro_endDate;
END IF;
IF startDate <pro_endDate THEN
INSERT into cx_delete_log(id,table_name,start_tm,end_tm,status,pro_create_time)VALUES(proNo+1,'cx_waybill',startDate,endDate,'',SYSDATE());
CALL cursor_move_cx_waybill_partition(startDate);
update cx_delete_log set pro_end_time =SYSDATE() , `status`=1 where id=proNo+1;
COMMIT;
END IF;
UNTIL startDate >=pro_endDate
END REPEAT;
end |
delimiter ;

迁移操作的进行:

  实例为cursor,insert..select较为简单,直接带入就行,就不做示例了

   delimiter ||
drop procedure if exists cursor_move_cx_waybill_partition;
create procedure cursor_move_cx_waybill_partition(IN startDate_tmp TIMESTAMP)
begin
DECLARE isEXist INTEGER;
DECLARE WAYBILLNO_TMP VARCHAR(32);
DECLARE RESOURCECODE_TMP VARCHAR(10);
DECLARE APPOINTMENTDDELIVERYTIME_TMP TIMESTAMP;
DECLARE APPOINTMENTDDELIVERYENDTIME_TMP TIMESTAMP;
DECLARE EXPECTEDDELIVERYTIME_TMP TIMESTAMP;
DECLARE ORIGINATEID_TMP VARCHAR(32);
DECLARE DESTINATIONID_TMP VARCHAR(32);
DECLARE WAYBILLSTATUS_TMP VARCHAR(4);
DECLARE VERSIONNO_TMP INTEGER;
DECLARE STATUS_TMP CHAR(1);
DECLARE FAILSTARTUS_TMP VARCHAR(10);
DECLARE FAILCAUSEDESC_TMP VARCHAR(500);
DECLARE MEMBERID_TMP VARCHAR(32);
DECLARE HIDEFLAG_TMP VARCHAR(4);
DECLARE CREATEUSERID_TMP VARCHAR(32);
DECLARE CREATETIME_TMP TIMESTAMP;
DECLARE UPDATEUSERID_TMP VARCHAR(32);
DECLARE UPDATETIME_TMP TIMESTAMP;
DECLARE APPOINTMENTNO_TMP VARCHAR(32);
DECLARE SOURCECITY_TMP VARCHAR(32);
DECLARE DESTCITY_TMP VARCHAR(32);
DECLARE SOURCECITYCODE_TMP VARCHAR(20);
DECLARE DESTCITYCODE_TMP VARCHAR(20);
DECLARE EMPCODE_TMP VARCHAR(10);
DECLARE RECEMPCODE_TMP VARCHAR(10);
DECLARE RECMEMBERID_TMP VARCHAR(32);
DECLARE WAYBILLFEE_TMP DOUBLE(10,0);
DECLARE MOBILE_TMP VARCHAR(20);
DECLARE RECMOBILE_TMP VARCHAR(20);
DECLARE RECTIME_TMP TIMESTAMP;
DECLARE ENDTIME_TMP TIMESTAMP;
DECLARE EXPECTMEMBERID_TMP VARCHAR(32);
DECLARE ORIGINATE_TMP VARCHAR(500);
DECLARE DESTINATION_TMP VARCHAR(500);
DECLARE PAYTYPE_TMP VARCHAR(4);
DECLARE SECRECYTYPE_TMP VARCHAR(32);
DECLARE SEND_EVALUATE_TMP VARCHAR(10);
DECLARE PRODUCT_TYPE_TMP VARCHAR(32);
DECLARE SERVICES_PROD_CODE_TMP VARCHAR(200);
DECLARE CHANGERECORD_TMP VARCHAR(32);
DECLARE IS_ISSUED_PREFRENCE_TMP VARCHAR(10);
DECLARE REC_EVALUATE_TMP VARCHAR(10);
DECLARE done INTEGER; DECLARE bill_cursor CURSOR for SELECT WAYBILLNO, RESOURCECODE , APPOINTMENTDDELIVERYTIME , APPOINTMENTDDELIVERYENDTIME , EXPECTEDDELIVERYTIME ,ORIGINATEID , DESTINATIONID , WAYBILLSTATUS , VERSIONNO , STATUS, FAILSTARTUS, FAILCAUSEDESC, MEMBERID, HIDEFLAG, CREATEUSERID, CREATETIME, UPDATEUSERID, UPDATETIME, APPOINTMENTNO, SOURCECITY, DESTCITY, SOURCECITYCODE, DESTCITYCODE, EMPCODE, RECEMPCODE, RECMEMBERID,WAYBILLFEE, MOBILE, RECMOBILE, RECTIME, ENDTIME, EXPECTMEMBERID, ORIGINATE, DESTINATION, PAYTYPE, SECRECYTYPE, SEND_EVALUATE, PRODUCT_TYPE, SERVICES_PROD_CODE, CHANGERECORD, IS_ISSUED_PREFRENCE, REC_EVALUATE FROM cx_waybill WHERE CREATETIME > startDate_tmp AND CREATETIME <= DATE_ADD(startDate_tmp,INTERVAL '00:10:00' hour_second);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
open bill_cursor;
loop_bill:LOOP
IF done = 1 THEN
LEAVE loop_bill;
END IF;
FETCH bill_cursor INTO WAYBILLNO_TMP, RESOURCECODE_TMP, APPOINTMENTDDELIVERYTIME_TMP, APPOINTMENTDDELIVERYENDTIME_TMP,EXPECTEDDELIVERYTIME_TMP,ORIGINATEID_TMP, DESTINATIONID_TMP, WAYBILLSTATUS_TMP, VERSIONNO_TMP, STATUS_TMP, FAILSTARTUS_TMP, FAILCAUSEDESC_TMP, MEMBERID_TMP, HIDEFLAG_TMP, CREATEUSERID_TMP, CREATETIME_TMP, UPDATEUSERID_TMP, UPDATETIME_TMP, APPOINTMENTNO_TMP, SOURCECITY_TMP, DESTCITY_TMP, SOURCECITYCODE_TMP, DESTCITYCODE_TMP, EMPCODE_TMP, RECEMPCODE_TMP, RECMEMBERID_TMP,WAYBILLFEE_TMP, MOBILE_TMP, RECMOBILE_TMP, RECTIME_TMP, ENDTIME_TMP, EXPECTMEMBERID_TMP, ORIGINATE_TMP, DESTINATION_TMP, PAYTYPE_TMP, SECRECYTYPE_TMP, SEND_EVALUATE_TMP, PRODUCT_TYPE_TMP, SERVICES_PROD_CODE_TMP, CHANGERECORD_TMP, IS_ISSUED_PREFRENCE_TMP, REC_EVALUATE_TMP;
IF WAYBILLNO_TMP is NULL THEN
LEAVE loop_bill;
END IF;
SELECT count(1) INTO isEXist from cx_waybill_partition w where w.WAYBILLNO=WAYBILLNO_TMP;
IF isEXist >0 THEN
LEAVE loop_bill;
ELSE
INSERT INTO cx_waybill_PARTITION (WAYBILLNO, RESOURCECODE, APPOINTMENTDDELIVERYTIME, APPOINTMENTDDELIVERYENDTIME,EXPECTEDDELIVERYTIME,ORIGINATEID, DESTINATIONID, WAYBILLSTATUS, VERSIONNO, STATUS, FAILSTARTUS, FAILCAUSEDESC, MEMBERID, HIDEFLAG, CREATEUSERID, CREATETIME, UPDATEUSERID, UPDATETIME, APPOINTMENTNO, SOURCECITY, DESTCITY, SOURCECITYCODE, DESTCITYCODE, EMPCODE, RECEMPCODE, RECMEMBERID,WAYBILLFEE, MOBILE, RECMOBILE, RECTIME, ENDTIME, EXPECTMEMBERID, ORIGINATE, DESTINATION, PAYTYPE, SECRECYTYPE, SEND_EVALUATE, PRODUCT_TYPE, SERVICES_PROD_CODE, CHANGERECORD, IS_ISSUED_PREFRENCE, REC_EVALUATE)VALUES(WAYBILLNO_TMP, RESOURCECODE_TMP, APPOINTMENTDDELIVERYTIME_TMP, APPOINTMENTDDELIVERYENDTIME_TMP,EXPECTEDDELIVERYTIME_TMP,ORIGINATEID_TMP, DESTINATIONID_TMP, WAYBILLSTATUS_TMP, VERSIONNO_TMP, STATUS_TMP, FAILSTARTUS_TMP, FAILCAUSEDESC_TMP, MEMBERID_TMP, HIDEFLAG_TMP, CREATEUSERID_TMP, CREATETIME_TMP, UPDATEUSERID_TMP, UPDATETIME_TMP, APPOINTMENTNO_TMP, SOURCECITY_TMP, DESTCITY_TMP, SOURCECITYCODE_TMP, DESTCITYCODE_TMP, EMPCODE_TMP, RECEMPCODE_TMP, RECMEMBERID_TMP,WAYBILLFEE_TMP, MOBILE_TMP, RECMOBILE_TMP, RECTIME_TMP, ENDTIME_TMP, EXPECTMEMBERID_TMP, ORIGINATE_TMP, DESTINATION_TMP, PAYTYPE_TMP, SECRECYTYPE_TMP, SEND_EVALUATE_TMP, PRODUCT_TYPE_TMP, SERVICES_PROD_CODE_TMP, CHANGERECORD_TMP, IS_ISSUED_PREFRENCE_TMP, REC_EVALUATE_TMP);
END IF;
end Loop;
close bill_cursor;
COMMIT;
end ||
delimiter ;

定时器的创建:

  每天凌晨一点执行:

   ---轮循删除定时器
drop event if exists waybill_move_event;
create event waybill_move_event
on schedule every 1 DAY STARTS '2017-01-17 01:00:00'
on completion preserve ENABLE
do call batch_move_cx_waybill_partition_by_minute(); alter event waybill_move_event on completion preserve enable;

其实,在中间踩过一些坑,但是很多都是百度都能解决的  。事实证明,这样的数据迁移,其速度并不慢,而且性能相对稳定,在后续的观察中,并未对数据库造成太多的压力,可看作种蚂蚁搬家。

mysql数据库存储过程数据迁移案例与比较的更多相关文章

  1. MySQL数据库从windows迁移到linux

    前几天搭建了lamp环境,想把之前写的小东西迁到linux上运行,涉及到把mysql数据库的文件迁移到linux上,直接用fileZilla传过去应该不行,我试了下,反正没成功.下面是我采用的方法: ...

  2. 修改mysql数据库存储路径

    最近一段比较忙,所以一直没有及时的更新总结一下测试路上遇到的问题,今天先来分享一下如何修改mysql存储路径(场景:在自己电脑上搭建的服务器上安装mysql,二.在公司自己的服务器上搭建mysql数据 ...

  3. CentOS 7上更改MySQL数据库存储目录浅析

      个人之前总结过两篇文章"MySQL更改数据库数据存储目录"和"Ubuntu上更改MySQL数据库数据存储目录",都是在工作中遇到相关案例后的一个简单总结.当 ...

  4. Linux环境下修改MySQL数据库存储引擎

    今天在执行Oracle数据库迁移至MySQL数据库时报出了一个错误信息: Specified key was too bytes 百度发现,原来需要更改MySQL数据库的存储引擎为InnoDB,查询目 ...

  5. mysql数据库存储路径更改 数据文件位置

    使用了VPS一段时间之后发现磁盘空间快满了.本人的VPS在购买的时候买了500gb的磁盘,提供商赠送了20GB的高性能系统磁盘.这样系统就有两个磁盘空间了.在初次安装mysql 的时候将数据库目录安装 ...

  6. 【转】MySQL 数据库存储引擎

    原文地址:http://blog.jobbole.com/94385/ 简单介绍 存储引擎就是指表的类型.数据库的存储引擎决定了表在计算机中的存储方式.存储引擎的概念是MySQl的特点,而且是一个插入 ...

  7. MySQL 数据库存储引擎

    简单介绍 存储引擎就是指表的类型.数据库的存储引擎决定了表在计算机中的存储方式.存储引擎的概念是MySQl的特点,而且是一个插入式的存储引擎概念.这就决定了MySQl数据库中的表可以使用不同的存储方式 ...

  8. 更改Mysql数据库存储位置的具体步骤

    首先把mysql的服务先停掉,更改MySQL配置文件My.ini中的数据库存储主路径,将老的数据库存储主路径中的数据库文件和文件夹复制到新的存储主路径,接下来重启搞定     一.首先把mysql的服 ...

  9. Mysql数据库存储emoji表情

    emoji表情需要使用编码格式未utf8mb4,mysql数据库版本要5.5以上,我用的是5.6,因为只有5.5以上支持utf8mb4. 1.数据库编码设定为utf8mb4,如果建库时指定的是utf8 ...

随机推荐

  1. 木马suppoie 处理的几个思路 木马文件的权限所有者 属主数组 定时任务 目录权限

    木马suppoie 处理的几个思路  木马文件的权限所有者  属主数组  定时任务   目录权限

  2. FireFox插件FirePHP调试PHP

    如果你和我一样,你会在开发网页项目时候完全无法离开FireBug.这个小巧的"臭虫"是一个神奇而有用的HTML/CSS/JavaScript/Ajax调试器.但是你也许不知道这个还 ...

  3. Jmeter实现对字符串加密

    最近测试移动端接口,但是请求内容是用MD5加密的,所以要先对请求内容进行加密,Jmeter内置的没有MD5加密方法,所以自己从网上copy了一份,实现了加密功能,以下是具体操作: 1.从网上copy了 ...

  4. ApexSql Log 2016破解版&补丁

    绿色破解版: http://download.csdn.net/detail/gsyifan/9316993 官网: https://www.apexsql.com/sql_tools_log.asp ...

  5. 图像处理之拼接---图像拼接opencv

    基于SURF特征的图像与视频拼接技术的研究和实现(一)      一直有计划研究实时图像拼接,但是直到最近拜读西电2013年张亚娟的<基于SURF特征的图像与视频拼接技术的研究和实现>,条 ...

  6. ORB特征提取与匹配

    ORB特征是目前最优秀的特征提取与匹配算法之一,下面具体讲解一下: 特征点的检测 图像的特征点可以简单的理解为图像中比较显著显著的点,如轮廓点,较暗区域中的亮点,较亮区域中的暗点等.ORB采用FAST ...

  7. poj 2914(stoer_wanger算法求全局最小割)

    题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t   V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...

  8. 使用python封装get+post请求

    思路: 将平时用的多的get和post请求封装,提高代码重用率. 其中Session类可以通过实例化,保存cookie信息,可以在程序结束前多次通过保存的cookie信息保持登录状态的访问. 那么为什 ...

  9. servlet之模板方法和多线程

    接触了一小段时间的servlet,以下就总结一下关于servlet的两个方面的知识,一个是模板方法的应用.另外一个是servlet多线程产生的原因. 1. 模板方法设计模式 定义一个操作中的算法的骨架 ...

  10. 【BZOJ4547】Hdu5171 小奇的集合 矩阵乘法

    [BZOJ4547]Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这 ...