【问题标题】:Import MySQL database into a SQL Server将 MySQL 数据库导入 MS SQL Server
【发布时间】:2011-02-06 23:29:46
【问题描述】:

我有一个来自 MySQL 转储的 .sql 文件,其中包含要插入到这些表中的表、定义和数据。如何将转储文件中表示的这个数据库转换为 MS SQL Server 数据库?

【问题讨论】:

  • 您也可以访问原始数据库吗?还是导出文件基本上就是你所有的了?
  • 我也可以访问原始数据库。我只是认为使用转储可能更容易

标签: mysql sql-server mysqldump


【解决方案1】:

使用SQL Server Migration Assistant (SSMA)

除了 MySQL,它还支持 Oracle、Sybase 和 MS Access。

它看起来非常聪明,甚至能够处理非常重要的传输。它还有一些命令行界面(除了GUI),所以理论上它可以集成到一些批量加载过程中。

这是 MySQL 版本的当前下载链接https://www.microsoft.com/en-us/download/details.aspx?id=54257

当前(2016 年 6 月)稳定版 6.0.1 与当前 (5.3.6) MySQL ODBC 驱动程序在传输数据时崩溃。一切都是 64 位的。 带有 5.1.13 ODBC 驱动程序的 5.3 版本可以正常工作。

【讨论】:

  • 此工具仅在您可以将 ODBC 连接器从您的 PC 安装到您的 MySQL 数据库时才有效。如果您只有一个 .sql 转储文件,则无法使用 SSMA。
  • MySQL引擎是免费软件,windows也有版本。安装它并加载转储是一项微不足道的工作。如果您希望找到一个工具(甚至是商业的,更不用说免费的),可以可靠地将任意 MySQL 脚本转换为其等效的 SQL Server - 好吧,祝你好运。
  • 好点。这就是我昨天最终做的事情。如果不编写自己的自定义转换实用程序,安装 MySQL 似乎是最好的选择。 SSMA 使用起来很麻烦,但我最终让它发挥了作用。
  • SSMA 是一个不错的选择,这应该是公认的答案。我一点也不觉得难用。
  • 需要SQL Server Express自带的SQL Server Agent。
【解决方案2】:

我建议你像这样使用mysqldump

mysqldump --compatible=mssql

phpMyAdmin 仍然是一个网络应用程序,可能对大型数据库有一些限制(脚本执行时间、可分配内存等)。

【讨论】:

  • 唉,这给了我各种兼容性问题。该脚本将包含列名周围的反引号、MSSQL 中不存在的数据类型、将违反 max-1000-inserts 约束、auto_increment 关键字等。这个答案是一个合乎逻辑的建议,但恐怕它没有效果不太好(至少:它不适合我)。
  • mysqldump --compatible=ansi "产生与其他数据库系统或旧 MySQL 服务器更兼容的输出。此选项的唯一允许值是 ansi,与相应选项的含义相同用于设置服务器 SQL 模式。”
  • dev.mysql.com/doc/refman/8.0/en/… - 这并不像你认为的那样
【解决方案3】:

我在网上找到了一个方法

这需要一些工作,因为它必须一张一张地完成。但无论如何,我可以将表、数据和约束复制到 MS SQL 数据库中。

这是链接

http://www.codeproject.com/KB/database/migrate-mysql-to-mssql.aspx

【讨论】:

  • 即Mysql和SQL都在一台机器上或者通过网络连接。当存在两台不同的机器并且你有一个来自 mysql 的转储文件时,这没有用。对吗?
【解决方案4】:

如果您使用PhpMyAdmin 进行导出,您可以将 sql 兼容模式切换为“MSSQL”。这样,您只需针对您的 MS SQL 数据库运行导出的脚本即可。

如果您不能或不想使用 PhpMyAdmin,mysqldump 中还有一个兼容性选项,但我个人宁愿让 PhpMyAdmin 为我做。

【讨论】:

  • 这个答案对我有用,对生成的脚本的修改最少。带进SQL Server 2012 之前没看到兼容模式。
【解决方案5】:

这是我将 .sql 文件导入 MS SQL 的方法:

  1. 使用--compatible=mssql--extended-insert=FALSE 选项从MySQL 导出表:

    mysqldump -u [username] -p --compatible=mssql --extended-insert=FALSE db_name table_name > table_backup.sql

  2. 使用 PowerShell 将导出的文件拆分为每个文件 300000 行:

    $i=0; Get-Content exported.sql -ReadCount 300000 | %{$i++; $_ | Out-File out_$i.sql}

  3. 在 MS SQL Server Management Studio 中运行每个文件

