Documentation

Endrias Bridge Documentation

Everything you need to install, configure, and run Endrias Bridge — the Windows guest-initialization tool and built-in cross-database Migration Assistant.

📦 Version: June 2026 🖥️ Platform: Windows 🗄️ Supports: SQL Server, PostgreSQL, MySQL, Oracle, SQLite

📖 Overview

Endrias Bridge is two tools in one install. Both are reachable from the same Setup Wizard at C:\MigrationTool.

🪄 Guest Initialization (Setup Wizard)

Automated first-boot provisioning: detects metadata sources (ConfigDrive, HTTP IMDS, EC2, Azure), creates the local user, sets the hostname/network/timezone, injects SSH keys, runs user-data scripts, and more — driven by migrationbridge.conf and a plugin pipeline.

🗄️ Endrias Bridge

Assess, migrate, and keep in sync across SQL Server, PostgreSQL, MySQL, Oracle, and SQLite: schema + data copy, automatic data type conversion, incremental/CDC delta sync with throughput & ETA, schema object export, and hardware sizing recommendations.

Documentation Index

Deep-dive guides for each part of the tool:

Engine-Pair SOPs

Standalone runbooks for each supported migration path — validated row counts, live migration setup, type conversion tables, and known issues per engine pair.

🎯 Use Cases

☁️ Cloud Migration

Lift-and-shift an on-premises SQL Server, PostgreSQL, or MySQL database to a cloud-hosted equivalent (Azure SQL Database, AWS RDS, Google Cloud SQL) with a Full copy, then keep both sides in sync with Incremental or CDC until cutover.

🏗️ Platform Modernization

Move off a licensed engine such as Oracle or SQL Server onto PostgreSQL or MySQL. The Assessment tab flags every syntax difference up front and the Schema Objects tab exports procedures/views/triggers for rewrite.

🧪 Dev/Test Environment Refresh

Full-copy production data into a scratch SQLite or local SQL Server/PostgreSQL/MySQL instance for development, QA, or training — without exposing production credentials to developers.

📊 Reporting Offload

Keep a read-only reporting/BI database in sync with production using Incremental sync, so heavy reporting queries never touch the OLTP database.

🛡️ Disaster Recovery Staging Copy

Run periodic Incremental or SQL Server CDC sync to a standby database on a different host, region, or cloud as a low-cost warm copy for DR drills.

🔎 Schema & Code Audit

Use the Schema Objects tab to inventory every stored procedure, view, trigger, function, table type, temporal table, and SQL Agent job before planning a migration or decommission.

🚀 Quick Start

  1. Install

    Run MigrationBridge_Setup.exe, or use the per-user shortcut installer (install_shortcut.py). Both place a Endrias Bridge shortcut on the Desktop and Start Menu.

  2. Launch the Setup Wizard

    Double-click the shortcut, or run launch_gui.pyw. The wizard opens on Step 1 (Welcome).

  3. Open the Endrias Bridge

    From Step 5 (DB Migration) enter your source and target connection details, then click Open Endrias Bridge.

  4. Run an Assessment

    On the Assessment tab click Run Assessment to discover tables/views, compatibility issues, automatic data type conversions, and the recommended staging hardware tier.

  5. Migrate

    On the Migration tab, load tables, pick a sync mode (Full / Incremental / CDC), and click Start Migration. Progress, throughput, and an ETA are shown live.

💡
For full detail on every screen, see the User Guide.

Prerequisites

Database drivers

Endrias Bridge connects via SQLAlchemy. Each engine needs its driver available on the machine running Endrias Bridge:

EngineDriverNotes
SQL ServerODBC Driver 17 for SQL Server (pyodbc)Install the Microsoft ODBC driver separately
PostgreSQLpsycopg2Bundled with the installer
MySQLPyMySQLBundled with the installer
Oracleoracledbpip install oracledbNo Instant Client needed (thin mode). cx_Oracle is legacy and does not build on Python 3.13+ — do not use it. See Oracle setup guide.
SQLiteBuilt into PythonNo extra driver needed

🧭 Migration Scenarios

Common source → target pairs and the recommended starting point. All pairs benefit from running Assessment first.

