我是八月柳,一个只讲思路的人!
这里讲讲数据迁移工具的开发,没有代码!
很多时候我们需要从其他数据库迁移到不同类型的数据库里面,就需要迁移工具了;
我们可以自己开发一个练练手!
先想想我们希望的工具是什么样子的,把这些希望都写下来!
我希望它能
- 自动列出源数据库所有的表、字段名称
- 可以配置目标表名称,字段名称
- 可过选择哪些表不迁移
- 可配置哪些表按照什么字段分表
- 可配置目标表主键、索引字段
- 自动在目标数据库创建表结构,配置好迁移方案时就生成创建语句,以备检查
- 支持多线程
- 迁移分阶段进行:
第一阶段:配置并创建迁移任务。(选择源、目标、需要迁移的表、字段、任务拆分配置等)
第二阶段:执行迁移任务。(可选择需要迁移的表、可重复执行)
第三阶段:展示并检查迁移结果。
第一阶段(配置):
1.配置迁移任务:
- 列出源表清单,针对每个表做数据拆分配置,默认不拆分,勾选需要迁移的表,可多选,可全选;
- 支持配置仅迁移某个时间段内的数据,默认全部迁移。
- 可查询单个表某段时间的数据总量,供参考以什么时间单位拆分数据。
- 配置可保存,若已创建某个表相同时间段的迁移任务,则不可修改配置方案,需要删除目标表,需先删除该表的迁移任务且清空目标数据,方可修改,询问用户是否清除(危险操作)。
- 数据水平拆分:按时间单位(月、天、日、时、分)拆分,拆分字段选择(如:创建时间,所选字段源表以及目标表必须有索引,否则速度不理想);还是不拆分,不拆分迁移速度将很慢,且不能多线程。
- 数据垂直拆分:划分目标表的字段,或者不拆分。
2.创建/删除迁移任务:
- 根据已勾选的每个源表迁移配置,创建迁移任务记录,统计原表数据量;
- 如果有水平拆分,则先根据拆分字段,查询出最近一条数据的拆分字段的时间,根据时间单位划分时间段,每个时间段一条任务记录,统计该时间段源数据量,并创建迁移任务记录。
- 支持删除已创建的迁移任务。
- 支持修改迁移时间段增加迁移任务。
第二阶段(执行):
- 读取迁移配置,读取需要迁移的表清单,以列表展示方式,勾选需要迁移的表,可多选。
- 设置执行迁移任务的线程数量。
- 根据设置的线程同时执行多个迁移任务。
- 更新任务状态为已执行。
- 读取迁移任务中的表名称表,在目标环境检查是否已存在,如果不存在则创建,主键字段建立索引,分表字段不为空则分表。
- 检查目标环境字段清单是否一致,不 一致则重新建表。
- 清空目标表数据。(若迁移方案为校验已存在数据,则不清空)
- 读取源表数据,如果有水平拆分,则根据拆分字段以及开始、结束查询源表范围内的数据;
- 转换目标字段数据类型(处理不同数据库之间类型不匹配问题)
- 生成insert语句并执行,在目标表插入数据;
- 若迁移方案为校验已存在数据,则根据主键字段查询数据是否已存在,不存在再插入;
- 若源表数据量较大,可设定一个值,则继续根据向下拆分,在该时间段内,以更小的时间单位作为子任务并行处理。
- 若插入完毕,则更新迁移任务状态为完成。
- 中间可暂停/继续迁移。
- 显示执行进度条。
第三阶段(展示并检查):
- 列出迁移任务,可筛选表名称、迁移状态、可排序。
- 对于某个未完成的迁移任务,可单独重新执行执行。
- 可查询某个迁移任务已迁移的数据量。
对于迁移后的检查
表结构检查(人工)
数据行检查(工具)
数据值检查(人工)
迁移方案数据结构
方案ID,方案名称,源数据库类型,源数据库链接字符串,目标数据库类型,目标数据库链接字符串,是否校验已存在数据(主键字段必填),是否支持分库分,是否水平拆分,是否垂直拆分
需迁移的表清单
方案ID,源表名称,主键字段,水平拆分时间单位(年、月、天、时、分、秒),水平拆分时间字段名,创建时间,是否垂直拆分,建表语句,迁移开始时间,迁移结束时间
迁移表的字段:
方案ID,源字段名称,目标字段名称,源字段类型,源字段长度,目标字段类型,源字段长度,目标字段类型,目标字段长度
垂直拆分表清单
方案ID,目标表名称,分表字段,建表语句
迁移任务表结构
任务ID,配置ID,表名称,字段,是否分表,拆分时间单位,水平分表字段,是否水平拆分,迁移开始时间,迁移结束时间,是否垂直拆分,垂直拆分表名称和字段(JSON或明细表),源表行数,迁移状态,开始执行时间,最后执行时间,创建时间
迁移状态
未开始、已完成、出错、中断
需要注意的点:
- 目标表数据拆分字段必须要建立索引,例如以创建时间拆分迁移任务,目标表的创建时间字段需要建立索引,没有索引统计数据量时就会很慢,而且随着数据迁移越来越多,就会越慢。要知道没有索引的全表扫描,对磁盘的压力是很大的,如果很多任务同时在进行全表扫描,那数据库几乎会崩溃,就好比在移动/复制多个文件的时候,windows系统弹出的等待窗口。
- 创建拆分任务的时候,可以不统计源表的数据量,迁移完成后也可以不统计目标表的数据量,在检查阶段再单独统计,目的是优先把数据迁移过来加快速度。
- 迁移的时候不做任何关联查询,只查询当前表的数据。
- 支持单任务重跑
欢迎纠正,交流,分享
八月柳,一个只讲思路的人