线上mysql大表数据迁移到备库
由于项目中线上有很多表(古老,未作分表)数据量比较大,页面接口查询时经常超时,已经在索引方面不能提高查询速度了,因此考虑将部分数据(半年之前)迁移到备份库中,备份的表结构和数据和原始表相同,这部分数据基本上已经不使用了,所以只做了数据迁移。
迁移方案:跑批处理
1.从原始表中查出需要备份的数据
返回一个List<map>
<select id="queryByxxx" resultType="java.util.HashMap">
select *
from ${tableName}
where ${tableColumnName} = #{tableColumnValue}
</select>
2.将数据插入到备份库表中
遍历上面查出来的List
<insert id="insertData" >
insert into
${tableName}
(
<foreach collection="data" item="value" index="key" separator=",">
${key}
</foreach>
)
values (
<foreach collection="data" item="value" index="key" separator=",">
#{value}
</foreach>
)
</insert>
其中的 collection="data" 中的data就是上面list中的元素
3.删除原始表中的数据
<delete id="deleteByxxx" >
delete from ${tableName} where ${tableColumnName} = #{tableColumnValue}
</delete>
上述只是简单的实现流程,其中涉及多数据源配置,也要从本身业务逻辑做异常处理,比如异常中断可继续备份。使用线程池多线程并且可以根据时间段分段处理历史数据,加快处理速度。