时间:2020-7-3来源:本站原创作者:佚名

文:3D(alswl)

本文原创,转载请注明作者及出处背景

沪江成立于年,作为较早期的教育学习网站,当时技术选型范围并不大:Java的版本是1.2,C#尚未诞生,MySQL还没有被Sun收购,版本号是3.23。工程师们选择了当时最合适的微软体系,并在日后的岁月里,逐步从ASP过度到.net,数据库也跟随SQLServer进行版本升级。

十几年过去了,技术社区已经发生了天翻地覆的变化。沪江部分业务还基本在.net体系上,这给业务持续发展带来了一些限制。人才招聘、社区生态、架构优化、成本风险方面都面临挑战。集团经过慎重考虑,发起了大规模的去Windows化项目。这其中包含两个重点子项目:开发语言从C#迁移到Java,数据库从SQLServer迁移到MySQL。

本系列文章就是向大家介绍,从SQLServer迁移到MySQL所面临的问题和我们的解决方案。

迁移方案的基本流程

设计迁移方案需要考量以下几个指标:

迁移前后的数据一致性

业务停机时间

迁移项目是否对业务代码有侵入

需要提供额外的功能:表结构重构、字段调整

经过仔细调研,在平衡复杂性和业务方需求后,迁移方案设计为两种:停机数据迁移和在线数据迁移。如果业务场景允许数小时的停机,那么使用停机迁移方案,复杂度低,数据损失风险低。如果业务场景不允许长时间停机,或者迁移数据量过大,无法在几个小时内迁移完成,那么就需要使用在线迁移方案了。

数据库停机迁移的流程:

停机迁移逻辑比较简单,使用ETL(ExtractTranslateLoad)工具从Source写入Target,然后进行一致性校验,最后确认应用运行OK,将Source表名改掉进行备份。

在线迁移的流程:

迁移的方案稍微复杂一些,流程上有准备全量数据,然后实时同步增量数据,在数据同步跟上(延迟秒级别)之后,进行短暂停机(Hang住,确保没有流量),就可以使用新的应用配置,并使用新的数据库。

需要解决的问题

从SQLServer迁移到MySQL,核心是完成异构数据库的迁移。

基于两种数据迁移方案,我们需要解决以下问题:

两个数据库的数据结构是否可以一一对应?出现不一致如何处理?

MySQL的使用方式和SQLServer使用方式是否一致?有哪些地方需要注意?

如何确保迁移前后的数据一致性?

在迁移中,如何支持数据结构调整?

如何保证业务不停情况下面,实现在线迁移?

数据迁移后如果发现业务异常需要回滚,如何处理新产生的数据?

为了解决以上的问题,我们需要引入一整套解决方案,包含以下部分:

指导文档A:SQLServer转换MySQL的数据类型对应表

指导文档B:MySQL的使用方式以及注意点

支持表结构变更,从SQLServer到MySQL的ETL工具

支持SQLServer到MySQL的在线ETL工具

一致性校验工具

一个回滚工具

让我们一一来解决这些问题。

SQLServer到MySQL指导文档

非常幸运的是,MySQL官方早就准备了一份如何其他数据库迁移到MySQL的白皮书。MySQL::GuidetoMigratingfromMicrosoftSQLServertoMySQL里提供了详尽的SQLServer到MySQL的对应方案。包含了:

SQLServertoMySQL-Datatypes数据类型对应表

SQLServertoMySQL-Predicates逻辑算子对应表

SQLServertoMySQL–OperatorsandDateFunctions函数对应表

T-SQLConversionSuggestions存储过程转换建议

需要额外处理的数据类型:

在实际进行中,还额外遇到了一个用来解决树形结构存储的字段类型Hierarchyid。这个场景需要额外进行业务调整。

我们在内部做了针对MySQL知识的摸底排查工作,并进行了若干次的MySQL使用技巧培训,将工程师对MySQL的认知拉到一根统一的线。

关于存储过程使用,我们和业务方也达成了一致:所有SQLServer存储过程使用业务代码进行重构,不能在MySQL中使用存储过程。原因是存储过程增加了业务和DB的耦合,会让维护成本变得极高。另外MySQL的存储过程功能和性能都较弱,无法大规模使用。

最后我们提供了一个MySQL开发规范文档,借数据库迁移的机会,将之前相对混乱的表结构设计做了统一了约束(部分有业务绑定的设计,在考虑成本之后没有做调整)。

ETL工具

ETL的全称是ExtractTranslateLoad(读取、转换、载入),数据库迁移最核心过程就是ETL过程。如果将ETL过程简化,去掉Translate过程,就退化为一个简单的数据导入导出工具。我们可以先看一下市面上常见的导入导出工具,了解他们的原理和特性,方便我们选型。

MySQL同构数据库数据迁移工具:

mysqldump和mysqlimportMySQL官方提供的SQL导出导出工具

pt-table-syncPercona提供的主从同步工具

XtraBackupPercona提供的备份工具

异构数据库迁移工具:

Databasemigrationandsynchronizationtools::国外一家提供数据库迁移解决方案的公司

DataX:阿里巴巴开发的数据库同步工具

yugong:阿里巴巴开发的数据库迁移工具

MySQLWorkbench:MySQL提供的GUI管理工具,包含数据库迁移功能

DataIntegration-Kettle:国外的一款GUIETL工具

Ispirer:提供应用程序、数据库异构迁移方案的公司

DB2DB数据库转换工具::一个国产的商业数据库迁移软件

NavicatPremium:经典的数据库管理工具,带数据迁移功能

DBImport:个人维护的迁移工具,非常简陋,需要付费

看上去异构数据库迁移工具和方案很多,但是经过我们调研,其中不少是为老派的传统行业服务的。比如Kettle/Ispirerer,他们
转载请注明原文网址:http://www.helimiaopu.com/hjpz/7754.html

------分隔线----------------------------