sqlserver迁移到mysql遇到的那些坑

背景

由于各种原因,成本啊、扩展性等,公司决定把线上的业务从sql server迁移到mysql RDS。

迁移过程主要包括了程序修改和数据库的迁移。程序修改我们略过不谈,我们重点关注数据库迁移。

大概过程

由于是异构的数据库,没有找到数据实时同步的方法(若哪位大侠可以异构实时同步,还请多多指教),所有使用ETL工具定时同步数据。

同步的数据包括insert和update的数据(还好业务中没有物理的delete)。

待万事俱备,切换数据库之前,再进行一次数据同步。

切换完成之后,在进行数据检查,把最后一次同步之后,写入到sqlserver中的数据,传输到mysql上。

大功告成!!!

那些坑

本文主要介绍迁移过程中的那些坑,主要是结构和语法上的。

1,时间戳timestamp数据类型

sqlserver和mysql都有timestamp数据类型,但是两者的实现区别很大。

在sql server中,该类型表明数据库中数据修改发生的相对顺序,它的值本质上是一个bigint类型的一个递增数字,与时间和日期无关, 该数字在数据库实例级别不会重读。

在mysql中,该类型表明数据库中数据修改发生的相对顺序, 它的本质是一个时间,该时间再表级别都有可能重复。

最坑的是该类型的字段是我们业务的关键字段,用于用户从服务器上拉去数据。

最后的解决办法,该字段的数据按照bigint的值从sql server迁移到mysql,mysql在添加一个timastamp数据类型,程序添加判断机制。

2,字符集和emoji表情

sqlserver中默认直接可以保存emoji表情。开始迁移过程没有注意到该问题。历史数据迁移完毕以后,才发现该问题。omg!!

mysql中需要使用utf8mb4来保存此数据。

3,索引不能超过大小

mysql中索引长度不能超过767字节,这可是个大坑啊!!!

这个只能是优化数据类型。

比如有的字段保存设备的macid,数据类型是varchar(50),经过调研发现macid只有12位,可以修改成varchar(12)。

再有int是否可以改为tinyint或者smallint、是否可以用latin1代替utf8(当然最好是都统一使用utf8)等

这里主要就是数据类型的优化,稍后会有专门的文章来介绍数据类型优化。

4,varchar(max)类型

mysql没有该数据类型,如果使用power designer反向工程的话,从sqlserver到mysql,该数据类型会变为char(1)。mysql中需要使用text类型。

5,常见的不兼容的语法

sqlserver中一个使用top取前几行的数据,mysql使用limit完成此功能。这个相对还比较好修改。

两者使用临时表的方法也不一样。

存储过程和函数的格式。

6,CTE递归

在存在递归查询的操作里,sqlserver有一个非常棒的功能就是CTE递归查询。

7,over窗口查询

sqlserver中的over窗口函数也是我非常喜欢的一个功能,比如分组排序、分组范围等查询。

时间: 2024-08-29 02:33:56

sqlserver迁移到mysql遇到的那些坑的相关文章

各种主流 SQLServer 迁移到 MySQL 工具对比

