Import an existing database

Moving from somewhere else? Seed your managed database once from a dump you upload, so you don't start empty.

If you already have data, you don't have to re-enter it. Export your current database to a file, upload that file, and Dockhold loads it into your app's managed database. It's a one-time seed to get your data across, not an ongoing sync.

Before you start you need two things: a managed database on the app (turn it on from the app's Database tab or when you create the app), and a paid plan (any account with at least one unit of compute). The import button is locked until both are in place.

1. Export your data to a dump

Create the dump with pg_dump. Use these flags so it restores cleanly under your database's own user:

pg_dump -Fc --no-owner --no-privileges yourdb > backup.dump

-Fc writes the compact custom format (smaller, so more of your data fits under the size limit). --no-owner and --no-privileges drop ownership and grant statements, which your app's database user isn't allowed to run anyway. A plain .sql file works too, and so does a gzipped one (pg_dump yourdb | gzip > backup.sql.gz).

2. Upload it

Open the app's Database tab and choose Import data. Pick your dump file and start the import. Keep the tab open while it uploads. When the upload finishes, Dockhold loads the data and the tab shows the progress through to done.

The upload limit is 2 GB. That's the file size after compression, so -Fc or gzip lets you bring across a much larger database. If your dump is bigger than that, this feature isn't the right fit yet.

3. Confirm it landed

When the import succeeds, the Database tab refreshes to show your tables with their row counts and sizes. That's your check that the data made it.

All-or-nothing

The import either applies completely or not at all. If anything in the dump fails, your database is left exactly as it was before, and the tab shows the error so you can fix the dump and try again. Nothing is left half-loaded.

Because of that, import into an empty database. If a table in your dump already exists in the managed database, the import fails cleanly rather than merging or overwriting. It's built to seed a fresh database, not to reconcile two.

One import runs at a time per app, and it's a one-time load, not a backup or a scheduled sync. Once your data is in, your app owns it: write new data through DATABASE_URL as usual. See Databases & storage.