<!-- Source: https://dev.dbmigratepro.com/docs/supported-migrations -->

# Supported migrations & integrity

## What we support

| From → To | Type | Rate |
|---|---|---|
| MySQL → MySQL | Same-engine transfer | $2/GB |
| PostgreSQL → PostgreSQL | Same-engine transfer | $2/GB |
| MySQL → PostgreSQL | Cross-engine conversion | $4/GB |
| PostgreSQL → MySQL | Cross-engine conversion | $4/GB |

Source and target can live on **any host or any cloud** — a managed provider, a droplet,
or your own server. We connect over the connection URL; there's no cloud lock-in and no
infrastructure for you to set up.

The engine detects transfer vs. conversion automatically from the two URLs, and the price
is shown at pre-flight before you commit.

## How integrity is guaranteed

A migration that can't prove it's correct **fails closed** — it never reports success on a
partial or broken result. Every run:

- **Migrates the schema first**, then loads data table by table.
- **Preserves foreign keys** and re-applies them after load, in dependency order.
- **Recreates indexes** (including unique indexes).
- **Maps types correctly** on cross-engine conversions (e.g. MySQL `TINYINT(1)` ↔ boolean,
  unsigned integers, `BLOB` ↔ `bytea`), preserving values.
- **Verifies row counts** per table against the source. A mismatch fails the migration.

## Connection URLs

Both engines accept a standard URL. You can also paste a **Laravel Cloud** URL or a
**Forge `.env`** snippet in the UI and we'll parse it.

```
mysql://user:password@host:3306/database
postgresql://user:password@host:5432/database
```

For managed databases that require TLS, include the appropriate `sslmode` (PostgreSQL) or
TLS parameters — the pre-flight check will tell you if the connection can't be established.

## Limits

- Migrations above **1000 GB** route to a custom conversation — [contact us](/contact?topic=sales).
- Distributed/sharded cluster topologies are not yet supported as a single job.
