Standard Operating Procedure

SQL Server → MySQL / MariaDB

Step-by-step procedure for migrating a SQL Server database to MySQL 8.0 or MariaDB 10.6+ using Endrias Bridge, including prerequisites, type mapping notes, and post-migration validation.

Tool: Endrias Bridge  ·  Source: SQL Server  ·  Target: MySQL 8.0 / MariaDB 10.6+

📖 Overview & Scope

This SOP covers a one-time full copy (schema + data) of a SQL Server source database into an existing MySQL 8.0 or MariaDB 10.6+ target, using the Endrias Bridge Assessment and Migration tabs. Type conversions are applied automatically — see the Type Conversions reference at the bottom of this document for the complete mapping table.

ℹ️
Bidirectional support: Endrias Bridge also supports MySQL → SQL Server. Use the same steps with source and target swapped — see Known Issues for reverse type-mapping notes.
ℹ️
Estimated time: ~10–15 minutes for setup and assessment, plus the data copy duration which scales with database size. The migration runs in batches of 1,000 rows per table.

Prerequisites — Source (SQL Server)

RequirementNotes
ODBC Driver 17 for SQL Server installed on migration hostRequired
SQL login with db_datareader + VIEW DATABASE STATE (minimum)Minimum
db_owner recommended for CDC stream modeRecommended
TCP 1433 open from migration host to source serverRequired
-- Grant minimum permissions (run on source SQL Server)
USE EndriasBridge;
CREATE USER MigrationUser FOR LOGIN MigrationUser;
ALTER ROLE db_datareader ADD MEMBER MigrationUser;
GRANT VIEW DATABASE STATE TO MigrationUser;

Prerequisites — Target (MySQL / MariaDB)

Endrias Bridge does not create the target database — it must exist before you run Step 1. Run the following on the MySQL/MariaDB server before connecting:

-- 1. Create the target database with utf8mb4 charset (required for NVARCHAR mapping)
CREATE DATABASE EndriasBridgeTarget
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

-- 2. Create migration user and grant access
CREATE USER 'MigrationUser'@'%' IDENTIFIED BY 'your-password';
GRANT ALL PRIVILEGES ON EndriasBridgeTarget.* TO 'MigrationUser'@'%';
FLUSH PRIVILEGES;
ℹ️
SET FOREIGN_KEY_CHECKS=0 is applied automatically by Endrias Bridge during the truncate pre-flight phase — you do not need to set this manually.
RequirementNotes
MySQL 8.0+ or MariaDB 10.6+ running and accessibleRequired
Target database exists with utf8mb4 charsetRequired
MigrationUser granted ALL PRIVILEGES on target DBRequired
MySQL port 3306 open from migration host to target serverRequired
1

Configure Connections

Open Endrias Bridge and navigate to Step 5 — DB Migration. Fill in both connection blocks as shown below. Leave the Port field blank for SQL Server (uses default instance port).

  Endrias Bridge — Step 5: Source & Target Configuration

SOURCE DATABASE

SQL Server
sql-source-server
(blank)
EndriasBridge
MigrationUser
••••••••••••

TARGET DATABASE

MySQL
mysql-target-host
3306
EndriasBridgeTarget
MigrationUser
••••••••••••
Test Connections
Save Configuration
💡
Click Test Connections after filling both forms to verify reachability before running the assessment. This is especially important for MySQL targets on remote hosts where port 3306 firewall rules may not yet be confirmed.
2

Run Assessment

In Endrias Bridge, switch to the Assessment tab and click Run Assessment. The tool connects to the source only at this stage and catalogs all objects and compatibility considerations.

  Endrias Bridge
Assessment
Migration
Jobs
Schema Objects
Tools
Database Assessment
Discovers source database objects and checks compatibility with target.
Run Assessment

SOURCE OBJECTS

📁 Tables (47)
  Users   12,450 rows
  Products   3,200 rows
  Orders   890,000 rows
  OrderItems   2,100,000 rows
  … (43 more)

COMPATIBILITY ISSUES

• Users.Id: INT IDENTITY → INT AUTO_INCREMENT
• Products.Description: NVARCHAR → VARCHAR (utf8mb4)
• Orders.Amount: MONEY → DECIMAL(19,4)
• Users.RowGuid: UNIQUEIDENTIFIER → CHAR(36)
• Flags.IsActive: BIT → TINYINT(1)
• … (full list per scanned table)
ℹ️
TINYINT → TINYINT(1) and NVARCHAR → VARCHAR conversions will be listed in the Compatibility Issues panel. System-versioned temporal tables will also be flagged — plan to exclude or handle them in Step 3. The Assessment does not connect to the MySQL target.
3

Select Tables

Switch to the Migration tab. Click Load Tables from Source to populate the table list, then review selections. System-versioned temporal tables will be flagged and should be excluded on the first run.

  Endrias Bridge
Assessment
Migration
Jobs
Schema Objects
Tools
Migrate Schema & Data
Select tables and copy schema / data to target database.
Migrate schema (CREATE TABLE)
Migrate data (INSERT rows)
Sync mode:
Full copy
Incremental (watermark column)
SQL Server CDC
Load Tables from Source
Start Migration
Verify Data Integrity
Export Report
Users
Products
Orders
OrderItems
Customers
AuditLog_History ⚠️ temporal
… (all non-temporal tables checked)
⚠️
System-versioned temporal tables (identified by a PERIOD FOR SYSTEM_TIME definition) are flagged with a warning icon. MySQL and MariaDB do not support SQL Server temporal tables natively. Exclude these tables on first run — migrate the current-row table only, then manually drop the SysStart/SysEnd period columns from the target after import.
4