有一些提示how to speed up the inserts

Other approach is to use mysqldump –where option。通过使用此选项,您可以在where sql 子句支持的任何条件下拆分表。

【讨论】:

  • 我们如何导出整个数据库而不是一个表一个表
  • 尝试--databases [db_name] 关键字,正如它在此答案中所解释的那样:stackoverflow.com/a/26096339/155687
【解决方案6】:

我今天遇到了一个非常相似的问题 - 我需要将一个大表(500 万行)从 MySql 复制到 MS SQL 中。

这是我已经完成的步骤(在 Ubuntu Linux 下):

  1. 在 MS SQL 中创建了一个表,其结构与 MySql 中的源表匹配。

  2. 已安装 MS SQL 命令行:https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu

  3. 将表从 MySql 转储到文件中:

mysql转储\ - 袖珍的 \ --完成插入\ --无创建信息\ --兼容=mssql \ --扩展插入=假\ --host "$MYSQL_HOST" \ --user "$MYSQL_USER" \ -p"$MYSQL_PASS" \ "$MYSQL_DB" \ "$TABLE" > "$文件名"
  1. 在我的情况下,转储文件非常大,所以我决定将其拆分为多个小块(每个 1000 行)-split --lines=1000 "$FILENAME" part-

  2. 最后,我遍历了这些小文件,做了一些文本替换,并针对 MS SQL 服务器逐个执行:

导出 SQLCMD=/opt/mssql-tools/bin/sqlcmd x=0 部分文件-* 做 echo "正在将文件 [$file] 导出到 MS SQL。已处理 $x 千" # 将 \' 替换为 '' sed -i "s/\\\'/''/g" "$file" # 删除所有“ sed -i 's/"//g' "$file" # 允许插入具有指定 PK(id) 的记录 sed -i "1s/^/SET IDENTITY_INSERT $TABLE ON;\n/" "$file" "$SQLCMD" -S "$AZURE_SERVER" -d "$AZURE_DB" -U "$AZURE_USER" -P "$AZURE_PASS" -i "$file" 回声“” 回声“” x=$((x+1)) 完毕 回声“完成”

当然,您需要替换我的变量,例如 $AZURE_SERVER$TABLE 等。和你的。

希望对您有所帮助。

【讨论】:

    【解决方案7】:

    对我来说,最好用这个命令导出所有数据:

    mysqldump -u USERNAME -p --all-databases --complete-insert --extended-insert=FALSE --compatible=mssql > backup.sql
    

    --extended-insert=FALSE 是避免 mssql 1000 行导入限制所必需的。

    我用我的迁移工具创建了我的表,所以我不确定从 backup.sql 文件中的 CREATE 是否可以工作。

    在 MSSQL 的 SSMS 中,我必须使用 IDENTITY_INSERT ON 逐个导入数据表来写入 ID 字段:

    SET IDENTITY_INSERT dbo.app_warehouse ON;
    GO 
    INSERT INTO "app_warehouse" ("id", "Name", "Standort", "Laenge", "Breite", "Notiz") VALUES (1,'01','Bremen',250,120,'');
    SET IDENTITY_INSERT dbo.app_warehouse OFF;
    GO 
    

    如果您有关系,则必须先导入子项,然后再导入具有外键的表。

    【讨论】:

      【解决方案8】:

      您还可以使用“ODBC”+“SQL Server 导入和导出向导”。 下面的链接描述了它: https://www.mssqltips.com/sqlservertutorial/2205/mysql-to-sql-server-data-migration/

      【讨论】:

        【解决方案9】:

        运行:

        mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql
        

        您想查看进程栏吗?

        pv mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql
        

        【讨论】:

          【解决方案10】:

          您可以使用 sqlie 应用程序从 mysql 转换为 sqlserver 你可以看这个视频 https://www.youtube.com/watch?v=iTVEqys_vTQ&t=108s

          【讨论】:

          • 欢迎来到 Stackoverflow @gorgino!如果您发布链接,请同时发布内容的简短摘要,以防将来链接失效。链接应该主要用于扩展你的答案,而不是成为你的答案。
          猜你喜欢
          • 2014-05-18
          • 1970-01-01
          • 1970-01-01
          • 2010-09-16
          • 2012-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多