Skip to content
dbSlice®
Product Who it's for Performance Pricing Blog Guides Support Buy dbSlice

dbSlice / Migrate

SQL Server to MySQL migration, on Windows

Moving an application from SQL Server to MySQL or MariaDB? dbSlice copies the tables from a Windows app or the command line, then keeps MySQL in sync with SQL Server until the day you switch.

Try it free on the Microsoft Store ↗ See pricing

At a glance

  • What it does: copies SQL Server tables into MySQL or MariaDB and keeps them in sync until cutover, from a Windows app or the command line.
  • Engines: SQL Server to MySQL and MariaDB; also PostgreSQL, Oracle, Firebird, SQLite and InterSystems IRIS, and MySQL back into SQL Server.
  • What it does not do: convert T-SQL procedures or triggers, or detect deletes in incremental runs.
  • Free or paid: try it in the free Microsoft Store version (no license key); writing to a target database needs a Desktop or Server license.

dbSlice or MySQL Workbench?

MySQL Workbench has a free migration wizard that reads SQL Server, and for a one-time move it is worth trying. dbSlice is for teams that need repeated runs (Upsert or new-rows-only every night until cutover), a key-by-key diff and on-screen checks before writing, masking for test copies, and the same tool for other pairs. Neither converts T-SQL procedures or triggers to MySQL; plan that part separately.

dbSlice Synchronize tab

What dbSlice does

  • Reads SQL Server in small batches, so the live database keeps serving its users.
  • Writes to MySQL and MariaDB. Initial and full loads are faster when your DBA enables local_infile on the server and you allow it in the connection; without it they still work, only slower.
  • Shows the target DDL. If the MySQL table does not exist, dbSlice stops before writing and shows a CREATE TABLE translated from SQL Server for your DBA to review and run. It does not create objects in your databases by itself.
  • Keeps your ids. Rows arrive with their original IDENTITY values. MySQL's InnoDB moves the table's AUTO_INCREMENT past the highest id inserted, so new rows created by the application after the copy do not collide.

SQL Server details to plan for

SQL ServerSuggested in MySQLCheck
datetimeoffsetDATETIME(6)The offset is not kept. Convert to UTC in a SELECT source if the zone matters
datetime2(7)DATETIME(6)MySQL keeps microseconds; the 7th digit is dropped
uniqueidentifierCHAR(36)Stored as text; fine for joins, larger than BINARY(16)
nvarchar(max), varchar over 16,383LONGTEXTExpected; index only a prefix if needed
bitTINYINT(1)MySQL's usual boolean
varbinary, imageLONGBLOBExpected
tinyint, smallint, int, bigintSMALLINT, SMALLINT, INT, BIGINTSame ranges; tinyint gets a wider type
decimal(p,s), money, smallmoneyDECIMAL(p,s)money arrives as DECIMAL(19,4)
float, realDOUBLE—
char(n), nchar(n)VARCHAR(n)Trailing-space padding is not kept
time(7)TIMEMySQL TIME keeps whole seconds; change to TIME(6) if you need fractions
text, ntext, xmlLONGTEXTXML arrives as plain text
timestamp / rowversionLONGBLOB (from version 2.3.20261030.1528)Copied as bytes. They are SQL Server's row versions, so most targets don't need them: you can leave the column out of the copy
sql_variant, hierarchyid, geography, geometryLONGTEXTConvert in a SELECT source (for example .ToString() or CAST) if you need the value

Two settings on the MySQL side:

  • Character set. Create the MySQL database (or the tables) with utf8mb4. With an older latin1 default, characters outside it fail or turn into ?.
  • Table name case. On Linux, MySQL table names are case-sensitive by default. Pick a convention (usually lower case) in the CREATE TABLE and keep it; dbSlice matches columns by name without case.

Common errors and what they mean

  • Incorrect string value: '\xF0\x9F…' for column … — the MySQL table is not utf8mb4. Recreate it (or the database) with utf8mb4, as above.
  • Data too long for column … — the target column is shorter than the data, often a VARCHAR declared by hand. Widen it or switch to LONGTEXT.
  • Row size too large (> 8126) — many wide VARCHAR columns in one InnoDB row. Turn the largest ones into TEXT or LONGTEXT in the CREATE TABLE.
  • Loading local data is disabled — local_infile is off on the server or in the connection. The load still runs without it, only slower; ask your DBA if you want the faster path.
  • Duplicate entry … for key 'PRIMARY' — the row is already in MySQL. Use Upsert or Insert new instead of Initial load for repeated runs.

Step by step

  1. Connect to SQL Server and to MySQL or MariaDB.
  2. Pick the source table or a SELECT, and the target table.
  3. Choose the key column used to match rows.
  4. Choose the mode: Initial load the first time, then Upsert or Insert new.
  5. Check before writing: Record Diff compares keys on both sides.
  6. Run it, or save it as a job and schedule it from the CLI. The Replicator copies a list of tables in one run, parents before children.

Keep both in sync until cutover

Schedule an Upsert job every night. With a column that only grows (an updated_at or the IDENTITY id), each run reads only rows above the last value it saw. Deletes in SQL Server are not detected by incremental runs, so plan a full comparison or a reload before the switch.

FAQ

Does dbSlice convert T-SQL stored procedures or triggers?

No. It moves data. Rewrite procedures and triggers for MySQL separately, then use dbSlice for the data and the sync until cutover.

Can SQL Server keep running during the migration?

Yes. dbSlice reads in small batches, and nightly Upsert or new-rows-only runs keep MySQL close to SQL Server until you switch.

Does it create the tables in MySQL?

Not by default. It stops before writing and shows a CREATE TABLE for your DBA to review and run.

MySQL or MariaDB?

Both. dbSlice connects to either with nothing extra to install.

Can I try it before buying?

Yes. The free Microsoft Store version needs no license key; writing to a target database needs a Desktop or Server license.

Also works for

SQL Server to PostgreSQL (sync guide), Oracle, Firebird, SQLite or InterSystems IRIS, and MySQL back into SQL Server.

Try it on your own data: the free Microsoft Store version needs no license key.

Try free on the Microsoft Store ↗Buy dbSlice

Related guides

  • MySQL to PostgreSQL migration, with a GUI and a sync after cutover
  • Firebird to PostgreSQL migration, on Windows
  • Firebird to SQL Server migration, on Windows
  • Masked staging copy
  • How to read sync speed numbers
dbSlice®

Professional data synchronization, migration and reconciliation — for Windows and Linux (Docker).

A Thinwork product

Product

Product Pricing Guides Linux (Docker) Release notes Free version (Microsoft Store) Support FAQ Renew maintenance CLI examples

Legal

Terms of Use Privacy Policy Refund Policy EULA

Company

THINWORK TECNOLOGIA DA INFORMACAO - LTDA
CNPJ 09.166.605/0001-21
Since 2007

Av. Paulista, 1471, Conj. 511, Anexo CP 1722
Bela Vista, São Paulo - SP, 01311-927, Brazil

Sales

+55 (11) 5197-7969 [email protected]

Support hours: Mon–Fri, 9:00–17:00 (UTC−3)

github.com/thinwork Follow @dbsliceapp
© 2026 dbSlice®. All rights reserved. Windows x64 · GUI + CLI · Linux (Docker) · Web

dbSlice® and the dbSlice pizza mascot logo are registered trademarks of Thinwork Tecnologia da Informação Ltda. with the Brazilian National Institute of Industrial Property (INPI).

All other product names, logos and brands are the property of their respective owners and appear here only to identify the systems dbSlice works with. dbSlice is an independent product, not affiliated with, sponsored or endorsed by them. Learn more