# Restore in the app (/docs/restoring)

Owners and admins can restore any successful backup from the app. backupd decrypts the backup and restores it with the engine's own tools.

## Start a restore [#start-a-restore]

1. Open the backup from **Storage**, **Activity** or the database's **Backups** tab.
2. Click **Restore**.
3. In **Restore this backup**, choose where it goes.

### A different database (recommended) [#a-different-database-recommended]

Restore into a fresh or staging database, check it, then switch over.

- Paste the **Target connection string**. The database must already exist. The credentials are encrypted and used only for this restore.
- The same connection rules apply as for backups: the target must be reachable from the internet over TLS.
- Tick **Replace tables that already exist in the target** if the target already has some of the backup's tables and you want them replaced.
- Click **Start restore**.

### Overwrite the original [#overwrite-the-original]

Replaces the backed-up tables in the original database. Type the database's name to confirm, then click **Overwrite** followed by the database name.

<Callout type="warn">
  Overwriting replaces the data in your live database with the backup's. Prefer
  restoring into a different database first, unless you are sure.
</Callout>

## What happens during a restore [#what-happens-during-a-restore]

The backup's page shows progress while the restore runs, and each restore is listed under **Restores** with its status: **Queued**, **Running**, **Restored**, **Failed** or **Cancelled**.

How each engine restores:

| Engine | Behavior |
| --- | --- |
| PostgreSQL | `pg_restore` in a single transaction, without owners or privileges. If anything fails, the target is left as it was. Restores into servers older than 17 are handled automatically. |
| MySQL, MariaDB | backupd first checks the target for tables that already exist and stops if it finds any, unless you ticked the replace option. `DEFINER` clauses are removed. |
| MongoDB | `mongorestore`, stopping on the first error. Backups with an oplog are replayed with it. The replace option drops each collection before it is restored. |
| Convex | `convex import` into the deployment the backup came from. Restores into another deployment aren't available in the app. |

## Limits [#limits]

- One restore of a given backup runs at a time, and one restore per target.
- Restores running at once across the workspace: 1 on Starter, 2 on Pro.
- A restore stops if it runs longer than your plan's longest run (3 hours on Starter, 6 hours on Pro).
- Restores are not retried automatically. If one fails, fix the cause and start it again.

Every restore is recorded in the [audit log](/docs/team/audit-log).

## Restore without the app [#restore-without-the-app]

You can also download a backup and restore it yourself, with or without backupd. See [Download a backup](/docs/restoring/download) and [Restore without backupd](/docs/restoring/without-backupd).
