今天的阳光好得像刚出锅的葱油饼,我一边哼着小曲儿,一边盯着屏幕,心脏砰砰直跳。为什么?因为我折腾了整整三天的“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超详细迁移教程】
环境准备
• Windows或Linux均可,建议用Windows,界面操作顺手
• 安装SQL Server Management Studio (SSMS)
• 安装MySQL 8.0及以上,或开通云数据库MySQL
• 安装Navicat Premium或MySQL Workbench作为图形工具
导出MSSQL结构与数据
① 打开SSMS,连接源数据库
② 右键数据库→任务→生成脚本
③ 选择“仅限架构和数据”
④ 高级选项里:
语法批量替换
打开.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
创建MySQL目标库
CREATE DATABASE bookstore CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
导入结构
在Navicat里右键数据库→运行SQL文件→选择修改后的.sql→开始。
若报错,逐行修正:
数据类型不匹配 → 改为MySQL支持类型
默认值表达式 → 改为MySQL语法
处理自增主键
SELECT MAX(id) FROM your_table;
ALTER TABLE your_table AUTO_INCREMENT = 最大ID + 1;
外键检查
SHOW ENGINE INNODB STATUS\G 查看外键错误
确保字段类型、长度、字符集完全一致
迁移存储过程与触发器
MySQL语法与MSSQL差异大,需人肉重写。
建议优先重写常用过程,其余业务逻辑改到应用层。
用户权限迁移
导出MSSQL用户:
SELECT 'CREATE USER ''' + name + '''@''%'' IDENTIFIED BY ''TempPass123!'';' FROM sys.database_principals WHERE type = 'S';
在MySQL里执行生成的CREATE USER语句,再GRANT对应权限。
修改应用连接串
以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;
验证数据一致性
用SUM、COUNT核对关键表行数
用MD5校验关键字段(如订单金额、库存)
运行关键业务流程,确保功能正常
回滚预案
切换前做全量备份:
mysqldump -u root -p bookstore > bookstore_$(date +%F).sql
若出现问题,可在30分钟内回滚到MSSQL。
至此,MSSQL2MySQL迁移完成。祝你也能像我一样,在“叮”的一声后,开心地给自己加个鸡腿!