将MySQL数据库导入SQL Server

97

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


1
你是否也能够访问原始数据库?或者说,导出文件是你所拥有的全部内容吗? - Whakkee
我也可以访问原始数据库。只是觉得使用转储可能会更容易。 - marionmaiden
10个回答

65

使用 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.3版本的5.1.13 ODBC驱动程序工作正常。


13
这个工具只有在你能够从你的PC安装一个ODBC连接器到你的MySQL数据库时才能使用。如果你只有一个.sql转储文件,那么你无法使用SSMA。 - Jake Munson
11
MySQL引擎是免费软件,也有适用于Windows的版本。安装和加载转储文件都是很简单的任务。如果你希望找到一个工具(无论是商业还是免费),能够可靠地将任意MySQL脚本转换成其SQL Server等效版本,那么好运了。请注意,这样的工具并不容易找到。 - Zar Shardan
1
好主意。那就是我昨天最终采取的方法。除了编写自己的定制转换工具之外,安装MySQL似乎是最好的选择。SSMA使用起来很麻烦,但我最终还是让它工作了。 - Jake Munson
2
SSMA是一个很好的选择,这应该是被接受的答案。我并没有觉得使用它很困难。 - DonBecker
4
需要SQL Server Agent,而它不包含在SQL Server Express中。 - Vinicius Rocha
显示剩余8条评论

17

我建议你使用 mysqldump 像这样:

mysqldump --compatible=mssql

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


6
唉,这给我带来了各种兼容性问题。脚本将在列名周围包含反引号,数据类型在MSSQL中不存在,将违反最大1000插入约束,自动增量关键字等等。这个答案是一个合理的建议,但恐怕它效果不是很好(至少对我来说不是)。 - Jeroen
1
mysqldump --compatible=ansi "生成与其他数据库系统或旧版MySQL服务器更兼容的输出。此选项的唯一允许值是ansi,其含义与设置服务器SQL模式的相应选项相同。" - Thomas Taylor
https://dev.mysql.com/doc/refman/8.0/zh/mysqldump.html#option_mysqldump_compatible - 这不是你想要的功能。 - Vetsin

14

1
这种情况是当Mysql和SQL都在一台机器上或者它们通过网络连接时。但是,如果存在两台不同的机器并且你有一个来自mysql的Dump文件,那么这种方法就没有用了,对吧? - Espanta

8
以下是我导入.sql文件到SQL Server的方法:
  1. 使用--compatible=mssql--extended-insert=FALSE选项从MySQL导出表:

    mysqldump -u [用户名] -p --compatible=mssql --extended-insert=FALSE 数据库名 表名 > table_backup.sql

  2. 使用PowerShell将导出的文件每300000行分割成一个文件:

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

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

这里有一些关于如何加速插入的提示,可以参考这篇文章
另一种方法是使用mysqldump的--where选项。通过使用此选项,您可以按任何支持where SQL子句的条件拆分您的表。可以参考这篇文章了解更多信息。

我们如何导出整个数据库而不是逐个表格地导出? - Furkan Gözükara
尝试使用“--databases [db_name]”关键字,如此答案所述:https://dev59.com/g2kx5IYBdhLWcg3wA_tS#26096339 - Vladislav

7
如果你使用PhpMyAdmin导出,可以将Sql兼容模式切换为“MSSQL”。这样,你只需将导出的脚本运行在你的MS SQL数据库上,就完成了。
如果你不能或不想使用PhpMyAdmin,则mysqldump也有一个兼容选项,但我个人更喜欢让PhpMyAdmin来做。

1
这个答案对我来说很有效,只需对生成的脚本进行最少的修改。将其导入到SQL Server 2012中。之前没有看到兼容模式。 - Kiel

5
今天我遇到了一个非常类似的问题 - 我需要从 MySql 中复制一个大表(500万行)到 MS SQL 中。
下面是我采取的步骤(在 Ubuntu Linux 下):
  1. 创建一个与 MySql 源表结构匹配的 MS SQL 表。
  2. 安装 MS SQL 命令行:https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu
  3. 将表从 MySql 转储到文件:
mysqldump \
    --compact \
    --complete-insert \
    --no-create-info \
    --compatible=mssql \
    --extended-insert=FALSE \
    --host "$MYSQL_HOST" \
    --user "$MYSQL_USER" \
    -p"$MYSQL_PASS" \
    "$MYSQL_DB" \
    "$TABLE" > "$FILENAME"
  1. 在我的情况下,转储文件相当大,因此我决定将其分成许多小片段(每个1000行)- split --lines=1000 "$FILENAME" part-
  2. 最后,我遍历这些小文件,进行一些文本替换,并将这些文件一一执行以插入 MS SQL 服务器:
export SQLCMD=/opt/mssql-tools/bin/sqlcmd
x=0
for file in part-* do echo "Exporting file [$file] into MS SQL. $x thousand(s) processed"
# 将 \' 替换为 '' sed -i "s/\\\'/''/g" "$file"
# 移除所有 " sed -i 's/"//g' "$file"
# 允许插入具有指定主键(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" echo "" echo ""
x=$((x+1)) done echo "Done"
当然,您需要用自己的变量替换像 $AZURE_SERVER$TABLE 等等。
希望这能帮助到您。

3

对我而言,最好的方法是使用以下命令导出所有数据:

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

--需要使用extended-insert=FALSE以避免mssql 1000行导入限制。

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

在SQL Server的SSMS中,我必须逐个导入数据表并打开IDENTITY_INSERT来编写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 

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


0

0

运行:

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

-1

1
欢迎来到StackOverflow @gorgino!如果您发布链接,请在链接可能失效时也发布一份简短的内容摘要。链接应主要用于扩展您的回答,而不是作为您的回答。 - Cribber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接