SourceTargetRecommended Sync ModeNotes
SQL ServerPostgreSQLFull, then Incremental or CDCCDC requires Standard Edition+ (not Express/Web)
SQL ServerMySQLFull, then Incremental or CDCSchema namespaces may need adjustment
SQL ServerOracleFull, then IncrementalPL/SQL rewrite required for procedures/functions
PostgreSQLMySQLFull, then IncrementalJSONB/Arrays not natively supported on MySQL 5.x
MySQLPostgreSQLFull, then IncrementalAUTO_INCREMENT → SERIAL
OraclePostgreSQLFull, then IncrementalMost common Oracle exit path; CONNECT BY → recursive CTE
OracleMySQLFull, then IncrementalSEQUENCE + trigger → AUTO_INCREMENT
AnySQLiteFull copyLocal/dev target; incremental and CDC are not supported
ℹ️
The full set of source/target pairs and their notes is in the Compatibility Matrix below.

🔁 Sync Mode Comparison

ModeCapturesRequirementsProgress shown
Full copy All rows, every run None Rows copied / total rows, % done & remaining, throughput (rows/sec), ETA clock time
Incremental (watermark column) Inserts & updates since last run A watermark column (e.g. updated_at, RowVersion) and a primary key Tables done / total, % done & remaining, per-table delta throughput (rows/sec) and overall summary
CT Sync — Change Tracking New v75 Inserts, updates & deletes since last CT version checkpoint. PK + operation only — no full before/after row image. SQL Server source with Change Tracking enabled at DB + table level. No CDC license or SQL Server Agent required. Changes applied per table (ins/upd/del breakdown), current CT version checkpoint, table skip warnings if CT version expired
SQL Server CDC Inserts, updates & deletes since last run (full row before/after) SQL Server source with sys.sp_cdc_enable_db / sys.sp_cdc_enable_table run; Standard Edition or higher Tables done / total, % done & remaining, per-table change throughput (changes/sec) and overall summary
⚠️
Run Assessment first — it flags when CDC is unavailable (Express/Web edition, or a low-tier Azure SQL Database) so you can fall back to Incremental or CT Sync.

🤖 CLI Headless Mode New v75

Run any migration from the command line — no GUI window required. Useful for Azure DevOps pipelines, PowerShell scripts, Windows Task Scheduler, and Docker containers.

MigrationBridge migrate \
  --src-type azuresql --src-host SERVER.database.windows.net --src-db SOURCE \
  --src-user user     --src-pass pass \
  --tgt-type rds      --tgt-host rds.xxxx.rds.amazonaws.com  --tgt-db TARGET \
  --tgt-user user     --tgt-pass pass \
  --mode full --schema --data --verify --report report.html

Exit code 0 = success (all tables migrated and verified). Exit code 1 = one or more errors. Use $LASTEXITCODE in PowerShell to gate pipeline stages.

See SOP → CLI Headless Mode for the full flag reference and Azure DevOps YAML example.

🧩 Endrias Bridge Tabs

🗂️ Supported Versions

EngineSupported VersionsNotes
SQL Server2014 and later (incl. Azure SQL Database / Managed Instance)CDC requires Standard Edition or higher
PostgreSQL11 and laterIncludes Azure Database for PostgreSQL, AWS RDS, Google Cloud SQL
MySQL5.7, 8.0, and MariaDB 10.3+JSON/ENUM/SET types are converted on copy — see Data Type Conversions
Oracle11g and later (12c+ recommended)12c+ enables IDENTITY columns and FETCH FIRST syntax
SQLite3.x (bundled with Python)Target only — Full copy mode only

🚧 Limitations

📋 Release Notes & Upgrading

June 2026

a previous build

Upgrading

Download and run the latest MigrationBridge_Setup.exe over an existing installation — it updates the application files in place. Connection profiles (%APPDATA%\Endrias Bridge\connection_profiles.json) and error logs (C:\Endrias Bridge\ErrorLogs) live outside the install directory and are preserved across upgrades.

⚠️
After upgrading from a previous build to the current build, rebuild MigrationBridge.exe using PyInstaller before running new migrations — the fixes in db_migration.py are only picked up by the rebuilt executable. Databases that were migrated with the a previous build build and have temporal tables should use Re-apply Schema Objects from the Schema Objects tab to re-enable system-versioning without re-migrating data.

☁️ Azure SQL → AWS RDS DDL Compatibility

