论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
数据库
›
Mysql
›
数据库转换日记---从MSSQL Server导数据到MySQL ...
数据库转换日记---从MSSQL Server导数据到MySQL
刘俊凯
论坛元老
|
2023-3-16 18:17:23
|
显示全部楼层
|
阅读模式
楼主
主题
1010
|
帖子
1010
|
积分
3034
前言
近期将ERP后台从MSSQL SERVER过渡到了MYSQL,确实经历了一番波折,转换过程虽然极其痛苦,这里也不卖惨了。将过程记录一下,有人愿意的话共同学习。
前面分享过操作系统和数据库的安装,倒是没啥需要注意的地方,前面说的极其痛苦,是从数据导完开始的,暂时还体会不到,本篇介绍一下如何将数据从MSSQL SERVER导出到MySQL数据库。
极其重要
如果各位由相同诉求,一定要先做测试,不可在生产环境直接干活,这点特别重要!
没有测试成功前不可在生产环境直接干活!
没有测试成功前不可在生产环境直接干活!!
没有测试成功前不可在生产环境直接干活!!!
测试环境搭建就不太多介绍了吧,也就是将源数据库做个备份,找台机器装个相同数据库,将备份数据导进去,这个新导进去的库,跟源库最大的区别是两个,也是我们最关注的两个:
1、数据弄坏了不影响生产系统;
2、数据库没有应用对其有读写操作。
如果生产环境想要数据导过来,最好的办法是说服领导不要这么干。说服不了的话,至少要多次测试,将碰到的问题,解决的方法全部记录在案,评估通过再停机干活!
以下包括后面的文章,都是针对测试环境的介绍,小编也是多次测试才敢动ERP系统后台的。
源数据分析
首先得了解一下迁移目标。我的ERP,经过了5年半的使用,现有数据表188个,记录条数1033483条,全部都是文本记录,没有文件、图形等记录。
打开Microsoft SQL Server Management Studio客户端工具,连接到MSSQL数据库后,可以通过数据库的系统视图里面查到数据表个数和每个数据表的记录条数。通过新建查询输入下面的命令就可以拿到了。
SELECT a.name,b.rows FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE a.xtype='U' AND b.indid=1 order by a.name
干活之前,可以将这个记录先复制到EXCEL里面,用作记录,等迁移完成后,核对MySQL数据库里面的数据表和记录数。下图是我的部分记录表:
本次我迁移的记录100多万条里面,有355630条日志记录,分别在6个日志表里面,分别是常规日志、商品日志、单据日志、单位日志、操作动作日志和错误日志。考虑到代码中日志操作都在几个函数里面,更改比较简单,计划将日志记录和其他记录分成两个库,这样后期对数据库备份迁移啥的也节约一点空间,毕竟不出问题日志记录并不重要,因为除了日志记录外,还有一些往来表,包括单位往来表、商品往来表、银行往来表等等。
188个表格里面,有些表记录数为0,有些表记录数过万。最少的表格字段数2个,最多的过百。相对来说算是个较复杂的系统了。
数据迁移
数据迁移有很多方法,实际上我也试了多种方法,不过最终弃用的就不介绍了,弃用原因无非是自己英文水平太烂,自己基础知识太薄弱等等,介绍一下最终采用的方法。
最后我选择了SQLYOG工具,感觉用惯了微软的SMSS工具后,还是这个工具更相似一点。
我们前面安装数据库的时候,顺手建了两个库,分别是ErpDb和LogDb,打开了root账号的远程访问,同时更改了数据库的端口号。
打开SQLYOG,输入IP地址、用户名、密码、端口号,连接上我们新装上的MySQL服务器。
测试连接正常就可以连接到MySQL了。
点击菜单【数据库】---【导入】---【导入外部数据】,选择【开始新工作】,点击【下一步】。选择【任何ODBC数据源】。
先创建一个连接SQL SERVER的ODBC数据源文件。
【建立新的DSN】---【下一页】---【下一页】---【浏览】命名一个文件名---【下一页】---【完成】
服务器的后面输入SQL SERVER服务器地址,如果不是默认1433端口的话,加上逗号跟上端口号。
输入连接SQL Server的用户名和密码,【下一页】,更改默认的数据库为我们需要导数据的那个库。【下一页】---【完成】---【测试数据源】---成功后【确定】。
数据源建好后,选择该DSN文件,输入连接的用户名和密码。
输入要导入数据的MySQL服务器参数,选择要导入的数据库名称。点击【下一页】。
选择【从数据源拷贝表】,点击【下一页】。选择要拷贝的表,打勾后,点击MAP里面查看映射情况。
这个地方有几个建议,有些表不修改可能会不成功:
1、原表bit类型的,改为bool类型;
2、原表timestamp类型的,默认更改为blob类型,手动更改为datetime类型或者timestamp类型;
3、原表int、smallint、largeint类型的,将长度去掉;
4、原表datetime类型的,默认更改为timestamp类型,建议手动改为datetime,或者将长度去掉;
高级选项里面,存储类型选择InnoDB,是否导入外键索引根据需要选择。
然后直接下一步,到立即运行就可以了。
数据导完发现的问题
我的188个表,103万条记录,根据表大小,分了5个任务,反正一晚上搞定了。
搞定之后到MySQL里面做个检查,为了保证准确,我对每个表做了一个检查,命令为:
show tables;
查看表都有了。
select count(*) from XXX;
查看每个表的记录都全了。
数据导完后,发现了很多问题,我用自己的方法一一解决了,下篇介绍出来,可能大神们对我的方法不屑,不过不喷就好。
列举几个:
1、MSSQL的命令,最后是没有符号的,而MySQL名利最后是需要加分号;的。
2、MSSQL的命令,对数据表的表名、字段名的大小写不敏感,而MySQL对这些大小写很敏感。
3、MSSQL的当前时间表示为GETDATE(),MySQL表示为SYSDATE()。
4、MSSQL的日期计算函数为DATEDIFF,而MySQL的日期计算函数为TIMESTAMPDIFF。
5、MSSQL里面字段名可以用[]括起来,MySQL里面只能用()。
6、MSSQL是用top x来限制条数,MySQL是用limit x来限制条数。
7、MSSQL的字段名相连的命令直接用+就可以了,MySQL需要用CONCAT连接字符串。
作者|IT老叔
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
刘俊凯
论坛元老
这个人很懒什么都没写!
楼主热帖
牛客SQL刷题第三趴——SQL大厂面试真题 ...
IDEA中集成Git操作以及关于Git中分支说 ...
github上fork2.4k,star8.7k的这款状态 ...
Bug驱动开发探讨
SAP MM 使用两个STO实现免关税跨国公 ...
MySQL ——select语句 一条龙服务 ...
哈工大信息安全概论期末复习 ...
袋鼠云春季生长大会最新议程来啦!4月2 ...
事务
2023H1中国超融合市场第二!深信服超融 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
.Net
鸿蒙
云原生
程序人生
SQL-Server
DevOps与敏捷开发
快速回复
返回顶部
返回列表