2010-04-12 78 views
67

我有一个包含表格,定义和数据的MySQL转储的.sql文件插入到这些表中。如何将转储文件中表示的此数据库转换为MS SQL Server数据库?将MySQL数据库导入MS SQL服务器

+1

您是否有权访问原始数据库?或者导出文件基本上都是你的? – Whakkee 2010-04-12 11:46:04

+0

我对原始数据库也有访问权限。我只是认为使用转储可能会更容易 – marionmaiden 2010-04-12 11:49:19

回答

13

我找到一种方式,这在网络上

它要求工作的一点点,因为它必须由表来完成表。但无论如何,我可以将表,数据和约束条件复制到MS SQL数据库中。

这里是链接

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

+0

这就是当Mysql和SQL都在一台机器中或者它们通过网络连接时。当两台不同的机器存在并且你有一个来自mysql的转储文件时这没有用。对? – Espanta 2015-11-06 09:37:30

4

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

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

+3

@marga,它没有为MS SQL 2008工作。 – marionmaiden 2010-04-14 11:26:35

+1

这个答案适用于我,只需最小的修改生成的脚本。将它带入SQL Server 2012.之前没有看到兼容模式。 – Kiel 2016-06-29 14:04:23

15

我建议你使用mysqldump像这样:

mysqldump --compatible=mssql

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

+4

@deklin,它没有为MS SQL 2008工作。 – marionmaiden 2010-04-14 11:26:15

+4

唉,这给了我各种各样的兼容性问题。该脚本将包含反列周围的列名称,MSSQL中不存在的数据类型,将违反max-1000-inserts约束,auto_increment关键字等等。此答案是合乎逻辑的建议,但恐怕它不会工作得不好(至少:它不适合我)。 – Jeroen 2012-11-03 08:16:40

46

使用SQL Server Migration Assistant (SSMA)

除了MySQL之外它支持Oracle,Sybase和MS访问。

它看起来相当聪明,甚至能够处理非平凡的转移。它还具有一些命令行界面(除了GUI),理论上它可以集成到一些批量加载过程中。

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

目前(2016年6月)的稳定版6.0.1崩溃,并显示当前(5.3.6)MySQL的ODBC驱动程序,同时传输数据。一切都是64位。 使用5.1.13 ODBC驱动程序的5.3版本正常工作。

+5

只有当您可以将PC上的ODBC连接器安装到您的MySQL数据库时,此工具才有效。如果你只有一个.sql转储文件,你不能使用SSMA。 – 2013-02-21 18:20:27

+8

MySQL引擎是免费软件,也有一个Windows版本。安装它并加载转储是一件微不足道的工作。如果你希望找到一种工具(甚至是商业版,更不用说免费),它可以可靠地将任意MySQL脚本转换为与SQL Server相同的工具 - 好吧,祝你好运。 – 2013-02-22 01:16:06

+0

好点。这就是昨天我最终做的。在编写自己的自定义转换实用程序时,安装MySQL似乎是最佳选择。 SSMA在使用时很痛苦,但我最终得到了它的工作。 – 2013-02-22 16:07:07

7

这是我的导入方法。SQL文件到MS SQL:从MySQL

  1. 导出表--compatible=mssql--extended-insert=FALSE选项:

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

  2. 拆分使用PowerShell导出的文件,每档30万行:

    $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子句支持。

+0

我们如何才能导出整个数据库而不是表格 – MonsterMMORPG 2017-03-23 15:34:56

+0

尝试使用'--databases [db_name]'关键字来解释这个答案:http://stackoverflow.com/a/26096339/155687 – Vladislav 2017-03-27 06:57:39

1

我今天有一个非常类似的问题 - 我需要从MySQL大表(5个百万行)复制到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到一个文件:

 
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" 
  • 在我的情况转储文件相当大,所以我决定将它分成若干小块(每个1000行) - split --lines=1000 "$FILENAME" part-

  • 最后,我遍历这些小文件,做了一些文本替换,并通过一个针对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" 
    
        # replaces \' with '' 
        sed -i "s/\\\'/''/g" "$file" 
    
        # removes all " 
        sed -i 's/"//g' "$file" 
    
        # allows to insert records with specified 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" 
        echo "" 
        echo "" 
    
        x=$((x+1)) 
    done 
    
    echo "Done" 
    

    当然,你需要更换像$AZURE_SERVER我的变量中, $TABLE等与你的。

    希望有所帮助。

    相关问题