How to export SQL Server database to MySQL? [duplicate]
I'm trying to convert from a SQL Server database backup file (.bak
) to MySQL. This question and answers have been very useful, and I have successfully imported the database, but am now stuck on exporting to MySQL.
The MySQL Migration Toolkit was suggested, but seems to have been replaced by the MySQL Workbench. Is it possible to use the MySQL Workbench to migrate from SQL Server in the same way that the migration tool worked?
Or is the Migration Toolkit still available somewhere?
You can use MySQL Workbench which provides a way to quickly migrate data and applications from Microsoft SQL Server to MySQL employing less time and effort.
This tool has a lot of cool features like:
- Database migrations - enables migrations from Microsoft SQL Server, Sybase ASE and PostgreSQL.
- Migration project management - allows migrations to be configured, copied, edited, executed and scheduled.
Read more http://www.mysql.com/products/workbench/migrate/
I use sqlyog to migrate from mssql to mysql. I tried Migration toolkit and workbench but liked sqlyog for its SJA. I could schedule the import process and could do incremental import using WHERE clause.
PhpMyAdmin has a Import wizard that lets you import a MSSQL file type too.
See http://dev.mysql.com/doc/refman/5.1/en/sql-mode.html for the types of DB scripts it supports.
As mentioned above, if your data contains tab characters, commas, or newlines in your data then it's going to be very hard to export and import it with CSV. Values will overflow out of the fields and you will get errors. This problem is even worse if any of your long fields contain multi-line text with newline characters in them.
My method in these cases is to use the BCP command-line utility to export the data from SQL server, then use LOAD DATA INFILE .. INTO TABLE command in MySQL to read the data file back in. BCP is one of the oldest SQL Server command line utilities (dating back to the birth of SQL server - v6.5) but it is still around and still one of the easiest and most reliable ways to get data out.
To use this technique you need to create each destination table with the same or equivalent schema in MySQL. I do that by right clicking the Database in SQL enterprise manager, then Tasks->Generate Scripts... and create a SQL script for all the tables. You must then convert the script to MySQL compatible SQL by hand (definitely the worst part of the job) and finally run the CREATE TABLE commands on the MySQL database so you have matching tables to the SQL server versions column-wise, empty and ready for data.
Then, export the data from the MS-SQL side as follows.
bcp DatabaseName..TableName out TableName.dat -q -c -T -S ServerName -r \0 -t !\t!
(If you're using SQL Server Express, use a -S value like so: -S "ComputerName\SQLExpress")
That will create a file named TableName.dat, with fields delimited by ![tab]! and rows delimited by \0 NUL characters.
Now copy the .dat files into /tmp on the MySQL server and load on the MySQL side like so:
LOAD DATA INFILE '/tmp/TableName.dat' INTO TABLE TableName FIELDS TERMINATED BY '!\t!' LINES TERMINATED BY '\0';
Don't forget that the tables (TableName in this example) must be created already on the MySQL side.
This procedure is painfully manual when it comes to converting the SQL schema over, however it works for even the most difficult of data and because it uses flat files you never need to persuade SQL Server to talk to MySQL, or vice versa.