Azure SQL Database and AWS RDS for SQL Server are both SQL Server family engines, so Endrias Bridge applies their DDL directly — no cross-engine type rewrite. However, Azure SQL exposes certain types and schema artifacts that are not valid on AWS RDS. These are automatically rewritten by retype_azure_for_rds during schema creation, with a note line in the migration log for each affected column.

Azure SQL artifactConverted toReason
json column type NVARCHAR(MAX) The json type is Azure SQL-only (added in SQL Server 2022 / Azure SQL). AWS RDS SQL Server 2019 and earlier do not support it as a column type; JSON data is stored as NVARCHAR(MAX) instead.
NullType column (SQLAlchemy reflection of hierarchyid, geography, geometry, or other driver-opaque types) NVARCHAR(MAX) These types are reflected as NullType when the ODBC driver does not expose them. They are stored as their string representation (hierarchyid/1/2/ path, spatial → WKT text).
decimal / numeric with precision > 38 decimal(38, s) — precision clamped to 38 SQL Server's maximum precision for decimal / numeric is 38. A reflected precision above 38 (can appear when the source schema was created via a non-ODBC path) would cause a CREATE TABLE failure.
Server-side column defaults using Azure-only functions Default expression stripped (column retains no default) Azure SQL supports functions such as getutcdate(), newsequentialid(), and sysdatetime() as column defaults. These resolve correctly on RDS too, but Azure-specific variants (e.g. SYSUTCDATETIME() used in certain Azure system views, or custom Azure-only built-ins) are stripped to prevent DDL failures. Row values are copied explicitly so defaults are not needed during migration.
ℹ️
All conversions are logged as NOTE: [table].[column]: <description> lines in the migration log under the --- Azure SQL → RDS DDL compatibility conversions --- header. No data is lost — only the column's DDL type is adjusted.

Change Data Capture (CDC) Replication

SQL Server CDC is Endrias Bridge's most advanced sync mode: it continuously replicates inserts, updates, and deletes from a SQL Server source to any supported target — a continuous copy / replication relationship built directly into the Migration tab.

How it works

Requirements & fallback

💡
Run an initial Full copy first, then switch to CDC for ongoing low-latency sync — the same pattern used for cloud migration cutovers and DR staging copies.

🔒 Encryption & Secure Connections

Endrias Bridge connects via SQLAlchemy connection strings. Append the engine-specific SSL/TLS parameters below whenever the source or target is reachable over a public network — including any cloud-hosted database.

EngineHow to enable SSL/TLS
SQL ServerAdd Encrypt=yes;TrustServerCertificate=yes (or no with a trusted CA) to the ODBC driver options
PostgreSQLAppend ?sslmode=require (or verify-full with sslrootcert=)
MySQLAppend ?ssl_ca=<path-to-ca.pem> and ssl_verify_cert=true
OracleUse a tcps:// protocol with an Oracle Wallet (TNS_ADMIN pointing at the wallet directory)
⚠️
Always enable SSL/TLS for databases reachable over the public internet — this is the default for Azure SQL Database, AWS RDS, and Google Cloud SQL.

☁️ Working with Cloud-Hosted Databases

Azure SQL Database / Managed Instance, AWS RDS / Aurora, Google Cloud SQL, and SQL Server / MySQL / PostgreSQL running on a cloud VM all work as a standard source or target — just supply the cloud endpoint hostname, port, and credentials on the connection screen.

ℹ️
Data-type conversions depend only on the engine (SQL Server, PostgreSQL, MySQL, Oracle, SQLite), not on where it's hosted. A SQL Server source converts identically whether it's on-prem, Azure SQL Database, Azure SQL Managed Instance, AWS RDS for SQL Server, or a VM; likewise a MySQL source (RDS/Aurora MySQL, Cloud SQL for MySQL, or self-managed) always uses the MySQL rules in Data Type Conversions.

🗺️ Compatibility Matrix

Shown on the Assessment tab as Compatibility Issues, based on the selected source/target engines.

SQL Server → PostgreSQL

SQL Server → MySQL

PostgreSQL → MySQL

MySQL → PostgreSQL

Oracle → PostgreSQL

PostgreSQL → Oracle

Oracle → MySQL

MySQL → Oracle

Oracle → SQL Server

SQL Server → Oracle

Any other pair

🔧 Data Type Conversions

Applied automatically when the source and target engines differ — both at schema creation time (column type) and at row-insert time (value conversion, with truncation/rounding reported as WARNING lines in the migration log).

