V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dreamswhite
V2EX  ›  数据库

请教 SQLServer 迁移到 MySQL 方案, 1W+DB

  •  
  •   dreamswhite · 36 天前 · 3766 次点击
    这是一个创建于 36 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公司是传统企业,一个十几年的系统,使用 SQLServer 存储数据。累积到现在已有 1W+ DB ,每个 DB 下 100+表。想全部迁移至 MySQL 。SQLServer 和 MySQL 部署在内网不同服务器,MySQL 操作系统为 Linux 。

    已尝试的方案:

    • Navicat Premium: 勉强使用中。优点是一次可以设置迁移多个 DB (迁移依旧是串行),缺点是不完全成功率(一个 DB 下全部表迁移成功算完全成功)大概 50%
    • MySQL Workbench: 放弃,一次只能设置迁移一个 DB ,需要操作的次数太多
    • TapData: 放弃,一次只能设置迁移一个 DB ,需要操作的次数太多

    想问下有没有更好的方案?

    53 条回复    2024-10-05 09:16:17 +08:00
    youisme
        1
    youisme  
       36 天前
    正儿八经的找个 dba 或者技术顾问来做这个事情吧。。。
    ferock
        2
    ferock  
       36 天前 via iPhone
    花点钱…别那么抠
    dreamswhite
        3
    dreamswhite  
    OP
       36 天前
    @ferock 可以花钱,花钱的话应该找什么样的人或者厂商?
    sagaxu
        4
    sagaxu  
       36 天前 via Android
    用户和权限,表结构,数据,存储过程,触发器等等,每一项都可能遇到兼容性问题,不是迁完不报错就算成功的。这事情需要专业的公司提供服务。
    liaojl
        5
    liaojl  
       36 天前 via iPhone
    可以花钱的话,还是建议续费 SQL sever 吧,这看起来工作量就不小,还有数据库的兼容性问题,以及后续的各种测试。
    ferock
        6
    ferock  
       36 天前 via iPhone
    @dreamswhite #3

    招个 dba , 或者找个公司做数据改造,或者,回到原来
    billzhuang
        7
    billzhuang  
       36 天前 via iPhone
    为什么要迁移到 mysql ?
    june4
        8
    june4  
       36 天前
    可怕为啥会有 1w 个 db 这么多,难道是结构都是一样的,只是数据新旧不同,那感觉还好,一个能成了就行
    wangee
        9
    wangee  
       36 天前
    找专业的 DBA 吧,这数据量太哈人了
    beneo
        10
    beneo  
       36 天前
    https://www.clougence.com/ 公司帮你弄吧
    dreamswhite
        11
    dreamswhite  
    OP
       36 天前
    @billzhuang 国产化需求
    dreamswhite
        12
    dreamswhite  
    OP
       36 天前
    @june4 历史原因,最开始的代码就写成了这个样子 = =
    beneo
        13
    beneo  
       36 天前
    国产化 更不应该 用 MySQL ,去弄下 PolarDB ,信创数据库
    qping
        14
    qping  
       36 天前 via Android
    这个需要一段时间吧,同步完数据不需要测试,试运行一段时间?这个时间差内产生的心属于如何处理?

    你需要先制定一个迁移方案,而不只是迁移工具
    qping
        15
    qping  
       36 天前 via Android
    纠正:
    这个时间差内产生的心属于如何处理?
    ->
    这个时间差内产生的新数据如何处理?
    idragonet
        16
    idragonet  
       36 天前
    Mysql 不是国产数据库。
    Flourite
        17
    Flourite  
       36 天前
    这迁移。。。性能降级、功能也对不上吧
    wheat0r
        18
    wheat0r  
       36 天前
    @dreamswhite #11 那你迁了白迁
    realpg
        19
    realpg  
       36 天前
    迁移预算几位数?
    qfdk
        20
    qfdk  
       36 天前 via iPhone
    不大靠谱. 为社么这么说... 我司就有一个 erp.... 大概 3k 多的表吧. 里面的 process 也都要重写... 工作量太大了. 甚至有些祖传脚本..... 然后业务代码里面有些用到直接执行 sql 代码的地方... 有些 语句并不通用. 要是用的 orm 可能没有这样的问题... 但是有些 orm 搞不定的真的是语句....
    akira
        21
    akira  
       36 天前
    这活。。大坑啊。。。技术验证都没验证的吧。
    讲真, 数据迁移属于这个事情里面最最简单的部分了。
    sql 改造,代码改造 那边要做的事情多了去了
    charleschilips
        22
    charleschilips  
       36 天前
    找个兼容 SQL server 的国产数据库
    liuxey
        23
    liuxey  
       36 天前
    如果有国产化需求,有些数据库供应商采购的时候可以附加迁移服务
    Bingchunmoli
        24
    Bingchunmoli  
       36 天前 via Android
    说实话之前有个国家项目(应该是省级)的数据库,SQLServer 很大,直接 navicat 迁的 mysql , 因为后台也改了所以还好一点。你这旧项目还在的话,能不动就不动是最好的方案吧
    yinmin
        25
    yinmin  
       36 天前 via iPhone
    微软 sql server 和 mysql 的 SQL 语法不兼容的,软件需要重构工作量不低。

    其实,你用工具跨数据库迁移,本质上也是读数据写数据。自己直接写一个迁移程序,不复杂。mysql 的 insert 支持一条命令插入多行记录的,你组成 500 行记录一条 insert ,迁移速度也很快的。
    adoal
        26
    adoal  
       36 天前
    建议不迁移。
    adoal
        27
    adoal  
       36 天前
    传统业务系统换数据库,往往不是换数据库的事。得重构应用层代码做适配。
    wtks1
        28
    wtks1  
       36 天前
    mysql 可不是国产化数据库,你这么迁移了也是做白工
    dreamswhite
        29
    dreamswhite  
    OP
       36 天前
    @Flourite 性能降级,怎么说?
    chenzi0103
        30
    chenzi0103  
       36 天前
    可以给一个逻辑
    1 ,首先使用代码先将 SQLServer 每个 db 下面的表的结构整理处理
    2 ,然后将每个表的表结构通过 llm 转译成 mysql 的结构,并且保存起来
    3 ,通过分布式的框架,每次将每个表的一部分数据保存下来,变成 parquet 文件
    4 ,通过刚才保存的表的结构,使用一个分布式框架将 parquet 文件通过某种方式快速的插入到 mysql 数据库中。并且保存其中的记录
    lsww
        31
    lsww  
       36 天前
    有预算吗?帮你搞定
    forgottencoast
        32
    forgottencoast  
       36 天前
    我 20 年前干过类似的,公司觉得 SQLServer 数据库性能不好,把 SQLServer 迁移到 Oracle 。
    大几十个人干了大半年,每个功能模块的每个页面里面的 SQL 语句几乎都要改,至少要跑过一次。
    dreamswhite
        33
    dreamswhite  
    OP
       36 天前
    @chenzi0103 llm 转表结构 + parquet 存数据,学到了🙇‍
    fbzl
        34
    fbzl  
       36 天前 via iPhone
    SQLServer 藏了很多存储过程,触发器吧
    yjd
        35
    yjd  
       36 天前
    就像上面说的,不单单数据和表结构问题这 2 个导没啥大问题。一堆存储过程,触发器等等才是难弄的地方。
    joyhub2140
        36
    joyhub2140  
       36 天前
    听楼上的,还是找信创的数据库吧,花钱有厂家兜底,要是自己来,责任太重了,而且容易出锅。

    十几年的老系统动起来也伤筋动骨,而且还是最核心的 DB 层。
    mikewang
        37
    mikewang  
       36 天前
    需要国产化的话,找对应厂商做迁移最好。http://www.itsec.gov.cn/aqkkcp/cpgg/
    导数据是一部分,SQL 方言和计算表现不一样也会产生各种兼容性问题,需要慎重考虑的。
    noparking188
        38
    noparking188  
       36 天前
    之前做过方案,将三千张表、10TB 数据从 SQL Server 迁移到 Amazon Redshift 。

    https://zhiweio.notion.site/10TB-SQL-Server-Amazon-Redshift-1aeb24862723455d919de6edf035bdeb
    借助 Linux 管道文件加速 SQL Server 数据迁移 Redshift

    如何将 10TB 数据从 SQL Server 迁移到 Amazon Redshift
    https://zhiweio.notion.site/Linux-SQL-Server-Redshift-f5c2b5dcdeb646f793de494954244a8a

    这个工具是给 bcp 套了层壳,方便将 SQL Server 数据最高效率下载、切块、压缩并上传的 S3:
    https://github.com/zhiweio/StreamXfer

    这个方案能够支撑每天全量迁移一遍 SQL Server 全库 10TB 数据到 Amazon Redshift 。

    参考建议:
    1. 表结构迁移可以基于 sqlglot 库写一个建表语句翻译器,先迁移全部表结构。
    2. SQL Server 数据导出用 bcp ,或者用封装的 StreamXfer ,记得一定用 JSON 格式,有一些坑;
    3. 导入 JSON 到 MySQL 用 MySQL Shell Utilities ,https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-json.html ,这个支持管道文件,可以实现 SQL Server -> bcp -> mysqlsh -> MySQL ,效率极高。
    4. Stored Procedure 的迁移需要业务开发去挨个翻译、测试 SQL 。

    如有需要可以私聊
    andytao
        39
    andytao  
       36 天前
    袋鼠正在完善同步功能,把你反馈的问题作为需求收录了:
    https://gitee.com/dbkangaroo/kangaroo/issues/IAUVOC

    相信很快就能给予更好的支持了,敬请关注。
    oamu
        40
    oamu  
       36 天前
    @idragonet #16
    @wtks1 #28 一看就是没呆过国企,没见过“兼容” mysql 的国产数据库。
    liprais
        41
    liprais  
       36 天前
    @chenzi0103 洗洗睡吧,光数据类型转换就够你喝一壶的,我只能说隔行如隔山
    bugmakerxs
        42
    bugmakerxs  
       36 天前
    问问阿里云 dts 有没有私有化解决方案
    bugmakerxs
        44
    bugmakerxs  
       36 天前
    或者先同步到云上 mysql ,再自己从云上 mysql 同步到本地 mysql 。
    forty
        45
    forty  
       35 天前
    如果只是表和视图,其实很容易了,如果还有存储过程,那估计没法自动转换了。
    老的系统,能跑就尽量不动,是至理名言。搞出问题是大概率的,修修补补再折腾个半年都算是正常的。
    LanhuaMa
        46
    LanhuaMa  
       35 天前
    @dreamswhite #11 mysql 怎么也成国产的了
    wtks1
        47
    wtks1  
       35 天前
    @oamu #39 兼容 mysql 的国产数据库很多,但 mysql 本身可是不算国产化数据库的,根本过不了国产化验收,没干过这行的就别瞎 bb 了
    bthulu
        48
    bthulu  
       35 天前
    仅仅是迁移数据的话, 很简单, 直接用阿里云的 DTS 功能就行了, 可以在不中断业务的情况下同步数据到 MYSQL.
    oamu
        49
    oamu  
       35 天前
    @wtks1 #47 搞笑,某个鸭子数据库,支持 mysql 所有操作,支持 mysql 的所有工具,那它就是 mysql ,我把它当作 mysql ,并没说我一定实际使用 mysql 。某个 xx 系统完美兼容安卓,应用开发也完全和安卓的一样,但你敢说它不是国产系统?
    guiyumin
        50
    guiyumin  
       35 天前
    我觉得你别迁移
    对你没任何好处
    tairan2006
        51
    tairan2006  
       35 天前 via Android
    国产化别用 mysql ,找个兼容 sql server 的
    alinwu05
        52
    alinwu05  
       35 天前
    用过一个工具叫 sqllines, 便宜好用!
    dreamswhite
        53
    dreamswhite  
    OP
       33 天前
    @noparking188 能麻烦加下我的 v 吗: dreamswhite
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1116 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:59 · PVG 02:59 · LAX 10:59 · JFK 13:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.