将MySQL数据库导入MS SQL Server


89

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


1
您还可以访问原始数据库吗?还是您基本上只拥有导出文件?
Whakkee 2010年

我也有访问原始数据库的权限。我只是认为使用转储可能更容易
marionmaiden 2010年

Answers:


62

使用SQL Server迁移助手(SSMA)

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

它看起来很聪明,甚至可以处理非平凡的传输。它还具有一些命令行界面(除了GUI),因此从理论上讲它可以集成到某些批处理加载过程中。

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

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


9
仅当您可以将ODBC连接器从PC安装到MySQL DB时,此工具才有效。如果只有.sql转储文件,则不能使用SSMA。
杰克·芒森

10
MySQL引擎是免费软件,并且Windows也有一个版本。安装它并加载转储是一项简单的工作。如果您希望找到一种可以可靠地将任意MySQL脚本转换为等效SQL Server的工具(甚至是商业工具,更不用说免费了),那就好运了。
Zar Shardan

1
好点子。这就是我昨天结束的事情。除了编写自己的自定义转换实用程序外,安装MySQL似乎是最好的选择。SSMA很难使用,但最终我使它起作用。
杰克·芒森

2
SSMA是一个很好的选择,这应该是公认的答案。我一点也不觉得难用。
DonBecker 2013年

2
它需要SQL Server Express不附带的SQL Server代理。
Vinicius Rocha 2013年

18

我建议您像这样使用mysqldump

mysqldump --compatible=mssql

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


6
las,这给了我各种各样的兼容性问题。该脚本将包含围绕列名的反引号,MSSQL中不存在的数据类型,将违反max-1000-inserts约束,auto_increment关键字等。此答案是合乎逻辑的建议,但恐怕它没有效果不太好(至少:这对我而言不是)。
Jeroen

mysqldump --compatible = ansi“产生与其他数据库系统或更旧的MySQL服务器更兼容的输出。此选项唯一允许的值为ansi,其含义与设置服务器SQL模式的相应选项相同。”
托马斯·泰勒


7

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

如果您不能或不想使用PhpMyAdmin,则mysqldump中还有一个兼容性选项,但就我个人而言,我希望PhpMyAdmin为我做。


1
这个答案对我有用,对生成的脚本进行了最小的修改。将其带入SQL Server2012。以前没有看到兼容模式。
基尔

7

这是将.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中运行每个文件

有一些技巧提示如何加快插入速度

其他方法是使用mysqldump –where选项。通过使用此选项,可以在wheresql子句支持的任何条件下拆分表。


我们如何导出整个数据库而不是逐表导出
MonsterMMORPG'Mar 23'23

尝试--databases [db_name]在此答案中解释的关键字:stackoverflow.com/a/26096339/155687
Vladislav

4

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

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

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

  2. 安装的MS SQL命令行: https //docs.microsoft.com/zh-cn/sql/linux/sql-server-linux-setup-tools#ubuntu

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

mysqldump \
    -紧凑
    --complete-insert \
    --no-create-info \
    --compatible = mssql \
    --extended-insert =错误\
    --host“ $ MYSQL_HOST” \
    --user“ $ MYSQL_USER” \
    -p“ $ MYSQL_PASS” \
    “ $ MYSQL_DB” \
    “ $ TABLE”>“ $ FILENAME”
  1. 在我的情况下,转储文件非常大,因此我决定将其分成许多小块(每块1000行)- split --lines=1000 "$FILENAME" part-

  2. 最后,我遍历了这些小文件,进行了一些文本替换,并针对MS SQL Server逐个执行了这些片段:

导出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用你的,等等。

希望能有所帮助。


2

对我来说,最好使用以下命令导出所有数据:

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 

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.