At schema creation time, source-engine artifacts that the target won't accept are also stripped from the generated CREATE TABLE: column collations (e.g. SQL Server SQL_Latin1_General_CP1_CI_AS) and server-side defaults (e.g. SQL Server getdate() / newid()). Row values are copied explicitly, so column defaults aren't needed for the copy.

Source EngineSource TypeConverted ToNote
SQL ServerUNIQUEIDENTIFIERUUID (PostgreSQL) / CHAR(36) string (others)Uses the native UUID type on PostgreSQL; falls back to a 36-char string where the target has no native UUID type
SQL ServerSMALLMONEYNUMERIC(10,4)
SQL ServerMONEYNUMERIC(19,4)
SQL ServerDATETIMEOFFSETTIMESTAMP WITH TIME ZONE
SQL ServerSMALLDATETIMETIMESTAMP
SQL ServerDATETIME2TIMESTAMP
SQL ServerDATETIMETIMESTAMPNo DATETIME type on PostgreSQL
SQL ServerNTEXTTEXTDeprecated SQL Server type
SQL ServerIMAGEBLOB / BYTEADeprecated SQL Server type
SQL ServerVARBINARYBLOB / BYTEANo VARBINARY type on PostgreSQL; length preserved where the target supports it
SQL ServerBINARYBLOB / BYTEANo BINARY type on PostgreSQL
SQL ServerXMLTEXTNo portable XML type; stored as text (lossless)
SQL ServerSQL_VARIANTTEXTValues converted to their string representation
SQL ServerROWVERSIONBINARY(8)Auto-increment-on-write behaviour is lost
SQL ServerTIMESTAMP (rowversion)BINARY(8)Auto-increment-on-write behaviour is lost
SQL ServerBITBOOLEAN
SQL ServerTINYINTSMALLINTNo 1-byte integer type on most other engines
SQL ServerNVARCHARVARCHARNo national-character type on target; length preserved
SQL ServerNCHARCHARNo national-character type on target; length preserved
SQL Serverhierarchyid / geography / geometryTEXTNo SQLAlchemy/driver mapping; read via .ToString() (hierarchyid → /1/2/ path, spatial → WKT). Original type is lost
PostgreSQLUUIDCHAR(36) stringTarget has no native UUID type
PostgreSQLJSONBTEXTStored as JSON text
PostgreSQLJSONTEXTStored as JSON text
PostgreSQLARRAYTEXTStored as JSON text; array semantics are lost
PostgreSQLINTERVALVARCHAR(40) string
PostgreSQLCIDRVARCHAR(45) string
PostgreSQLINETVARCHAR(45) string
PostgreSQLMACADDRVARCHAR(17) string
MySQLSETVARCHAR(255) string
MySQLENUMVARCHAR(255) stringAllowed values become free text
MySQLYEARSMALLINT
OracleROWIDVARCHAR(32) string
OracleLONGTEXT
OracleBFILEVARCHAR(255)File path only; referenced file contents are not migrated
OracleINTERVALVARCHAR(40) string

Row-value conversions

Independent of the table above, individual values are coerced so inserts don't fail against the target type:

Performance & Tuning

Data is copied in batches (fetch + multi-row INSERT). Throughput is driven by a few levers, most of which apply automatically:

LeverDefault / behaviourNotes
Batch size 5,000 rows default; current install set to 100,000 via db_migration_chunk_size in migrationbridge.conf Larger = fewer round-trips = faster, at the cost of more memory per batch. 100,000 is the confirmed production setting (Azure SQL → AWS RDS; actual row widths all < 2,000 bytes). 50,000 is the proven safe floor. Lower to 20,000–25,000 for very wide / BLOB / nvarchar(MAX) tables. The migration log prints Copying in batches of N rows. See MigrationBridge_Troubleshooting.html → Batch size: what to do and NOT to do for the full sizing guide.
SQL Server target fast_executemany=True (automatic) pyodbc otherwise does one round-trip per row; batching is often 10–100× faster on inserts.
PostgreSQL target executemany_mode='values_plus_batch' (automatic) psycopg2 sends batched multi-row VALUES, page-sized to the batch.
Source read Server-side streaming cursor (stream_results, automatic) Large tables stream in batches instead of buffering the whole result in memory.
Parallel tables Concurrent migration jobs (batch/jobs runner) Independent tables/databases can copy in parallel on background threads.
💡
For the fastest large migrations: (1) run the migration machine on an Azure VM or EC2 instance co-located with the source/target — not a laptop over VPN; (2) set db_migration_chunk_size = 100000 for narrow tables (confirmed baseline — actual row widths < 2,000 bytes); (3) increase RDS IOPS / instance class for the migration window and scale back after; (4) never increase resources on the source — all write pressure is on the target. See the full guide at Troubleshooting → Migration Is Too Slow.

