将SQL Server数据迁移到MySQL

sqlserver-to-mysql-docc

sqlserver-to-mysql-docb

sqlserver-to-mysql-doca

本文作者: GavinDong

版权属于: GavinDong博客

文章链接: https://gavindong.com/1276.html

如果使用过程中遇到问题,可 **点击此处** 交流沟通。

版权所有,转载时必须以链接形式注明作者和原始出处及本声明。

(0)

相关文章

回复 ag

登录后才能评论

评论列表(14条)

  • ag的头像
    ag 2017.08.16 00:17

    重要的sqlserver到mysql数据库迁移,用DB2DB或者mysql-workbench,不要用其他工具!

    workbench下载:
    http://dev.mysql.com/downloads/file/?id=466686

    DB2DB下载:
    百度一下,有绿色版,也可以购买商业版。

  • ag的头像
    ag 2017.08.16 00:17

    转载备用:http://www.cnblogs.com/digdeep/p/4841361.html
    数据库 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/w … ql-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/w … ql-server-to-mysql/ 的文档中都有说明。下面是一些具体的注意事项:
    1)唯一索引的不同,sql server的唯一索引的字段只能允许存在一个null值,而mysql,一直oracle中唯一索引对应的字段都允许存在多个null值;
    2)ifnull 与 isnull ,sql server使用的是 ifnull,而mysql 中要使用 isnull:
    3)所有的分页sql都需要重写:
    SQL server的分页(使用的是 row_number() over(……)):
    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

  • ag的头像
    ag 2017.08.16 00:17

    注意:
    数据迁移到MySQL之后,由于存储机制的不同,容量将可能会非常大!
    例如,我同步了一张在SqlServer中容量为19M左右的表到MySQL之后,大小为56M,可见增大了好多(MySQL这边用的是InnoDB)。

  • ag的头像
    ag 2017.08.16 00:16

    啥意思呢?意思就是当你准备迁移的时候,要确保目标机器的磁盘空间足够、要准备好足够的时间。

  • ag的头像
    ag 2017.08.16 00:16

    SQLServer查看一个库里所有表的数据量:
    在SqlServer Management Studio中选中一个数据库,然后执行下面的查询,然后将结果另存为CSV导出之后方便查看:
    SELECT a.name,b.rows FROM sysobjects a
    INNER JOIN sysindexes b ON a.id=b.id
    WHERE b.indid IN(0,1) AND a.Type=’u’
    ORDER BY a.name

  • ag的头像
    ag 2017.08.16 00:16

    SqlServer中的视图迁移到MySQL中后,会变成真实存在的“表”,即从SQLServer复制数据库进入MySQL的时候会发现待选择的数据库表清单比SQLServer中长很多!

  • ag的头像
    ag 2017.08.16 00:16

    SqlYog并不是实时存储到MySQL中的,而是先从SqlServer读取一批数据,之后再更新到MySQL,如此周而复始。如果一张表数据非常多,比如100W条,则SqlYog滚动日志会显示很多次已经传输XXXX条记录很多次,直到最后一次才完全结束。

  • ag的头像
    ag 2017.08.16 00:16

    SQLyog,sqlserver datetime到mysql datetime
    使用SQLyog倒数据库表时,如果是从sqlserver向MySQL导入,那么遇到datetime类型的字段,SQLyog会把datetime转换为timestamp。
    而mysql的timestamp时间范围是’1970-01-01 08:00:01′ and ‘2038-01-19 11:14:07’。
    这样,sqlserver中’1900-01-01 00:00:00’的日期到了mysql就变成’0000-00-00 00:00:00’,数据被强制转换。
    如果不想被强制转换,就得在表导入mysql前,手动调整为datetime,如果datetime字段较多,一个个去调整那太麻烦了。
    可是SQLyog又没有可以统一设置的地方,这时,使用下面方法可以满足要求:
    使用SQLyog的Import External Data工具
    1、创建一个job file。“start a new job”->一系列配置步骤可以参考网上教程->勾选要导入的表->Run immediately取消选中,选中saving options,save job file->把job file存放本地
    2、编辑该job file,批量替换timestamp为datetime。
    3、使用该job file进行导入。重新打开Import External Data工具,使用Edit a saved job选择job file导入

  • ag的头像
    ag 2017.08.16 00:15

    推荐Navicat Premium_11.2.7简体中文版,比SqlYog快太多(可能是我的SqlYog版本比较老爸~~)

  • ag的头像
    ag 2017.08.16 00:15

    数据迁移可以用sqlyog ultimate或者Navicat Premium,都不错的!

  • ag的头像
    ag 2017.08.16 00:15

    嗯What is the ibtmp1 file in MySQL 5.7?
    http://www.tuicool.com/articles/r6BRBz

  • ag的头像
    ag 2017.08.16 00:15

    MySQL InnoDB:
    MySQL存储引擎选择 InnoDB与MyISAM区别:
    根据经验来看,如果是一些小型的应用或项目,那么MyISAM 也许会更适合。当然,在大型的环境下使用MyISAM 也会有很大成功的时候,但却不总是这样的。如果你正在计划使用一个超大数据量的项目,而且需要事务处理或外键支持,那么你真的应该直接使用InnoDB方式。但需要记住InnoDB 的表需要更多的内存和存储,转换100GB 的MyISAM 表到InnoDB 表可能会让你有非常坏的体验。
    ibd是MySQL数据文件、索引文件,无法直接读取。
    frm是表结构文件,可以直接打开。
    ib_logfile0 和ib_logfile1 是二进制日志文件,可以用mysqlbinlog工具检查。
    ibdata1 是innodb引擎表的表空间文件,存放数据,索引。
    ib_buffer_pool
    在关闭MySQL时,会把内存中的热数据保存在磁盘里ib_buffer_pool文件中,位于数据目录下。
    在启动MySQL后,会自动从ib_buffer_pool文件加载热数据到Buffer_Pool缓冲池里。
    auto.cnf 是存放本MySQL服务器的UUID的(唯一识别号)
    关于mysql-bin文件:
    mysql-bin.001397
    my.cnf的配置建议:
    log-bin=mysql-bin
    binlog_format=mixed
    server-id = 1
    expire_logs_days = 10
    early-plugin-load = “”
    ibtmp1文件的解释:
    http://www.tuicool.com/articles/r6BRBz
    If you’re running MySQL 5.7, you might have noticed the ibtmp1 file located in the datadir, and you might be wondering exactly what this file is.
    In 5.7, InnoDB added a separate tablespace for all non-compressed InnoDB temporary tables. This new tablespace is named ibtmp1 and is located in the datadir by default.
    “The new tablespace is always recreated on server startup. … A newly added configuration file option, innodb_temp_data_file_path, allows for a user-defined temporary data file path. For related information, see InnoDB Temporary Table Undo Logs.”

  • ag的头像
    ag 2017.08.16 00:15

    mysql binlog日志自动清理及手动删除
    方法1:
    # vim /etc/my.cnf //修改expire_logs_days,x是自动删除的天数,一般将x设置为短点,如10
    expire_logs_days = x //二进制日志自动删除的天数。默认值为0,表示“没有自动删除”
    此方法需要重启mysql,附录有关于expire_logs_days的英文说明
    一般,设置为10天。
    my.cnf的配置建议:
    log-bin=mysql-bin
    binlog_format=mixed
    server-id = 1
    expire_logs_days = 10
    early-plugin-load = “”
    方法2:
    手动清除binlog文件
    # /usr/local/mysql/bin/mysql -u root -p
    > PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY); //删除10天前的MySQL binlog日志,附录2有关于PURGE MASTER LOGS手动删除用法及示例
    > show master logs;
    也可以重置master,删除所有binlog文件:
    # /usr/local/mysql/bin/mysql -u root -p
    > reset master; //附录3有清除binlog时,对从mysql的影响说明

  • ag的头像
    ag 2017.08.16 00:14

    **注意:这里要对bit类型和date(datetime)类型进行映射,否则会迁移失败,因为sqlServer中bit类型与mysql中的bit不是同一个类型,mysql中用tinyint类型来表示boolean类型,而sqlserver中date(datetime)迁移到mysql中会变成timestamp,这是不行的。
    迁移过程需要将自动影射的date/datetime类型映射为date/datetime,bit类型映射为tinyint类型。