标签:des sql 过程 数据库 工具 开始 acid 字节 递归
背景
由于各种原因,成本啊、扩展性等,公司决定把线上的业务从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窗口函数也是我非常喜欢的一个功能,比如分组排序、分组范围等查询。
标签:des sql 过程 数据库 工具 开始 acid 字节 递归
原文地址:http://www.cnblogs.com/shizheyangde/p/7410816.html