acme_audit observed performance

The acme_audit database (52 GB, two schemas: auditdata and analyticsdata) was observed to take 17+ hours on a laptop over VPN with the default 5,000-row batch size. Root causes: default batch size (5,000 rows) and two WAN hops per round-trip (Azure SQL → laptop → AWS RDS). Expected duration with recommended settings (100k batch size, VM co-located with source): 35–45 minutes. See Troubleshooting → Migration Is Too Slow for the step-by-step runbook.

🖥️ Hardware & Sizing

The Assessment tab measures the source database size and recommends a staging-host tier for the migration:

Source DB SizevCPURAMStaging DiskNetwork
Small / Medium (< 500 GB)832 GB100-250 GB SSD1 Gbps+
Medium / Large (500 GB - 3 TB)1248 GB250-500 GB Premium SSD / NVMe1-10 Gbps
Large (3 TB+)1664 GB500 GB+ Premium SSD / NVMe10 Gbps
⚠️
If the source size can't be determined, the smallest tier is shown with a note that the figure is an estimate.

Email Alerts

MigrationBridge can send an HTML email when a migration event occurs. Configure the [alerts] section in C:\MigrationTool\migrationbridge.conf. All alerts are disabled by default — leave smtp_host blank to keep them off.

Supported events

Event keyWhen it fires
errorA single table fails during data copy (non-fatal — migration continues with remaining tables)
fatalThe entire migration crashes — connection lost, schema creation failed, unhandled exception
completeMigration finishes successfully (all tables done)

Configuration — Office 365 / STARTTLS (port 587)

[alerts]
smtp_host     = smtp.office365.com
smtp_port     = 587
smtp_use_tls  = true
smtp_use_ssl  = false
smtp_user     = migrations@endriasbridge.com
smtp_password = YourAppPassword
alert_to      = dba@endriasbridge.com
alert_from    = MigrationBridge <migrations@endriasbridge.com>
alert_on      = error,fatal,complete

Configuration — SSL (port 465)

[alerts]
smtp_host     = smtp.gmail.com
smtp_port     = 465
smtp_use_tls  = false
smtp_use_ssl  = true
smtp_user     = you@gmail.com
smtp_password = YourAppPassword
alert_to      = you@gmail.com
alert_on      = error,fatal
ℹ️
Multiple recipients are supported — separate with commas:
alert_to = dba@endriasbridge.com, oncall@endriasbridge.com

What the email contains

⚠️
After editing migrationbridge.conf, rebuild MigrationBridge.exe with PyInstaller so the new [alerts] section is bundled into the executable. The conf file is read at runtime from the same directory as the EXE, so no rebuild is needed if you only change the SMTP credentials — only the initial bundle of db_alerts.py requires a rebuild.

🧬 Configuration & Extensibility Reference

Endrias Bridge settings

SettingDefaultPurpose
error_log_dir (in migrationbridge.conf)C:\Endrias Bridge\ErrorLogsPersistent per-run error logs from the Migration tab
Connection profiles%APPDATA%\Endrias Bridge\connection_profiles.jsonSaved source/target connection details

Guest-init plugin & metadata API

