MySQL to MS SQL Server 2008 R2 Migration Experience with SSMA

It is almost 7 years when I last used MySQL. In these 7 years MySQL has changed a lot and I also became a true MS SQL user/administrator. I realized this when I started setting up MySQL on my lab. Must say our SQL Server system is the best in usability front. I am sharing my learning's in this page.

Installing/Setting up MySQL:

  • I started with hunting for an installer in MySQL page.
  • I got a free edition in MySQL called MySQL Community Server.
  • There were multiple options in the download section but I was confused to see 32 and 64 bit both with the term X86.
  • Next confusing step was, should I select MSI or Zip archive.
  • I realized that MSI installer is not full download and while installing, it might download lot more stuff so decided to go for Zip Archive.
  • Downloaded the complete package and extracted in the C:\Program File but now what?
  • Online documentation were not so helpful but good part that package internal documentation were better. I just had to spend some time to understand which file to open due to absence of proper index or file extensions.
  • Finally MySQL was running on my VPC as a service.
  • Next step was How do I manage this server. I still remember my Linux days when there used to be some 3rd party tools which used to allow MySQL management with limited extent.
  • Finally I ended up with downloading MySQL Workbench the GUI tool.
  • It was easy to connect through the tool but what is my User Name and Password?
  • Finally I opened up my old notes and refreshed my MySQL knowledge. Unfortunately no documentation was there to help .
  • Ah so at the end I was connected and I could create new Databases (Schema) in MySQL environment.
  • I agree that the workbench was very easy. It allows Schema and Table creation and also allows data insertion.
  • I did change root user’s password and could create few users using queries as well as from Workbench.
  • I even learnt that there is something available in PHP called MyAdmin which can help me in connecting to MySQL management but unfortunately couldn’t make it working..
  • Finally the MySQL demo environment was ready for migration.

Migration of MySQL to SQL Server 2008 R2:

  • We just came up with a latest Migration tool for MySQL (SSMA for SQL Server).
  • The current version of SSMA for MySQL is still in CTP.
  • I started with the same and downloaded the latest licenses and refresh with the same (an important step to proceed with SSMA)
  • I realized that I would also have to download the ODBC Driver for MySQL
  • I could connect to the MySQL through SSMA.
  • Next step was to connect to the destination SQL Server.
  • There are different options of MySQL to SQL migration including 1:1 Database Migration or Many:1 Database Migration.
  • I selected 1:1 option where I created a new database in SQL Server so that all the tables from MySQL Schema (database) can be migrated to the same.
  • Now I had to map the MySQL data types as per MS SQL Server. There is a long table available in MySQL migration guide which should be referred for this step:

MySQL type

SQL Server 2008 mapping

Conversion remarks

Possible mappings

BIT (N)

varbinary (8)

The binary value has N bits. N = 1..64

Not applicable

TINYINT (M)

BOOL, BOOLEAN = TINYINT (1)

tinyint

M is the number of decimal places in the output for this value.

tinyint, smallint, int, bigint, numeric(p,s) , decimal(p,s) , float(p) , double precision, real, smallmoney, money

SMALLINT (M)

smallint

M is the number of decimal places in the output for this value.

tinyint, smallint, int, bigint, numeric(p,s) , decimal(p,s) , float(p) , double precision, real, smallmoney, money

MEDIUMINT (M)

int

M is the number of decimal places in the output for this value.

tinyint, smallint, int, bigint, numeric(p,s) , decimal(p,s) , float(p) , double precision, real, smallmoney, money

INT (M)

INTEGER (M)

int

M is the number of decimal places in the output for this value.

tinyint, smallint, int, bigint, numeric(p,s) , decimal(p,s) , float(p) , double precision, real, smallmoney, money

BIGINT (M)

bigint

M is the number of decimal places in the output for this value.

tinyint, smallint, int, bigint, numeric(p,s) , decimal(p,s) , float(p) , double precision, real, smallmoney, money

FLOAT (P)

float (P)

None.

numeric(p,s) , decimal(p,s) , float(p) , double precision, real, smallmoney, money

FLOAT [(P, S)]

float (24)

