数据库 SQL Server 到 MySQL 迁移方法总结
最近接手一起老项目数据库 SQL Server 到 MySQL 的迁移。因此迁移前进行了一些调查和总结。下面是一些 SQL Server 到 MySQL 的迁移方法。
1. 使用 SQLyog 迁移
具体方法可以参加:http://www.cnblogs.com/gaizai/p/3237907.html
优点:该迁移方法很简单,灵活,迁移时,可以进行字段的修改,比如在sql server中原来是datetime,然后迁移到mysql时你可以配置成timestamp;
成功率很高;
缺点:迁移很慢!这是该方法最大的缺点,如果表的数据量达到几十万行,甚至几百万行,你会发现迁移起来真的很慢。明显比其他迁移方法慢很多。
2. 使用 powerdesigner 和 sql server 的脚本导出功能 来迁移
第一步:该方法首先使用 powerdesigner,对sql server数据库,进行逆向工程,得到E-R图,然后生成MySQL的建表语句。完成数据库结构的迁移;
当然表结构的迁移,不使用powerdesigner一样也是可以的。比如我将表结构导出成语句,然后手动进行修改,然后在MySQL中运行,也是一样的;
第二部:然后使用 sql server的工具 SSMS,将sql server数据库中的表的数据,导出成insert语句,每个表对应导出一个文件,然后对文件进行一些处理,
然后导入到MySQL数据库中。
具体的对 sql server 导出的sql文件的处理方法,参见:http://www.cnblogs.com/digdeep/p/4822499.html
3. 使用Oracle MySQL Server 官方的 workbeach 工具进行迁移
mysql官方有两篇 sql server 迁移到 mysql的指导手册,可以参考:
http://www.mysql.com/why-mysql/white-papers/guide-to-workbench-migration-wizard/
http://www.mysql.com/why-mysql/white-papers/guide-to-migrating-from-sql-server-to-mysql/
上面的连接中可以下载到pdf文件,安装文件的说明,使用 workbeach 工具就能进行迁移。因为 workbeach 有30天的使用期,所以完全不需要担心;
在workbench 连接sql server时,用户需要有 view any database 的权限。不然workbench无法访问sql server的表结构的元数据,从而无法进行迁移。
还有使用 Navicat 来进行迁移的方法,方法和 SQLyog 是类似的。
4. 三种方法比较
方法一只适合数据量小的迁移方法,如果数据量大,迁移时间短,基本是不适合的;
方法二是比较好的方法,缺点就是sql server导出的insert脚本中 datetime字段和decimal需要自己写代码进行转换,稍微有点麻烦;
第三种方法应该是最佳的选择,比较简单,速度也快,又不需要自己进行字段的处理。
所以对于数据量比较大的情况,应该选择方法三或者方法二。
5. 迁移需要注意的一些问题
sql server 在向 mysql 迁移时,需要注意的一些问题,在连接 http://www.mysql.com/why-mysql/white-papers/guide-to-migrating-from-sql-server-to-mysql/ 的文档中都有说明。下面是一些具体的注意事项:
1)唯一索引的不同,sql server的唯一索引的字段只能允许存在一个null值,而mysql,一直oracle中唯一索引对应的字段都允许存在多个null值;
2)ifnull 与 isnull ,sql server使用的是 ifnull,而mysql 中要使用 isnull:
<update id="updateModelAccuracyById" parameterClass="java.util.Map">
update model_model
set accuracy_num=ifnull(accuracy_num,0) + 1, accuracy_total=ifnull(accuracy_total,0) + #accuracyTotal:DECIMAL#
where id=#id:BININT# and status=1
</update>
3)所有的分页sql都需要重写:
SQL server的分页(使用的是 row_number() over(......)):
<select id="getModelChoiseListByUserId" parameterClass="java.util.Map" resultClass="net.xxx.xxx.dataobject.model.ModelChoiseVo">
select * from (select row_number() over(order by c.choise_time desc) as rowid,
c.id as id,m.gid as gid,m.member_id as memberId,mb.g_Member_Nickname as memberName,
mb.g_Member_Mobile as memberMobile,c.user_id as userId,
... ...
m.order_num as orderNum,m.model_satisfaction as modelSatisfaction,m.height as height,
m.professional_type professionalType
from model_model m
inner join model_choise c on m.id=c.model_id
inner join Members mb on mb.g_MemberID=m.member_id
where m.status=1
<dynamic >
<isNotNull prepend="and" property="userId">
c.user_id = #userId:BIGINT#
</isNotNull>
<isNotNull prepend="and" property="status">
c.status = #status:INTEGER#
</isNotNull>
</dynamic>
) tt where rowid >= #minRow:INTEGER# and rowid <= #maxRow:INTEGER#
</select>
用mysql重写:
<select id="getModelChoiseListByUserId" parameterClass="java.util.Map" resultClass="net.xxx.xxx.dataobject.model.ModelChoiseVo">
select
c.id as id,m.gid as gid,m.member_id as memberId,mb.g_Member_Nickname as memberName,
mb.g_Member_Mobile as memberMobile,c.user_id as userId,
m.id as modelId,c.status as status,
c.pay_amount as payAmount,c.accuracy as accuracy,
... ...
m.order_num as orderNum,m.model_satisfaction as modelSatisfaction,m.height as height,
m.professional_type professionalType
from model_model m
inner join model_choise c on m.id=c.model_id
inner join Members mb on mb.g_MemberID=m.member_id
where m.status=1
<dynamic>
<isNotNull prepend="and" property="userId">
c.user_id = #userId:BIGINT#
</isNotNull>
<isNotNull prepend="and" property="status">
c.status = #status:INTEGER#
</isNotNull>
</dynamic>
order by c.choise_time desc
limit #minRow:INTEGER#, #maxRow:INTEGER#
</select>
4)存储过程的迁移是最麻烦的:
存储过程的语法存在很大的不同。
http://www.mysql.com/why-mysql/white-papers/guide-to-migrating-from-sql-server-to-mysql/ 的文档中有一些说明。
下面是一些mysql存储过程的参考文章:
http://www.cnblogs.com/digdeep/p/4818660.html
http://www.cnblogs.com/digdeep/p/4814020.html
数据库 SQL Server 到 MySQL 迁移方法总结的更多相关文章
- Oracle、SQL Server、MySQL分页方法
测试用例:查询TEST_TABLE表中TEST_COLUMN列的第10-20条数据 1,Oracle分页方法 SELECT A.* FROM ( SELECT ROWNUM ROWNO, B.* FR ...
- 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析
对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...
- 从SQL Server到MySQL,近百亿数据量迁移实战
从SQL Server到MySQL,近百亿数据量迁移实战 狄敬超(3D) 2018-05-29 10:52:48 212 沪江成立于 2001 年,作为较早期的教育学习网站,当时技术选型范围并不大:J ...
- 数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接
前言 DataGrip:Jet Brains出品的一款数据库管理工具(没错,是Jet Brains出品,必属精品).DataGrip整合集成了当前主流数据库(如:SQL Server, MySQL, ...
- 使用 FTP 迁移 SQL Server 数据_迁移数据_快速入门(SQL Server)_云数据库 RDS 版-阿里云
背景信息 阿里云数据库 SQL Server 版导入数据有如下限制: 仅支持导入 SQL Server 2005.SQL Server 2008.SQL Server 2008R2 版本数据 仅支持全 ...
- Decimal为SQL Server、MySql等数据库的一种数据类型
Decimal为SQL Server.MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部份以及小数部分的位数.使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储存空间, ...
- Linux + .net core 开发升讯威在线客服系统:同时支持 SQL Server 和 MySQL 的实现方法
前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程. 有很多朋友一直提出希望能够支持 MySQL 数据库,考虑到已经有朋友在用 SQL Server,我在升级的过程中 ...
- Linux 运行升讯威在线客服系统:同时支持 SQL Server 和 MySQL 的实现方法
前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程. 有很多朋友一直提出希望能够支持 MySQL 数据库,考虑到已经有朋友在用 SQL Server,我在升级的过程中 ...
- SQL Server to MySQL
使用 Navicat 导入向导迁移 会遇到以下问题 SQL Server 中的 GUID 类型字段会变成 {guid} 多个外层花括号, 导致程序问题. 部分字段类型长度不大一致, 需要手工调整. . ...
随机推荐
- js中获取URL中指定的查询字符串
js中获取URL中指定的搜索字符串,主要利用location对象实现,废话少说,上代码. function getSearchString(key) { // 获取URL中?之后的字符 var str ...
- Delphi Berlin 10.1 for iOS 成生 info.plist 顺序改变了
在 Delphi Seattle 10 update 1 版本(含之前版本),只要 Project > Build 会立即生成 info.plist 如果需要修改 info.plist 可以利用 ...
- PyCharm不能自动import解决方法_PyCharm cannot auto import package troubleshooting
本人起初是用Eclipse+Pydev学习python的,其实也觉得挺好用.不过后来因为同事推荐去试了下PyCharm,就一发不可收拾的爱上了. 严格来说,题目上的问题其实对于很多人都不算是问题,但是 ...
- Hewlett-Packard Enterprise 实习总结日记
人生的第一份正式的实习工作时在HP,受益颇多.突然要离开了,还是非常舍不得的.在公司实习这半年多时间,写篇博客,对这期间的成长经历做一些总结.先说一个典故:我叫史蒂夫·乔布斯,我想找一些零件来做一台频 ...
- Java主要知识结构
Java基础(建议看java编程规范): Java语言基础:数据类型,命名规则,权限控制符,注释 操作符:算术操作符,逻辑操作符,关系操作符,移位操作符,按位操作符 流程控制 数组 字符串 Java高 ...
- 通过“回文字算法”复习C++语言。
一.什么是回文字 给定一个字符串,从前往后读和从后往前读,字符串序列不变.例如,河北省农村信用社的客服电话是“96369”,无论从后往前读,还是从前后往后读,各个字符出现的位置不变. 二.功能实现 ( ...
- Mac上安装go环境
Mac 安装 GO语言开发环境 官网:https://golang.org/ go语言的安装:http://docscn.studygolang.com/doc/install 下载:go1.7rc3 ...
- [iOS] 建立与使用Framework
[iOS] 建立与使用Framework 前言 使用XCode开发iOS项目时,开发人员可以将可重用的程序代码,封装为Library或是Framework来提供其他开发人员使用.这两种封装方式在使用的 ...
- Microsoft SQL Server Compact 4.0&&ADO.NET Entity Framework 4.1&&MVC3
最近重新查看微软MvcMusicStore-v3.0的源代码,发现忽略了很多重要的东西,特别是数据访问那一部分. 首先Microsoft SQL Server Compact 4.0 详细的介绍和下载 ...
- 为什么URL中的中文需要Encode两次?
在URL中传参的时候常常需要传入中文,这个时候就需要对中文参数进行编码,即URLEncode.但是,常常是Encode两次,而不是一次,为什么呢? 首先要知道,tomcat会自动解码一次: 这样的话, ...