The guest-initialization side of Endrias Bridge (the Setup Wizard's first-boot pipeline) is driven by the same migrationbridge.conf and is extensible with custom metadata sources and plugins. For the full configuration keys, plugin pipeline, and metadata source reference, see:

🛟 Service, Logs & Troubleshooting

For the guest-initialization side of Endrias Bridge (the Windows service / first-boot plugin pipeline), see the Standard Operating Procedure:

For Endrias Bridge logs and persistent error logs, see User Guide → Logs & Error Logs.

📊 Comparison Report Interpretation

After a migration completes, the db_comparison CSV (produced by running the comparison tool against source and target) is the primary sign-off artifact. Each row has a Status of MATCH, SOURCE ONLY, or TARGET ONLY. Here is how to read each status:

NoSQL engines: Comparison is supported for MongoDB, Cosmos DB, DynamoDB, Redis, Cassandra, and Elasticsearch. For NoSQL pairs, the comparison shows collection/index/key-group names and document/item counts (MATCH / MISMATCH / SOURCE ONLY / TARGET ONLY). Schema-level comparison (columns, indexes, constraints) is not applicable for NoSQL engines.

StatusMeaningAction
MATCH Object or row count is identical on source and target No action — this is the expected outcome
SOURCE ONLY Object exists on source but is missing on target Investigate. For tables: re-run migration for the missing table. For schema objects (procs/views/types): re-apply via the Schema Objects tab
TARGET ONLY Object exists on target but not in source Usually expected — see below for the common categories that produce TARGET ONLY entries

Why TARGET ONLY entries are usually expected

A healthy comparison report for an enterprise database may contain a large block of TARGET ONLY stored procedures, functions, and table types. These come from application schemas that are deployed via SSDT / application installers — not via MigrationBridge — and exist on the shared RDS instance but not in the source Azure SQL database being compared. Common schemas:

SchemaDescriptionDeployed by
coreapiConfiguration API stored procs and TVPs (~73 procs, ~56 types)SSDT / app installer
priceapiFee schedule API stored procs, functions, TVPs (~50 procs, 1 func, ~17 types)SSDT / app installer
customapiCustom edit API procs and TVPsSSDT / app installer
referenceapiAge diagnosis code API procs and TVPsSSDT / app installer
catalogapiCustom CPT/HCPCS API procs and TVPsSSDT / app installer
mappingapiMessage map API procs and TVPsSSDT / app installer
limitsapiFrequency limit API procs and TVPsSSDT / app installer
rulesapiMUE API procs and TVPsSSDT / app installer
dboTVP type aliases shared across the productSSDT / app installer
utilUtility procs, functions, and types not present in all source DBsSSDT / app installer
ℹ️
These TARGET ONLY entries are not migration failures. They indicate that the full application stack is deployed on the RDS target, which is the correct end state. You only need to investigate TARGET ONLY entries if they appear under schemas that were part of the migration (e.g. auditdata, analyticsdata, salesdata, configdata).

Pass criteria for a completed migration

A report that meets all five criteria can be signed off as PASS.

Known validated databases

DatabaseComparison fileTablesColumnsSOURCE ONLYStatusDate
AdventureWorks2019 → Oracle
SQL Server 2019 → Oracle 21c (XE)
migration log verified 71/71 PASS All columns migrated 0 PASS July 2026
acme_audit db_comparison-toaudit.csv 27/27 MATCH 570/570 MATCH 0 PASS June 2026
acme_erp db_comparison-acme_erp.csv 0/99 MATCH — all SOURCE ONLY All SOURCE ONLY 99 tables + all columns/constraints/indexes INCOMPLETE June 2026

acme_audit — detail

The db_comparison-toaudit.csv comparison run against acme_audit (schemas auditdata and analyticsdata) returned 27/27 tables MATCH, 570/570 columns MATCH, 28/28 constraints MATCH, 29/29 indexes MATCH, and 56/56 statistics MATCH. Zero SOURCE ONLY entries. TARGET ONLY entries were exclusively application-schema objects (coreapi, priceapi, customapi, etc.) deployed independently of the migration. Status: PASS — signed off June 2026.

acme_erp — detail (INCOMPLETE — pending re-migration)

The db_comparison-acme_erp.csv comparison run against acme_erp shows that all 99 data tables (schemas coredata, salesdata, customdata, referencedata, catalogdata, limitsdata, mappingdata, rulesdata) are SOURCE ONLY — target column shows for every table row count, meaning the tables were never created on the RDS target. The migration did not land the data schema.

The SSDT-deployed API objects (148 stored procs, 7 functions, 92 TVP types across coreapi, priceapi, customapi, etc.) all show MATCH — those were deployed independently and are healthy.

Remediation — required steps:

  1. Rebuild MigrationBridge.exe with PyInstaller to pick up all the current build fixes.
  2. Run a Full migration (not Resume) from an Azure VM or EC2 instance.
  3. The tool automatically handles any partial state on the target — no manual DROP needed. See Troubleshooting → Full vs Resume.
  4. After migration, re-run the comparison tool and verify all 99 data tables show MATCH.
  5. System-versioning on the 38 temporal tables (salesdata, referencedata, catalogdata, limitsdata, mappingdata, rulesdata) will be re-enabled automatically by the current build at the end of the migration.

📣 Warnings & Messages Reference

Messages that can appear in the Migration tab's log:

MessageMeaning
WARNING ... rounded to fit NUMERIC(p,s)A decimal value had more digits than the target column's scale and was rounded
WARNING ... truncated to fit VARCHAR(n)A string value was longer than the target column and was truncated
WARNING: batch truncation / precision error, retrying N rows individuallyA batch INSERT failed with a truncation or decimal-precision error (fast_executemany pyodbc quirk). The batch is automatically retried row-by-row on a plain connection — no data is lost
progress / ETA below is approximateOne or more tables' row counts couldn't be pre-scanned, so the overall percentage/ETA is an estimate (the copy itself is unaffected)
--- Full copy: ... ---Final summary line: total rows copied, duration, and throughput for a Full copy
--- Delta sync: ... ---Final summary line: total rows synced, duration, and throughput for an Incremental sync
--- CDC sync: ... ---Final summary line: total changes applied, duration, and throughput for a CDC sync
Schema: ready (per schema name)Target schema was created or already existed — DDL succeeded for that schema
Sequence [schema].[name]: created on targetA SEQUENCE object required by a DEFAULT constraint was created on the target before the data copy
[table]: system-versioning ON (history table: …)Temporal table system-versioning was successfully re-enabled on the target after the data copy
[table]: system-versioning FAILEDThe ALTER TABLE … SYSTEM_VERSIONING = ON step failed for this temporal table. Use Re-apply Schema Objects from the Schema Objects tab to retry without re-migrating data. Fixed in the current build.
WARNING [TableName]: verification error -Non-fatal: SQLAlchemy reflection on schema-qualified tables failed during post-creation verification. Tables were still created successfully — confirmed by the Result: all N table(s) OK summary line
NOTE: [table].[col]: json → NVARCHAR(MAX) (and similar)Azure SQL → AWS RDS DDL compatibility conversion applied to this column — see Azure SQL → AWS RDS Compatibility
Copying in batches of N rowsInformational: shows the active db_migration_chunk_size value for this run (default 5,000; 100,000 is confirmed stable for narrow tables)
ℹ️
Errors (connection failures, schema creation errors, etc.) are written to both the Migration tab log and the persistent error log — see User Guide → Logs & Error Logs.

FAQ

Which databases are supported?

SQL Server, PostgreSQL, MySQL, Oracle, and SQLite as both source and target, via SQLAlchemy. See the Compatibility Matrix for per-pair notes.

Do I need to write any SQL to migrate schema and data?

No. The Migration tab reflects the source schema, applies any required data type conversions, creates the tables on the target, and copies the data in chunks.

Does the target database have to exist first?

No. If the target database named on the connection screen doesn't exist, Endrias Bridge creates it automatically (connecting to the server's maintenance database) before creating schemas and tables - including names with dots like dba.stackexchange.com. This needs an account with permission to create databases (PostgreSQL CREATEDB, MySQL CREATE, SQL Server dbcreator); if the account lacks it, the log shows a clear message telling you to create the database manually. SQLite creates its file automatically.