MySQL allows a nonstandard syntax: FLOAT(P,S) or REAL(P,S) or DOUBLE PRECISION(P,S). Here, “(P,S)” means that values are displayed with up to P digits total, of which S digits may be after the decimal point. MySQL performs rounding when storing values. If M and D are omitted, values are stored up to the size limits allowed by the hardware.

numeric(p,s) , decimal(p,s) , float(p) , double precision, real, smallmoney, money

DOUBLE [(P, S)]

DOUBLE PRECISION [(P, S)]

REAL [(P, S)]

float (53)

numeric(p,s) , decimal(p,s) , float(p), double precision, real, smallmoney, money

DECIMAL [(P [, S])]

DEC [(P [, S])]

NUMERIC [(P [, S])]

FIXED [(P [, S])]

decimal [(P [, S])]

numeric [(P [, S])]

Decimal types can have up to 65 digits. For a decimal with a precision of more than 38, use the float or double data type.

numeric(p,s) , decimal(p,s) , float(p) , double precision, real, smallmoney, money

DATETIME [(D)]

datetime2

MySQL can store dates from 0000-00-00 to 9999-12-31. MySQL can store zero-value of year, month, and year.

smalldatetime, datetime, datetime2

DATE [(D)]

date

smalldatetime, datetime, datetime2, date

TIME

time

Range is '-838:59:59' to '838:59:59'.

smalldatetime, datetime, datetime2, time, varchar, nvarchar

TIMESTAMP

smalldatetime

Range is '1970-01-01 00:00:00' to partway through the year 2037. If not defined during conversion, this type gets the current datetime value.

datetime, datetime2, rowversion, timestamp, varbinary(8) , binary(8)

YEAR [(2| 4)]

smallint

In four-digit format, allowable values are 1901 to 2155, and 0000. In two-digit format, allowable values are 70 to 69, representing years from 1970 to 2069.

datetime, date, varchar(4)

[NATIONAL] CHAR (N)

nchar (N)

nchar

Range of N is 0 to 255 characters.

char, varchar, nchar, nvarchar

[NATIONAL] CHAR

[NATIONAL] VARCHAR (N)

CHARACTER VARYING (N)

nvarchar (N | max)

Range of N is 0 to 65,535.

If N is less than or equal to 8000, use nvarchar(N). If it is greater than 8000, use nvarchar(max).

char, varchar, nchar, nvarchar

TINYTEXT

nvarchar (255)

None.

char, varchar, nchar, nvarchar

TEXT (N)

nvarchar (N | max)

A TEXT column with a maximum length of 65,535 characters.

If N is less than or equal to 8000, use nvarchar(N). If it is greater than 8000, use nvarchar(max).

char, varchar, nchar, nvarchar, varchar(max) , nvarchar(max)

MEDIUMTEXT

nvarchar (max)

None.

char, varchar, nchar, nvarchar, varchar(max) , nvarchar(max)

LONGTEXT

nvarchar (max)

None.

char, varchar, nchar, nvarchar, varchar(max) , nvarchar(max)

BINARY (N)

binary (N)

None.

binary, varbinary, char, varchar, nchar, nvarchar

VARBINARY (N)

varbinary (N)

None.

binary, varbinary, char, varchar, nchar, nvarchar

TINYBLOB

varbinary (255)

None.

binary, varbinary, varbinary(max)

BLOB (N)

varbinary (N | max)

A BLOB column with a maximum length of 65,535 bytes.

If N is less than or equal to 8000, use nvarchar(N). If it is greater than 8000, use nvarchar(max).

binary, varbinary, varbinary(max)

MEDIUMBLOB

varbinary (max)

None.

binary, varbinary, varbinary(max)

LONGBLOB

varbinary (max)

None.

binary, varbinary, varbinary(max)

ENUM

See ENUM and SET Data Types in this guide.

SET

See ENUM and SET Data Types in this guide.

  • The next step was to map and migrate schema.
  • This would create all the tables of MySQL to SQL Server database.
  • Once done, now you can select Migrate data and that’s it…Migration done.

In this entire migration process, only important point is mapping the data types as per the SQL Server. Once done, rest all the steps are very much easy. So now I am done with migration…when are you trying?