数据库 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
相关文章
- (转)Amoeba for MySQL 非常好用的mysql集群软件
- MySQL存储过程详解 mysql 存储过程
- is-a,has-a,like-a是什么 sql server中,N''表示什么意思? 关于SQL SERVER的N前缀的理解
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
- C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法
- web安全day32:人人都要懂的LAMP--mysql-server服务安装及安防配置
- 【MySQL高级】应用优化及Mysql中查询缓存优化以及Mysql内存管理及优化
- 【MySQL高级】MySql中常用工具及Mysql 日志
- mysql启动时报错:Starting MySQL... ERROR! The server quit without updating PID file (/opt/mysql/data/mysql.pid) 的解决方法
- mysql远程连接 Host * is not allowed to connect to this MySQL server
- 连接Mysql提示Can’t connect to local MySQL server through socket的解决方法
- MySQL第四讲 MySql Undo日志 - 对聚簇索引进行CUD操作
- slave have equal MySQL Server UUIDs原因及解决
- Mysql mysql lost connection to server during query 问题解决方法
- 【mysql问题】解决2003-Can‘t connect to MySQL server on ‘ ‘(10060“Unknown error“)
- sql server 导出的datetime结果 CAST(0x00009E0E0095524F AS DateTime) 如何向mysql,oracle等数据库进行转换
- 转发 可设置skip_name_resolve参数 会出现 ERROR 2005 (HY000): Unknown MySQL server host _mysql ...
- MySQL基础之 视图
- python操作mysql数据库系列-操作MySql数据库(四)
- python操作mysql数据库系列-操作MySql数据库(二)
- MySQL 5.6 解决InnoDB: Error: Table "mysql"."innodb_table_stats" not found.问题
- mysql导出数据报错The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
- iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】
- PostgreSQL通过mysql_fdw访问MySQL数据库
- Mysql 获取当前时间函数 (类似于sql server 中的 getDate())