Can the target database have a different name from the source?

Yes. Source and target are independent connections, each with its own Database field - the names don't have to match (e.g. AdventureWorks2019 → analytics_warehouse). Only the schema namespaces inside the database (e.g. HumanResources, Person, Sales) are recreated by the same name within your differently-named target database; the database/catalog name itself is whatever you set on the target connection.

Are stored procedures and views migrated?

For same-engine migrations (e.g. SQL Server → SQL Server / Azure SQL, MySQL → MySQL, PostgreSQL → PostgreSQL), procedures, views, triggers, and functions are applied to the target automatically after the tables and data (best-effort: applied views → functions → procedures → triggers, with one retry pass for inter-object dependencies; failures are logged, never fatal). Across different engines they can't be auto-translated - use the Schema Objects tab to export and rewrite them.

Are system-versioned (temporal) tables supported?

The temporal table and its history table migrate as ordinary tables, so all data comes across. The system-versioning itself (PERIOD FOR SYSTEM_TIME, GENERATED ALWAYS AS ROW START/END, SYSTEM_VERSIONING = ON) is detected and scripted by the Schema Objects tab for you to apply. Re-enabling versioning after migration depends on the target engine:

Period columns (SysStart, SysEnd, ValidFrom, ValidTo) are migrated as plain TIMESTAMP columns on non–SQL Server targets. The migration log flags each one with a note pointing to the Schema Objects tab.

