SwapSQL

Live transfer failed: "produced no tables" or "could not read the source"

A live transfer connects straight to your source and target databases over the network instead of working from an uploaded dump file. When it stops early, it almost always shows one of two messages:

Both are connection-and-permissions problems, not data problems. Here is how to find the real cause in a couple of minutes. If you would rather skip the networking entirely, export a dump and use the file converter — it never needs to reach your database.

First: confirm the source is reachable from outside

Run the same connection from your own machine. If it fails for you, it will fail for our servers too.

# PostgreSQL source — list tables in the public schema
psql "postgresql://USER:PASS@HOST:5432/DBNAME?sslmode=require" -c "\dt"

# MySQL source — list tables
mysql -h HOST -P 3306 -u USER -p DBNAME -e "SHOW TABLES;"

Supabase and other IPv6-only hosts

Supabase's direct connection host is IPv6-only, so a server without IPv6 routing simply cannot reach it and the read fails. Use the Session pooler connection string instead — it is reachable over IPv4. In the Supabase dashboard open Project Settings → Database → Connection string and pick the pooler entry (port 5432, host containing pooler.supabase.com).

"Produced no tables": the source connected but looked empty

This means we authenticated and queried, but the schema we read had no tables. The usual reasons:

SELECT table_schema, count(*)
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
GROUP BY table_schema;
-- PostgreSQL: let the migration role read every table in the schema
GRANT USAGE ON SCHEMA public TO migrator;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO migrator;

Target-side checks

If the source clearly has tables but the target ends up empty, the writer could not create them:

A reliable fallback that skips the network

Live transfers depend on two databases both being reachable, correctly permissioned and SSL-configured at the same moment. When that is hard to arrange — locked-down VPCs, IPv6-only hosts, short-lived credentials — the file route avoids all of it. Export once and convert the file:

# PostgreSQL source
pg_dump --no-owner --no-privileges "postgresql://USER:PASS@HOST:5432/DBNAME?sslmode=require" > source.sql

# MySQL source
mysqldump --single-transaction --no-tablespaces -h HOST -u USER -p DBNAME > source.sql

The dump runs with your own credentials, on your own network, so none of the connection puzzles above apply. Then upload the file and let the converter handle the schema and data translation.

Tired of fighting connections? Convert a dump file to PostgreSQL instead →