Data Migration

Migrate data between databases with Pipelines

CanvaDB Pipelines move data from one database to another using a batch ETL engine — no scripts, no staging servers, no manual exports. Follow the steps below to run your first migration.

PRO & EnterpriseMongoDB → PostgreSQLPostgreSQL → MySQLNo scripts required
01

Understand the pipeline architecture

CanvaDB pipelines use a standard ETL (Extract → Transform → Load) pattern. Data is pulled from the source in batches of 500 rows, type-coerced into a consistent format, then written to the target in groups of 100 rows. Each table is dropped and recreated before the first batch, so every run starts clean. Progress is tracked in real time — bytes are counted at extraction, not load, so the counter always advances.

FREE plan pipelines are capped at 1 GB per run. PRO and Enterprise plans have no transfer limit.

ETL Pipeline Architecture
MG
Source
MongoDB Atlas
Collections scanned Row count estimated
Extract
Batch 500 rows
SKIP / LIMIT pagination loop
Transform
Type coercion
ObjectId → string Date → ISO string Null-safe
Load
Batch INSERT
100 rows/INSERT Parameterized SQL Idempotent
PG
Target
Neon PostgreSQL
DROP + CREATE before first batch All TEXT columns
Live tracking
Bytes measured
after extract, before load
Progress bar
updates each batch
Log stream
INFO / SUCCESS / WARNING / ERROR
1 GB cap
FREE plan only
02

Open the Pipelines page

Pipelines are available on PRO and Enterprise plans. From the left sidebar, click Pipelines to view all your migration runs. Each row shows the source → target types, unique pipeline ID (PLN-XXXXXX), row count, bytes transferred, and current status.

Supported source → target combinations
Source ↓ / Target →
MG
MongoDB
PG
PostgreSQL
MY
MySQL
MG
MongoDB
PG
PostgreSQL
MY
MySQL
DynamoDB and MSSQL connections can be tested and schemas viewed, but are not yet supported as pipeline sources or targets.
canvadb.com/pipelines
Projects
Organisation
Pipelines
Settings
Pipelines
Monitor and manage data migrations
+ New Pipeline
MG
PG
Prod → Analytics
PLN-A3F9D2 · 12,450 rows · 847 KB
COMPLETED
PG
MY
Staging Migration
PLN-B7E1C5 · 3,201 rows · 281 KB
RUNNING
MG
PG
Events Backfill
PLN-C2D4A8 · rows ·
PENDING
03

Create a new pipeline

Click "+ New Pipeline" and fill in a name, then choose the source database type (MongoDB, PostgreSQL, or MySQL) and the target database type. This just defines the configuration — no credentials are stored at this stage.

canvadb.com/pipelines
New Pipeline
Configure source and target databases
Pipeline name
Prod MongoDB → Analytics PG
Source database
MG
MongoDB
Target database
PG
PostgreSQL
M
MongoDB
P
PostgreSQL
M
MySQL
Cancel
Create Pipeline
04

Enter connection strings and start

Open the pipeline you just created. Paste the source and target connection strings — CanvaDB encrypts them with AES-256-GCM before using them. When ready, click "Start Pipeline". The run is asynchronous — the page polls every 3 seconds so you see live updates without refreshing.

Connection strings are used only for the active run and never stored in plain text. Use a read-only replica for the source where possible.

canvadb.com/pipelines/PLN-A3F9D2
Prod MongoDB → Analytics PGPLN-A3F9D2PENDING
MG
MongoDB Atlas
PG
PostgreSQL (Neon)
Source connection string
mongodb+srv://user:••••••@cluster0.abc.mongodb.net/prod
Target connection string
postgresql://neon_owner:••••••@ep-odd-shadow.neon.tech/analytics

Credentials are encrypted with AES-256-GCM and never stored in plain text. Each run clears and recreates the target tables — previous data is replaced.

Start Pipeline
05

Watch the live log stream

The terminal-style log viewer shows every stage as it happens: connection success, schema mapping, per-table extraction, target table preparation, batch loads, and row counts. Each log entry has a timestamp, level badge (INFO / SUCCESS / WARNING / ERROR), and message. Toggle Auto-scroll to keep the latest log in view.

canvadb.com/pipelines/PLN-A3F9D2
RUNNING
PLN-A3F9D2
281.1 KB transferred
12:30:00INFOConnecting to source (MONGODB)…
13:31:01SUCCESSConnected to source MongoDB
14:32:02INFOMapping source schema…
15:33:03INFOSchema mapped: 3 collections found
16:34:04INFO • users (1,000 rows)
17:35:05INFO • orders (8,200 rows)
18:36:06INFO • products (250 rows)
19:37:07SUCCESSConnected to target PostgreSQL
20:38:08INFO[1/3] Extracting "users" (1,000 rows)…
21:39:00INFO → target "users" cleared and ready
22:310:01SUCCESS ✓ "users" — 1,000 rows migrated (78.4 KB)
23:311:02INFO[2/3] Extracting "orders" (8,200 rows)…
24:312:03INFO → target "orders" cleared and ready
12:413:09
Auto-scroll
06

Migration complete — share or re-run

When all tables finish, the status flips to COMPLETED and the final summary log shows total rows, total megabytes, and table count. A progress bar fills to 100%. From here you can share a read-only link to this pipeline run — useful for handing off to stakeholders or keeping an audit trail. Click "Start Pipeline" again at any time to re-run; the target tables are wiped clean so there's no risk of duplicate rows.

canvadb.com/pipelines/PLN-A3F9D2
COMPLETED
PLN-A3F9D2
0.74 MB transferred
9,450
Rows migrated
0.74 MB
Data transferred
3
Tables
12:44:00SUCCESS ✓ "orders" — 8,200 rows migrated (668.1 KB)
12:45:01INFO[3/3] Extracting "products" (250 rows)…
12:46:02INFO → target "products" cleared and ready
12:47:03SUCCESS ✓ "products" — 250 rows migrated (18.3 KB)
12:48:04SUCCESSMigration complete — 9,450 rows · 0.74 MB transferred across 3 tables
Share this pipeline run →canvadb.com/pipelines/share/…

Common questions

What happens to existing data in the target?

Each table is dropped and recreated before the first batch. This means every run starts from a clean state — no duplicates, no stale rows. If a table already existed in the target it will be replaced entirely.

Are all column types preserved?

Currently all columns are created as TEXT in the target. Dates, numbers, and booleans are serialized to their string equivalents. Native type mapping (INT, TIMESTAMP, etc.) is on the roadmap.

What is the 1 GB cap on FREE?

Bytes are counted after extraction (before load). When the running total crosses 1 GB, the migration stops and marks itself COMPLETED — partial data is preserved in the target. Upgrade to PRO for unlimited transfers.

Can I re-run a pipeline safely?

Yes. Each run drops and recreates target tables so re-runs are fully idempotent. For MongoDB targets, documents are upserted by _id — no duplicates are created.

Can I share a pipeline run with someone outside my team?

Yes — from the pipeline detail page click Share, toggle the link on, and copy the URL. The recipient sees the log stream, status, and progress in read-only mode. No login required. Credentials are never exposed on the public page.

Ready to run your first migration?

Start on the free plan — pipelines up to 1 GB are included. Upgrade to PRO for unlimited transfers, live collaboration, and audit logs.