Start Migration & Monitor

Click Start Migration. Watch the Migration Log update live as type conversions are applied, schema is created, and rows are copied in batches of 1,000.

  Endrias Bridge — Migration Log
14:02:11 --- Data type conversions (SQL Server -> MySQL) ---
14:02:11 EndriasBridge.Users.Id: INT IDENTITY -> INT AUTO_INCREMENT
14:02:11 EndriasBridge.Products.Description: NVARCHAR -> VARCHAR (utf8mb4)
14:02:11 EndriasBridge.Orders.Amount: MONEY -> DECIMAL(19,4)
14:02:12 Schema: created 47 table(s)
14:02:12 [1/47] Users ... 12,450 row(s)
14:02:13 [2/47] Products ... 3,200 row(s)
14:02:45 --- Full copy: 890,000+ row(s) in 33s ---
14:02:45 --- Done ---
⚠️
If the log shows a connection error at this step (not during Assessment), verify the MySQL prerequisites — this is the first step that actually connects to the target database.
5

Verify & Export Report

  1. Click Verify Data Integrity — compares source vs. target row counts for every migrated table and logs any mismatches.
  2. Click Export Report (enabled once migration finishes) to save an HTML/text summary of what was created, copied, and any warnings (type changes, truncated strings, rounded decimals, etc.).
  3. Spot-check key tables directly on the MySQL target to confirm row counts and data values.
-- Run on MySQL target after migration to spot-check row counts
SELECT TABLE_NAME, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'EndriasBridgeTarget'
ORDER BY TABLE_NAME;
6

Post-Migration Indexes + Charset

After migration completes, perform the following post-migration validation and cleanup steps on the MySQL target.

1. Verify charset on target tables:

-- Confirm utf8mb4 charset was applied correctly
SHOW CREATE TABLE EndriasBridgeTarget.Users;
-- Expected output includes: DEFAULT CHARSET=utf8mb4

-- Check all tables in the target database
SELECT TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'EndriasBridgeTarget'
ORDER BY TABLE_NAME;

2. Rebuild full-text indexes manually if needed:

-- Full-text indexes are not migrated automatically.
-- Recreate any required FULLTEXT indexes on the target:
ALTER TABLE EndriasBridgeTarget.Products
  ADD FULLTEXT INDEX ft_description (Description);

3. Re-enable FK checks if disabled externally:

-- Endrias Bridge manages FK checks internally during migration.
-- If you manually disabled FK checks in your session, re-enable:
SET FOREIGN_KEY_CHECKS = 1;
💡
If the source had non-clustered indexes beyond primary keys, recreate performance-critical indexes on the target manually — Endrias Bridge migrates schema structure (tables + PKs) but secondary indexes should be reviewed and rebuilt based on the target workload access patterns.

🗺️ Known Issues

Temporal tables (system-versioned): MySQL and MariaDB do not support SQL Server temporal tables. The history table and SysStart/SysEnd columns are not migrated — exclude these tables or migrate the current-row table only and drop the period columns from the target after import.

IDENTITY → AUTO_INCREMENT: Values are seeded from the max existing value + 1 automatically. No manual sequence reset is required.

MONEY → DECIMAL(19,4): There is no MONEY type in MySQL. Values are stored as DECIMAL with 4 decimal places — arithmetic precision is preserved but the type label changes.

XML columns: Stored as LONGTEXT on MySQL — no XQuery or XML schema validation is available on the target. If your application relies on XML querying against these columns, add application-level handling post-migration.

BIT(1) vs TINYINT(1): MySQL uses TINYINT(1) as the boolean equivalent. Endrias Bridge maps SQL Server BIT → TINYINT(1). Values 0 and 1 are preserved exactly.

Case sensitivity: MySQL on Linux is case-sensitive for table names by default (lower_case_table_names=0). If your source SQL Server uses mixed-case table names, set lower_case_table_names=1 on the MySQL target before migration to avoid name resolution issues at the application layer.

IssueImpactResolution
Temporal tablesHistory table / period columns not migratedExclude on first run; migrate current-row table only
IDENTITY → AUTO_INCREMENTSeed set from max value + 1Automatic — no manual action needed
MONEY precisionStored as DECIMAL(19,4)No precision loss; type label differs
XML columnsBecomes LONGTEXT — no XQueryApplication-level handling if needed
Case sensitivity (Linux)Table name mismatches on application queriesSet lower_case_table_names=1 on target

📊 Type Conversions Applied (SQL Server → MySQL)

Source TypeTarget TypeNote
INT IDENTITYINT AUTO_INCREMENTSeed set from max existing value
BIGINT IDENTITYBIGINT AUTO_INCREMENT 
UNIQUEIDENTIFIERCHAR(36)No native UUID type in MySQL
MONEYDECIMAL(19,4) 
SMALLMONEYDECIMAL(10,4) 
DATETIMEOFFSETDATETIMETimezone offset lost — stored in UTC
DATETIME2 / DATETIME / SMALLDATETIMEDATETIME 
NVARCHAR(n) / NCHAR(n)VARCHAR(n) / CHAR(n)utf8mb4 charset
NTEXT / TEXTLONGTEXT 
IMAGE / VARBINARY(MAX)LONGBLOB 
VARBINARY(n)VARBINARY(n) 
XMLLONGTEXTNo XML validation on target
BITTINYINT(1)MySQL boolean convention
TINYINTTINYINTSame width
ROWVERSION / TIMESTAMPBINARY(8)No auto-update semantics on MySQL
hierarchyid / geographyTEXTRead via .ToString()
SQL_VARIANTTEXTSerialized string representation