zoukankan      html  css  js  c++  java
  • 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窗口函数也是我非常喜欢的一个功能,比如分组排序、分组范围等查询。

     

  • 相关阅读:
    Something broke! (Error 500)——reviewboard
    linux内核--自旋锁的理解
    I.MX6 mkuserimg.sh hacking
    I.MX6 DNS 查看、修改方法
    I.MX6 android mkuserimg.sh
    I.MX6 AW-NB177NF wifi HAL 调试修改
    I.MX6 wpa_supplicant_8 编译问题
    I.MX6 MAC Address hacking
    I.MX6 MAC地址修改
    I.MX6 U-boot imxotp MAC address 写入
  • 原文地址:https://www.cnblogs.com/shizheyangde/p/7410816.html
Copyright © 2011-2022 走看看