SQL Server数据库 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 &gt;= #minRow:INTEGER# and rowid &lt;= #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

 

相关文章