我之所以会写这篇对比文章,是因为公司新产品研发真实经历过这个痛苦过程(传统基于SQL Server开发的C/S产品转为MySQL云产品).首次需要数据转换是测试环节,当时为了快速验证新研发云产品性能与结果准确性(算法类),所以需大量的原始数据,最快的办法就是使用老产品的真实数据.因为在前期数据转换时主用于内部验证,并没有花很多心思去处理这个事情,一般数据能导过去,不对的地方自己再手工处理一下就好了.后面对这个转换工具引起了极大的重视是正式有老客户升级时,因为正式投入使用就容不得半点错误(当时至少

【数据库】各种主流 SQLServer 迁移到 MySQL 工具对比

在部署前期,首要任务就是考虑如何快速把基于 SQL Server 数据库的应用程序移植到阿里云的 MySQL 数据库.由于程序是基于 O/R mapping 编写,并且数据库中没有使用存储过程.用户函数等数据库功能,因此仅仅需要考虑的是数据库中的数据如何转换到新的 MySQL 数据库中. 通过度娘查找,找到如下四种可以使用的工具,并且每一种工具都有大量的用户,还有不少用户在自已的博客中写下了图文使用经验,这四种工具分别是: ● SQLyog(https://www.webyog.com/prod

[MySQL] SqlServer 迁移到 MySQL 方法介绍

一.原则: 只迁移表结构和数据,存储过程.函数.触发器尽量自己改写,并充分测试. 迁移前,先设置好数据库的一些参数,比如默认存储引擎,默认编码等,方便后续导入. 二.方法: 1.使用MySQL Workbench MySQL Workbench提供了Migration Wizard(数据库迁移)功能,支持MSSQL的数据形式转换为MYSQL下的数据格式: 具体参照这篇文章:http://mysqlworkbench.org/2012/07/migrating-from-ms-sql-server

主流 SQLServer 迁移到 MySQL 工具对比

首次需要数据转换是测试环节,当时为了快速验证新研发云产品性能与结果准确性(算法类),所以需大量的原始数据,最快的办法就是使用老产品的真实数据.因为在前期数据转换时主用于内部验证,并没有花很多心思去处理这个事情,一般数据能导过去,不对的地方自己再手工处理一下就好了.后面对这个转换工具引起了极大的重视是正式有老客户升级时,因为正式投入使用就容不得半点错误(当时至少有几百家客户需要升级新产品),所以数据转移第一要求是百分百的准确率,其次是速度要快.现在回想起来,当时要有这么一篇对比文章,那我就不会浪费

从Oracle迁移到MySQL的各种坑及自救方案

当企业内部使用的数据库种类繁杂时,或者有需求更换数据库种类时,都可能会做很多数据迁移的工作.有些迁移很简单,有些迁移可能就会很复杂,大家有没有考虑过为了顺利完成复杂的数据库迁移任务,都需要考虑并解决哪些问题呢? 在以前的工作中,我迁移过Oracle到Informix.Oracle和SQLServer.Oracle到MySQL. 在目前的公司又因为去O的关系,做了大量的迁移工作,栽了不少坑,所以和大家交流一下在迁移的过程中的一些实践. 分享大纲: 去O前的准备与考虑 确定目标数据库 表和数据对象的

SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.4

最近公司有一个项目,需要把原来的系统从 MSSQL 升迁到阿里云RDS(MySQL)上面.为便于测试,所以需要把原来系统的所有数据表以及测试数据转换到 MySQL 上面.在百度上找了很多方法,有通过微软 DTS 的,也有使用 mss2sql 工具进行转换的.使用 DTS 需要预先创建好数据表,否则新迁移的数据库是没有主键的.而 mss2sql 工具可以解决以上问题,但转换速度非常慢!我需要转换 3000 万的数据,在一台相当不错的服务器上面,也需要几天几夜才能转换完成.而 DB2DB 就是在这样

SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.3

最近公司有一个项目,需要把原来的系统从 MSSQL 升迁到阿里云RDS(MySQL)上面.为便于测试,所以需要把原来系统的所有数据表以及测试数据转换到 MySQL 上面.在百度上找了很多方法,有通过微软 DTS 的,也有使用 mss2sql 工具进行转换的.使用 DTS 需要预先创建好数据表,否则新迁移的数据库是没有主键的.而 mss2sql 工具可以解决以上问题,但转换速度非常慢!我需要转换 3000 万的数据,在一台相当不错的服务器上面,也需要几天几夜才能转换完成.而 DB2DB 就是在这样

SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.1

最近公司有一个项目,需要把原来的系统从 MSSQL 升迁到阿里云RDS(MySQL)上面.为便于测试,所以需要把原来系统的所有数据表以及测试数据转换到 MySQL 上面.在百度上找了很多方法,有通过微软 DTS 的,也有使用 mss2sql 工具进行转换的.使用 DTS 需要预先创建好数据表,否则新迁移的数据库是没有主键的.而 mss2sql 工具可以解决以上问题,但转换速度非常慢!我需要转换 3000 万的数据,在一台相当不错的服务器上面,也需要几天几夜才能转换完成.而 DB2DB 就是在这样

.NET程序迁移到Mysql的极简方案——让GGTalk同时支持Sqlserver与mysql全程记录!

园子里的这个GGTalk,咱们前前后后用它移花接木做的IM项目也不下三四个了.初次入手的时候,洋洋代码,多少感觉有些难以把握.不过一来二去,理清了头绪,也就一览无余了.相信跟我们一样想要利用GGTalk的同学大有人在,于是我打算写这样一个<GGTalk源码详解系列>,把自己对GGTalk的梳理分享给大家,让大家更容易上手. 之前有一个企业级的IM项目,我们用GGTalk改造的,但是要求使用Mysql数据库,所以花了一番功夫将GGTalk迁移到的Mysql,功夫不负有心人,总算弄出了个成果.如今