2010-04-12 106 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等與你的。

    希望有所幫助。

    相關問題