How do I keep the target in sync after the first migration?

Use Incremental sync mode if your tables have a watermark column (e.g. updated_at, RowVersion) and a primary key, or SQL Server CDC sync mode if the source is SQL Server Standard Edition or higher with CDC enabled.

What if my source is too large to estimate an ETA up front?

If a table's row count can't be determined, the migration log notes that progress/ETA is approximate for that table, but the copy still proceeds normally — only the percentage/ETA display is affected.

Where do I find error details after a failed migration?

Check the Migration tab's log first, then the persistent error logs via User Guide → Logs & Error Logs (folder configurable via error_log_dir in migrationbridge.conf).

Can I export the discovered schema objects (procedures, views, etc.)?

Yes — the Schema Objects tab can export everything found to a single .sql file, or apply same-platform objects directly to the target.

Why did my decimal columns fail with "Converting decimal loses precision"?

This is a pyodbc fast_executemany quirk: the driver infers the decimal parameter type from the first row of a batch, and if a later row needs more integer digits (wider precision), the driver rejects the batch. As of the current build, these batches are automatically caught and retried row-by-row on a plain (non-fast_executemany) connection — no data loss, no manual action required. See Troubleshooting → Converting decimal loses precision.

Why were some SEQUENCE objects missing after a resume run?

In a previous build, SEQUENCE objects were only created during a full schema+data migration. Resume or data-only runs skipped the step, causing INSERT failures on tables whose DEFAULT constraint references a sequence. As of the current build, sequence creation runs before the data copy on all paths (full, resume, and data-only).

Why did my temporal tables not have system-versioning after migration?

A missing import in a previous build caused a NameError on the ALTER TABLE … SYSTEM_VERSIONING = ON step. Tables and data were copied successfully, but versioning was not re-enabled. Fixed in the current build. If your database was migrated with a previous build, use Re-apply Schema Objects from the Schema Objects tab to re-enable system-versioning without touching the data.

My migration is running much slower than expected — what should I check?

The three most common causes, in order of impact:

  1. Batch size still at default (5,000). Set db_migration_chunk_size = 100000 in migrationbridge.conf and restart the GUI. At 100k batches vs 5k batches, round-trips drop 20×. Verify the change loaded by checking the migration log for Copying in batches of 100000 rows.
  2. Running from a laptop over VPN. Each batch makes two WAN hops (source read + target write). Move MigrationBridge to an Azure VM co-located with the Azure SQL source, or an EC2 instance co-located with the RDS target. Either eliminates one hop entirely and cuts latency from 20–80 ms to <2 ms.
  3. RDS IOPS exhausted. Check CloudWatch WriteLatency during a live run — if >20 ms, switch to gp3 storage and provision 6,000–12,000 IOPS for the migration window. Scale back afterwards.

For the full diagnosis runbook with CloudWatch checks, expected throughput numbers, and the acme_audit case study (17 hrs → ~40 min), see Troubleshooting → Migration Is Too Slow.

What does a "TARGET ONLY" entry in the comparison report mean?

It means an object exists on the target RDS instance but not in the source database being compared. For enterprise deployments this is almost always expected — application-deployed schemas are installed on the shared RDS instance via SSDT or application installers, not via MigrationBridge. Only investigate TARGET ONLY entries under schemas that were part of the migration itself (e.g. auditdata, analyticsdata). See Comparison Report Interpretation for the full pass criteria.

Should I use Full migration or Resume if my previous migration did not complete?

It depends on what is already on the target:

For acme_erp (all 99 data tables absent from target), Full migration is required. See Troubleshooting → Full vs Resume.

Does migrating from Azure SQL to AWS RDS require special settings?

No manual changes are needed. Endrias Bridge detects the Azure SQL Database → AWS RDS for SQL Server pair and automatically applies DDL compatibility conversions: jsonNVARCHAR(MAX), NullType (hierarchyid/spatial) → NVARCHAR(MAX), decimal precision clamped to 38, and Azure-only server defaults stripped. Each conversion is logged. See Azure SQL → AWS RDS Compatibility.