SQL serverからMySQLへデータ移行(スクリプト化して移行が簡単)クエリでCSVインポート

MySQL WorkbenchやSQL Server Integration Servicesを使わずに、

スクリプトで移行する方法を試す。

データベースのスクリプト化

SQLserverにて、移行したいデータベースを右クリック「タスク」→「スクリプトの生成」→「次へ」→

データベース全体か特定のデータベースを選択

→テーブルを選択したら「次へ」→

詳細設定の部分で、「スクリプトを作成するデータの種類」をスキーマのみなら

テーブル構造のみ、スキーマとデータなら、テーブルと一緒にデータも移行できる。

選択し「次へ」→「次へ」でスクリプトが生成される。

スクリプトの変換

SQLserverでスクリプト化したものは、MySQLではそのまま使えないので、

WEB上の変換ツールを使う。

https://www.sqlines.com/online

sqllines

左側にSQLserverで作成したスクリプトを貼り付け。

このとき、1度に行わず分けて行わないと、ブラウザが処理できない。

左側はMicrosoft SQL sserver, 右側はMySQLを選択し、convertボタンを押す。

作成されたMySQL用のスクリプトをエディターで編集するので、

コピペする。

変換が必要なものを変換

ツールで変換しきれなかった部分を変換する。

テキストエディターは文字検索と置換ができるなら何でもいい。

nvarcharをVARCHARへ

varchar(255)以上はTEXTへ

255なら作成できるようなので2000くらいからでもいい気はする。

varcharのデータ型の振る舞いに違いがあるかららしい。よくわからない。

SQLserverはunicodeではない可変長文字列を格納するためのデータ型だが、MySQLは違う。

最初の行のUSE ’DB名’はいらない

AUTO_INCREMENT は1列のみ

AUTO_INCREMENT属性を持つ列に索引(INDEX)を定義し、AUTO_INCREMENT属性を持つ列には、PRIMARY KEYまたはUNIQUE INDEXのいずれかを定義する必要がある。

AUTO_INCREMENT が書いてあるスクリプトの下に

PRIMARY KEY (`SEQ`) というように追記する。

MySQLでスクリプトを実行

修正したスクリプトをMySQLに新規作成したDBのSQLに張り付けて実行する

これでデータ移行はできるが、

たくさんある場合は、テーブルから作成し、あとでデータを移行するほうがいい。

MySQL CSVでデータ移行

テーブルをCSVで移行するのはデータ型の問題もあり、大変そうなので、

テーブルはある前提で、データのみCSVで移行する。

単純に、インポートからCSVを読み込むのではオートインクリメントがあるときなど、エラーが出ることがある。

そういうときに、このクエリでCSVを読み込むと簡単にデータをインポートできる。

CSVを作成↓

SQLserver上でクエリを実行して結果を表示、結果を右クリックして、保存するときにCSVを指定する。

もしくは、タスクのデータのエクスポートから、コピー先にエクセル(CSV)を指定する。

これにより、結果をCSVにする。

MySQLのDB上でクエリを実行する。

LOAD DATA INFILE '/path/to/your/csvfile.csv'
INTO TABLE your_mysql_table
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

ファイルパスはMySQLのあるサーバー、マシンからCSVファイルのある場所。

テーブル名は挿入先のテーブル名を指定し、実行する。

もし、

1290 – MySQLサーバーが –secure-file-priv オプションで実行されているので、このステートメントは実行できません。

というエラーが出たら、

SHOW VARIABLES LIKE 'secure_file_priv';

上のクエリを実行して、許可されているフォルダ内にCSVファイルを置く。

以上のエラーが出ても取り込まれている可能性があるので注意。