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ファイルを置く。
以上のエラーが出ても取り込まれている可能性があるので注意。