将 MySQL 数据库导入 SQL Server

问题描述 投票:0回答:9

我有一个来自 MySQL 转储的

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

mysql sql-server
9个回答
66
投票

使用 SQL Server 迁移助手 (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 版本工作正常。


19
投票

我建议你像这样使用mysqldump

mysqldump --compatible=mssql

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


14
投票

我在网上找到了一个方法

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

这是链接

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


10
投票

这是我将

.sql
文件导入 SQL Server 的方法:

  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. 在 SQL Server Management Studio 中运行每个文件

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

其他方法是使用 mysqldump

–where
选项。通过使用此选项,您可以根据
where
SQL 子句支持的任何条件拆分表。


7
投票

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

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


5
投票

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

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

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

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

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

mysqldump \
     - 袖珍的 \
    --完整插入\
    --无创建信息 \
    --兼容=mssql \
    --扩展插入=假\
    --主机“$MYSQL_HOST”\
    --用户“$MYSQL_USER”\
    -p“$MYSQL_PASS”\
    “$MYSQL_DB”\
    “$表”>“$文件名”
  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;
/” “$文件”

  “$SQLCMD”-S“$AZURE_SERVER”-d“$AZURE_DB”-U“$AZURE_USER”-P“$AZURE_PASS”-i“$file”
  回声“”
  回声“”

  x=$((x+1))
完毕

回声“完成”

当然,您需要替换我的变量,例如

$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 文件创建是否有效。

在 SQL Server 的 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 

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


0
投票

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

enter image description here


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
© www.soinside.com 2019 - 2024. All rights reserved.