sqlserver迁移到mysql遇到的那些坑

Posted 一苇过江

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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窗口函数也是我非常喜欢的一个功能,比如分组排序、分组范围等查询。

 

以上是关于sqlserver迁移到mysql遇到的那些坑的主要内容,如果未能解决你的问题,请参考以下文章

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

centos7 安装mysql和mysqlclient遇到的那些坑

数据迁移,iis的各种坑

python连接数据库(mysqloraclesqlserver)遇到的那些坑。。。

记录php遇到的那些坑

MySQL迁移到SQLServer