需求背景
数据是一个公司最大的财富。伴随数据的增长以及使用场景的改变,需要对存储介质进行升级,此时需要进行数据迁徙。下面列举几个场景:
- 公司一开始使用oracle或者sqlserver等商业数据库来存储数据,随着公司业务的发展,数据量越来越大,数据增长速度越来越快。传统oracle和sqlserver不仅成本高昂,而且不易于横向扩展,无法满足大数据量的存储和读写。公司决定选择免费的mysql数据库,并进行分库分表,免费并且稳定。
- 公司成长越来越大,进行了自研的弹性数据库,决定把分库分表的Mysql数据迁徙到自研的弹性数据库。 本文使用Sqlserver数据迁徙到Mysql来举例说明。
数据迁徙面临的挑战
需要在迁徙过程保证数据的完全正确,并且迁徙过程中,数据在不断发生变化。并且在迁徙的过程中,不能影响线上客户,本文给出一个数据迁徙的套路,保证整个迁徙过程顺利完成。
DBA迁徙方案
迁徙工作DBA来做,DBA先停止数据库的使用,然后书写迁徙脚本把数据导出到一个中间文件。然后再书写导入脚本,导入目标库。此方案虽然简单,但有很大的局限性,使用的场景有限。
数据库会停止服务几小时甚至几天,应用程序无法使用,在一些行业应用中基本不可接受。
不能满足异构数据的迁徙,如果oralce或sqlservcer和mysql的数据结构不一样,有着比较复杂的映射关系,需要做数据转换,不能满足迁徙。
开发数据迁徙程序
整个迁徙程序通常有如下程序开发工作: 1) 应用程序改造: 接管读写:接管所有数据的读的写,为后续的切读流量或者切写流量做好准备。 切量改造:支持异步回放线上流量进行数据验证;支持按读流量和写流量进行切流;
2) 开发增量数据迁徙程序: 把原数据库的数据变化不断迁徙到新数据库中,有如下方式: - 方式1可以通过加入log变更表,并使用事物保证; - 方式2可以通过业务双写; - 方式3可以通过MQ消息,或接收类似Canal类的增量数据出发机制。
3) 开发全量迁徙检验程序: 遍历全部原库数据,判断是否和目标一致,不一致进行迁徙覆盖到目标库,操作幂等,并进行报警。
上线过程
整个上线过程,先进行全量迁徙或增量迁徙并不重要,重要的是全量对比程序和增量对比程序,对比程序有对比和修复的功能,能够处理掉任何中间过程的异常不一致数据;等到全量和增量对比程序稳定不报错的时候,就可以进行切量验证及切量了。附图: