MySQLデータベースをMS SQLサーバーにインポートする


89

これらのテーブルに挿入されるテーブル、定義、データを含むMySQLダンプの.sqlファイルがあります。ダンプファイルで表されるこのデータベースをMS SQL Serverデータベースに変換するにはどうすればよいですか?


1
元のデータベースにもアクセスできますか?または、エクスポートファイルは基本的にすべて揃っていますか?
ワッキー

元のDBにもアクセスできます。私はちょうどダンプを使用する方が簡単かもしれないと思った
marionmaiden

回答:


62

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.1.13 ODBCドライバーを含む5.3バージョンは正常に動作します。


9
このツールは、PCからMySQL DBにODBCコネクタをインストールできる場合にのみ機能します。.sqlダンプファイルしかない場合は、SSMAを使用できません。
ジェイクマンソン2013

10
MySQLエンジンはフリーソフトウェアであり、Windows用のバージョンもあります。インストールしてダンプをロードするのは簡単な仕事です。任意のMySQLスクリプトを対応するSQL Serverに確実に変換するツール(コマーシャルはもちろんのこと、無料でも)を見つけたいとお考えなら、それで頑張ってください。
Zar Shardan、2013

1
いい視点ね。そして、それが昨日やったことです。独自のカスタム変換ユーティリティを作成するのではなく、MySQLをインストールするのが最良のオプションのようです。SSMAは使用するのに苦労しましたが、最終的には動作させることができました。
ジェイクマンソン

2
SSMAは優れたオプションです。これが受け入れられる答えです。全然使いにくいとは思いませんでした。
DonBecker 2013

2
SQL Server Expressに付属していないSQL Serverエージェントが必要です。
Vinicius Rocha 2013

18

mysqldumpを次のように使用することをお勧めします。

mysqldump --compatible=mssql

phpMyAdminは引き続きWebアプリであり、大規模なデータベース(スクリプトの実行時間、割り当て可能なメモリなど)にいくつかの制限がある可能性があります


6
悲しいかな、これは私にあらゆる種類の互換性の問題を与えます。スクリプトには、列名の周りのバッククォート、MSSQLに存在しないデータ型、max-1000-inserts制約、auto_incrementキーワードなどへの違反が含まれます。この答えは論理的な提案ですが、恐れますうまくいきません(少なくとも、私にはうまくいきませんでした)。
Jeroen

mysqldump --compatible = ansi "他のデータベースシステムまたは古いMySQLサーバーと互換性のある出力を生成します。このオプションに許可される唯一の値はansiで、これはサーバーのSQLモードを設定するための対応するオプションと同じ意味を持っています。"
トーマステイラー

14

ネットでこれのための方法を見つけました

テーブルごとに行う必要があるため、少し作業が必要です。とにかく、テーブル、データ、制約をMS SQLデータベースにコピーすることができました。

こちらがリンクです

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


1
これは、MysqlとSQLの両方が1台のマシンにあるか、ネットワーク経由で接続されている場合です。2つの異なるマシンが存在し、mysqlからのダンプファイルがある場合、これは役に立ちません。正しい?
Espanta

7

PhpMyAdminでエクスポートを行う場合、SQL互換モードを「MSSQL」に切り替えることができます。そうすれば、MS SQLデータベースに対してエクスポートされたスクリプトを実行するだけで完了です。

PhpMyAdminを使用できない場合、または使用したくない場合は、mysqldumpに互換性オプションもありますが、個人的には、PhpMyAdminでそれを実行することをお勧めします。


1
生成されたスクリプトに最小限の変更を加えるだけで、この答えはうまくいきました。SQL Server 2012に導入しました。以前は互換モードを確認していませんでした。
キール

7

これが.sqlファイルをMS SQLにインポートするための私のアプローチです。

  1. オプションを使用してMySQLからテーブルをエクスポート--compatible=mssql--extended-insert=FALSEます。

    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句でサポートされている任意の条件でテーブルを分割できます。


テーブル
ごと

--databases [db_name]この回答で説明されているようにキーワードを試してください:stackoverflow.com/a/26096339/155687
Vladislav

4

今日、非常によく似た問題がありました。MySqlからMS SQLに大きなテーブル(500万行)をコピーする必要がありました。

これが私が行った手順です(Ubuntu Linuxで):

  1. MySqlのソーステーブルと一致する構造を持つMS SQLでテーブルを作成しました。

  2. インストールされたMS SQLコマンドライン:https : //docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu

  3. MySqlからファイルにダンプされたテーブル:

mysqldump \
    -コンパクト\
    --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サーバーに対して1つずつ実行しました。

SQLCMD = / opt / mssql-tools / bin / sqlcmdをエクスポートします

x = 0

part- *のファイル
行う
  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では、IDフィールドを書き込むために、IDENTITY_INSERT ONを指定してテーブルごとにデータをインポートする必要がありました。

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

実行:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.