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

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

  •  
  •   dreamswhite · 3 天前 · 3014 次点击

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

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

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

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

    十几年的老系统动起来也伤筋动骨,而且还是最核心的 DB 层。
    mikewang
        37
    mikewang  
       2 天前
    需要国产化的话,找对应厂商做迁移最好。http://www.itsec.gov.cn/aqkkcp/cpgg/
    导数据是一部分,SQL 方言和计算表现不一样也会产生各种兼容性问题,需要慎重考虑的。
    noparking188
        38
    noparking188  
       2 天前
    之前做过方案,将三千张表、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  
       2 天前
    袋鼠正在完善同步功能,把你反馈的问题作为需求收录了:
    https://gitee.com/dbkangaroo/kangaroo/issues/IAUVOC

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