Trying to Migrate Data
Getting the MySQL Workbench’s Database Migration has been interesting, and at present incomplete. While I can now successfully connect to the SQL Server 2012 source database and capture a schemata list, migrating the data from SQL Server doesn’t work. Actually, the connection doesn’t work without modifying a Python library in the current MySQL Workbench release.
I blogged about the SQL Server 2012 installation and Windows SQL Server DSN setup last night because the development manager requested them to create a repeatable test case to help resolve Bug 66516. The existing blog post on the MySQL Workbench blog provides step-by-step instructions, so I passed on providing them. This post documents how far I’ve been able to get with the database migration and where I’m stuck.
MySQL Workbench 5.2.42, which is the current release at time of writing, doesn’t retrieve a schemata list from SQL Server 2008 or 2012 unless you edit one of the Python libraries. The instructions for the change are in Bug 66030.
You need to edit the db_mssql_grt.py
source file and include the fix from the bug. While the bug lists where to find the file on Mac OS X, you find the db_mssql_grt.py
source and compiled files are in the following Windows directory (on a 64-bit OS). Then, you delete the db_mssql_grt.pyc
file, which is recompiled the next time you launch MySQL Workbench and there’s a call to a function in the module (or library).
C:\Program Files (x86)\MySQL\MySQL Workbench 5.2 CE\modules |
You need to edit line 173, and add the CAST
function call before you attempt the migration.
170 171 172 173 174 175 176 177 178 | def getServerVersion(connection): """Returns a GrtVersion instance containing information about the server version.""" version = grt.classes.GrtVersion() ver_string = execute_query(connection, "SELECT CAST(SERVERPROPERTY('ProductVersion') AS VARCHAR)").fetchone()[0] ver_parts = [ int(part) for part in ver_string.split('.') ] + 4*[ 0 ] version.majorNumber, version.minorNumber, version.releaseNumber, version.buildNumber = ver_parts[0:4] return version @ModuleInfo.export(grt.LIST, grt.classes.db_mgmt_Connection) |
After editing the file and saving it, you need to delete the compiled version and start MySQL Workbench to generate the db_mssql_grt.pyc
. If MySQL Workbench is running you need to shut it down after deleting the compiled Python file and restart it to generate a new compiled file.
Having fixed the error, you should see verification of your connection to the Microsoft SQL Server. If it fails at this point, you have made an error installing or configuring the Microsoft SQL Server or Windows DSN, or you haven’t made the change to the db_mssql_grt.py
file.
All the other steps work except for copying the data from the Microsoft SQL Server to the MySQL Server. The failure occurs in Bulk Data Transfer segment of the Database Migration wizard. The first error occurs on the Determine number of rows to copy step. The error log didn’t help very much, so I generated the manual script file.
Testing the generated script manually it fails to connect to the SQL Server instance. It appears the command syntax in the generated script is incorrect or one or more of the choices made during the installation of SQL Server or definition of the Windows SQL Server DSN is incorrect.
Here’s the generated script file:
REM Workbench Table Data copy script REM REM Execute this to copy table data from a source RDBMS to MySQL. REM Edit the options below to customize it. You will need to provide passwords, at least. REM REM Source DB: Mssql@SQL Server ODBC (Microsoft SQL Server) REM Target DB: Mysql@mclaughlinsql:3306 REM Source and target DB passwords REM set arg_source_password= REM set arg_target_password= REM Uncomment the following options according to your needs REM Whether target tables should be truncated before copy REM set arg_truncate_target=--truncate-target REM Enable debugging output REM set arg_debug_output=--log-level=debug3 wbcopytables.exe '--odbc-source=DSN=SQL Server ODBC;DATABASE=studentdb;UID=sa' --target=student@mclaughlinsql:3306 --source-password=%arg_source_password% --target-password=%arg_target_password% %arg_truncate_target% %arg_debug_output% --table '[dbo].[ORGANIZATION]' '`studentdb`' '`ORGANIZATION`' |
You need to add the following directory to your %PATH%
environment variable to test a call to wbcopytables
executable:
SET PATH=%PATH%;C:\Program Files (x86)\MySQL\MySQL Workbench 5.2 CE |
The following call to the wbcopytables
executable requires you unremark the source and target password statements or set them externally from the script. This call should connect and migrate data from the Microsoft SQL Server database to the MySQL Workbench.
wbcopytables.exe --odbc-source='[DSN=SQL Server ODBC;DATABASE=studentdb;UID=sa]' --target=student@mclaughlinsql:3306 --source-password=cangetin --target-password=student --table '[dbo].[ORGANIZATION]' '`studentdb`' '`ORGANIZATION`' |
However, running it in my environment generates the following error:
wbcopytables.exe: Invalid option '--odbc-source=DRIVER={.\SQLEXPRESS};DSN=SQL |
This was resolved by development in MySQL Workbench 5.2.43; and you can reference Bug 66516 for more information. Although, you need to watch out for character set mismatches, as qualified in this later post.