数据库迁移小记:MSSQL2MySQL的开心之旅
mssql2mysql

首页 2025-09-02 19:59:37

今天的阳光好得像刚出锅的葱油饼,我一边哼着小曲儿,一边盯着屏幕,心脏砰砰直跳。为什么?因为我折腾了整整三天的“MSSQL2MySQL”迁移,居然在刚才“叮”的一声里宣布成功!那种感觉,就像第一次把遥控飞机飞上天,遥控器差点被我摇散架。
事情是这样的:朋友开了一家小小的线上书店,后台数据库一直放在微软的SQL Server上,日子过得也算滋润。可后来阿里云搞活动,MySQL便宜得像菜市场下午的大白菜,他眼睛一亮,决定搬家。搬家就搬家吧,他偏偏把钥匙塞给我:“你技术好,你来!”——技术好就要背锅,这逻辑我服了。
第一步,先把MSSQL里的“顽固分子”揪出来。那些视图、存储过程、自定义函数,一个个拽得跟二五八万似的,MySQL根本不吃它们那一套。我祭出大杀器SQL Server Management Studio,右键任务→生成脚本,把“只限数据”改成“仅限架构和数据”,导出成.sql文件。注意,这里要把“为服务器版本编写脚本”选成SQL Server 2016之前,否则MySQL会吐槽语法太超前。
第二步,把.sql文件扔进一个文本编辑器,打开“替换全家桶”模式:把GO改成分号,把IDENTITY(1,1) AUTO_INCREMENT,把GETDATE() NOW(),把NVARCHAR VARCHAR,把方括号统统删掉……一顿操作猛如虎,一看替换八百五。改完我顺手煮了碗泡面,结果泡烂了——心情太好,忘了吃。
第三步,轮到MySQL这边接客。先在云数据库建一个空库,字符集选utf8mb4,排序规则选utf8mb4_unicode_ci,这样Emoji才不会翻车。然后用Navicat或者MySQL Workbench,把刚才整容完的.sql文件拖进去执行。如果报错,就把报错行拎出来单独审问,多半是数据类型或默认值问题,改完再塞回去。
第四步,也是最容易被忽略的:自增主键。MSSQL里IDENTITY的种子和增量迁移后可能归零,导致新插入数据主键从1开始,跟旧数据撞车。解决方法是执行:
ALTER TABLE your_table AUTO_INCREMENT = 当前最大ID + 1;
第五步,检查外键。MySQL的外键必须在InnoDB引擎下,而且字段类型、长度、字符集必须一模一样。我当时就踩坑:MSSQL里VARCHAR(50) COLLATE Chinese_PRC_CI_AS,到MySQL里长度一样但字符集不一样,外键死活建不起来。把两边字符集统一成utf8mb4,瞬间世界和平。
第六步,迁移用户权限。MSSQL的登录账号、角色、权限体系跟MySQL完全不是一个物种,只能人肉对照:把MSSQL里的用户、角色、权限导成Excel,逐条在MySQL里CREATE USER、GRANT,顺便把密码换成更安全的随机字符串。朋友看我敲得飞快,以为我在打游戏。
最后一步,业务代码改连接串。原来的Server=xxx;Database=xxx;User Id=xxx;Password=xxx;改成Server=xxx;Database=xxx;Uid=xxx;Pwd=xxx;Charset=utf8mb4;SslMode=Required。改完一运行,页面秒开,订单、库存、评论全在,那一刻我差点给自己鼓掌。
朋友给我发了个红包,备注:“辛苦费,拿去撸串!”我回他:“撸串不够,我要加瓶冰可乐!”屏幕外的我,笑得像刚放学的熊孩子。技术难题被干掉的那种爽,真的会上瘾。
好了,开心完毕,下面进入严肃教学时间——
【MSSQL2MySQL超详细迁移教程】
  1. 环境准备
    • Windows或Linux均可,建议用Windows,界面操作顺手
    • 安装SQL Server Management Studio (SSMS)
    • 安装MySQL 8.0及以上,或开通云数据库MySQL
    • 安装Navicat Premium或MySQL Workbench作为图形工具
  2. 导出MSSQL结构与数据
    ① 打开SSMS,连接源数据库
    ② 右键数据库→任务→生成脚本
    ③ 选择“仅限架构和数据”
    ④ 高级选项里:
    • 为服务器版本编写脚本 → SQL Server 2016 (130)
    • 脚本数据类型 → 仅架构和数据
      ⑤ 保存为.sql文件
  3. 语法批量替换
    打开.sql文件,批量替换:
    • GO → ;
    • 【dbo】.【Table】 → Table
    • 【Column】 → Column
    • IDENTITY(1,1) → AUTO_INCREMENT
    • GETDATE() → NOW()
    • GETUTCDATE() → UTC_TIMESTAMP()
    • ISNULL → IFNULL
    • TOP 10 → LIMIT 10
    • WITH (NOLOCK) → 删除
    • 方括号 【】 → 删除
    • NVARCHAR → VARCHAR(长度×2,因为字节差异)
    • DATETIME → DATETIME 或 TIMESTAMP
  4. 创建MySQL目标库
    CREATE DATABASE bookstore CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  5. 导入结构
    在Navicat里右键数据库→运行SQL文件→选择修改后的.sql→开始。
    若报错,逐行修正:
    • 数据类型不匹配 → 改为MySQL支持类型
    • 默认值表达式 → 改为MySQL语法
  6. 处理自增主键
    SELECT MAX(id) FROM your_table;
    ALTER TABLE your_table AUTO_INCREMENT = 最大ID + 1;
  7. 外键检查
    SHOW ENGINE INNODB STATUS\G 查看外键错误
    确保字段类型、长度、字符集完全一致
  8. 迁移存储过程与触发器
    MySQL语法与MSSQL差异大,需人肉重写。
    建议优先重写常用过程,其余业务逻辑改到应用层。
  9. 用户权限迁移
    导出MSSQL用户:
    SELECT 'CREATE USER ''' + name + '''@''%'' IDENTIFIED BY ''TempPass123!'';' FROM sys.database_principals WHERE type = 'S';
    在MySQL里执行生成的CREATE USER语句,再GRANT对应权限。
  10. 修改应用连接串
    以C#为例:
    原:Server=mssql_host;Database=bookstore;User Id=sa;Password=xxx;
    新:Server=mysql_host;Database=bookstore;Uid=app_user;Pwd=xxx;Charset=utf8mb4;SslMode=Required;
  11. 验证数据一致性
    • 用SUM、COUNT核对关键表行数
    • 用MD5校验关键字段(如订单金额、库存)
    • 运行关键业务流程,确保功能正常
  12. 回滚预案
    切换前做全量备份:
    mysqldump -u root -p bookstore > bookstore_$(date +%F).sql
    若出现问题,可在30分钟内回滚到MSSQL。
至此,MSSQL2MySQL迁移完成。祝你也能像我一样,在“叮”的一声后,开心地给自己加个鸡腿!
MySQL连接就这么简单!本地远程、编程语言连接方法一网打尽
还在为MySQL日期计算头疼?这份加一天操作指南能解决90%问题
MySQL日志到底在哪里?Linux/Windows/macOS全平台查找方法在此
MySQL数据库管理工具全景评测:从Workbench到DBeaver的技术选型指南
MySQL密码忘了怎么办?这份重置指南能救急,Windows/Linux/Mac都适用
你的MySQL为什么经常卡死?可能是锁表在作怪!快速排查方法在此
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
清空MySQL数据表千万别用错!DELETE和TRUNCATE这个区别可能导致重大事故
你的MySQL中文排序一团糟?记住这几点,轻松实现准确拼音排序!
别再混淆Hive和MySQL了!读懂它们的天壤之别,才算摸到大数据的门道