Skip Navigation
Show nav
Heroku Dev Center Dev Center
  • Get Started
  • Documentation
  • Changelog
  • Search
Heroku Dev Center Dev Center
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
    • .NET
  • Documentation
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log in or Sign up
View categories

Categories

  • Heroku Architecture
    • Compute (Dynos)
      • Dyno Management
      • Dyno Concepts
      • Dyno Behavior
      • Dyno Reference
      • Dyno Troubleshooting
    • Stacks (operating system images)
    • Networking & DNS
    • Platform Policies
    • Platform Principles
    • Buildpacks
  • Developer Tools
    • AI Tools
    • Command Line
    • Heroku VS Code Extension
  • Deployment
    • Deploying with Git
    • Deploying with Docker
    • Deployment Integrations
  • Continuous Delivery & Integration (Heroku Flow)
    • Continuous Integration
  • Language Support
    • Node.js
      • Troubleshooting Node.js Apps
      • Working with Node.js
      • Node.js Behavior in Heroku
    • Ruby
      • Rails Support
        • Working with Rails
      • Working with Bundler
      • Working with Ruby
      • Ruby Behavior in Heroku
      • Troubleshooting Ruby Apps
    • Python
      • Working with Python
      • Background Jobs in Python
      • Python Behavior in Heroku
      • Working with Django
    • Java
      • Java Behavior in Heroku
      • Working with Java
      • Working with Maven
      • Working with Spring Boot
      • Troubleshooting Java Apps
    • PHP
      • PHP Behavior in Heroku
      • Working with PHP
    • Go
      • Go Dependency Management
    • Scala
    • Clojure
    • .NET
      • Working with .NET
  • Databases & Data Management
    • Heroku Postgres
      • Postgres Basics
      • Postgres Getting Started
      • Postgres Performance
      • Postgres Data Transfer & Preservation
      • Postgres Availability
      • Postgres Special Topics
      • Heroku Postgres Advanced (Limited GA)
      • Migrating to Heroku Postgres
    • Heroku Key-Value Store
    • Apache Kafka on Heroku
    • Other Data Stores
  • AI
    • Inference Essentials
    • Inference API
    • Inference Quick Start Guides
    • AI Models
    • Tool Use
    • AI Integrations
    • Vector Database
  • Monitoring & Metrics
    • Logging
  • App Performance
  • Add-ons
    • All Add-ons
  • Collaboration
  • Security
    • App Security
    • Identities & Authentication
      • Single Sign-on (SSO)
    • Private Spaces
      • Infrastructure Networking
    • Compliance
  • Heroku Enterprise
    • Enterprise Accounts
    • Enterprise Teams
  • Patterns & Best Practices
  • Extending Heroku
    • Platform API
    • App Webhooks
    • Heroku Labs
    • Building Add-ons
      • Add-on Development Tasks
      • Add-on APIs
      • Add-on Guidelines & Requirements
    • Building CLI Plugins
    • Developing Buildpacks
    • Dev Center
  • Accounts & Billing
  • Troubleshooting & Support
  • Integrating with Salesforce
    • Heroku AppLink
      • Working with Heroku AppLink
      • Heroku AppLink Reference
      • Getting Started with Heroku AppLink
    • Heroku Connect (Salesforce sync)
      • Heroku Connect Administration
      • Heroku Connect Reference
      • Heroku Connect Troubleshooting
    • Other Salesforce Integrations
  • Databases & Data Management
  • Heroku Postgres
  • Migrating to Heroku Postgres
  • Migrating from UpCloud Managed PostgreSQL to Heroku Postgres

Migrating from UpCloud Managed PostgreSQL to Heroku Postgres

English — 日本語に切り替える

Table of Contents [expand]

  • Check Your Database Size
  • Create and Upload the Database Dump
  • Restore to Heroku Postgres
  • Testing and Verifying a Successful Migration
  • Connecting Existing Apps and Services
  • Wrap-up

Last updated June 18, 2026

This article covers migrating to Essential and classic Postgres plans (Standard, Premium, Private, and Shield), and doesn’t apply to Heroku Postgres Advanced (Limited GA) databases.

In this guide, we walk you through the process of migrating your Postgres database from UpCloud-managed PostgreSQL to Heroku Postgres with a dump and restore strategy. This guide uses UpCloud Object Storage to store the database dump file. Before starting the migration, make sure you completed the steps from Preparing Your Migration to Heroku Postgres.

Check Your Database Size

With a managed database from UpCloud, you can estimate your database size either through the web UI or through querying the database with the psql client.

In your UpCloud account, go to Databases and click on your database. Navigate to the Statistics tab to see Disk space usage. Hover your mouse over the chart to see the storage usage.

UpCloud data usage

In the example, the storage is 1.78% of the total 25 GB of storage for this instance, or approximately 440 MB. However, this number includes all storage for the system running on your managed instance, including system files, installations, and more. So, the actual database size is only a fraction of this number.

Usually, the dump and restore strategy for migration is suitable if your database size is less than 100 GB.

For a more accurate size reading, connect to your database instance and use the list databases \l+ command. You can find the Postgres credentials for your database in the Public connection section on the database information page.

UpCloud credentials

Show and copy the connection string. The connection string for using the psql client uses the format:

postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME

Our example database is called Adventureworks, so we connect our database to the psql client with:

$ psql postgres://upadmin:mydatabasepassword@public-demo-schcpsmhczcm.db.upclouddatabases.com:11569/Adventureworks

After connecting, you can show the database size with the list databases \l+ command:

$ psql=> \l+

                        List of databases
    Name        | Owner     | Encoding |   Collate   | Size   |
----------------+-----------+----------+-------------+--------+
 Adventureworks | democoder | UTF8     | en_US.UTF-8 | 112 MB |

The Size column shows our database size is 112 MB.

See Choosing the Right Heroku Postgres Plan for which Heroku Postgres plan fits your database size.

Create and Upload the Database Dump

Before starting, either set your system to read-only mode, or bring all your dependent services offline and notify end users of the current maintenance status.

If your database is attached to a Heroku app, put your app in maintenance mode and downscale any worker dynos that connect to the database.

Back Up Your Database

Before performing the migration, make sure you have a recent backup of your database on UpCloud. UpCloud takes periodic snapshot backups of your managed Postgres database. Navigate to the Backups page for your database to check the recency of your latest backup.

UpCloud backups

Dump the Database to a Local File

Using pg_dump, create a logical backup of your UpCloud database to a local file:

$ pg_dump postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME \
    -Fc -b -v \
    -f /tmp/data-for-migration.sql

The time it takes to run this command varies depending on the size of your database.

Upload the File to UpCloud Object Storage

Heroku can restore Postgres logical backups that are accessible via a URL. For this migration, upload your data backup file to Object Storage from UpCloud, which is S3-compatible.

First, create a bucket. In our example, we named our bucket postgres-for-migration.

UpCloud create bucket

After creating your bucket, upload the /tmp/data-for-migration.sql backup file that you created in the Dump the Database to a Local File step. The bottom of your Object Storage page for UpCloud has a section called AWS CLI connection guide.

UpCloud connection guide

This section shows you how to configure your local machine so that you can use the AWS CLI to access your UpCloud object storage just like you would with AWS S3. With your AWS profile set up to access UpCloud, upload your data backup file to your UpCloud object storage bucket.

$ aws s3 cp \
    /tmp/data-for-migration.sql \
    s3://postgres-for-migration/data-for-migration.sql \
    --profile=upcloud

$ aws s3 ls \
    s3://postgres-for-migration \
    --profile=upcloud

2025-09-29 21:00:00   19289064 data-for-migration.sql

Restore to Heroku Postgres

Create a Heroku App

If you already have your app running on Heroku, you can skip this step.

Use the Heroku CLI to log into your Heroku account.

$ heroku login

Next, create a Heroku app and provide a name for it, such as postgres-migration-from-upcloud.

$ heroku apps:create psql-migration-from-upcloud
Creating ⬢ psql-migration-from-upcloud... done

Provision a Heroku Postgres Add-on

After creating your Heroku app, add the Heroku Postgres add-on with an appropriate plan.

Based on the database information from Check Your Database Size, we use the essential-1 Heroku Postgres plan.

$ heroku addons:create \
    --app psql-migration-from-upcloud \
    heroku-postgresql:essential-1
Creating heroku-postgresql:essential-1 on ⬢ psql-migration-from-upcloud... ~$0.013/hour (max $9/month)
Database should be available soon
postgresql-rectangular-63793 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-rectangular-63793 to check creation progress
Use heroku addons:docs heroku-postgresql to view documentation

Heroku begins provisioning a Postgres database for your Heroku app, providing a unique add-on name. Within a few minutes, you can run the following command with the database name to see the created database.

$ heroku addons:info postgresql-rectangular-63793
=== postgresql-rectangular-63793

Plan:         heroku-postgresql:essential-1
Price:        ~$0.013/hour
Max Price:    $9/month
Attachments:  ⬢ psql-migration-from-upcloud::DATABASE
Owning app:   ⬢ psql-migration-from-upcloud
Installed at: Tue May 19 2026 15:29:01 GMT+0000 (Coordinated Universal Time)
State:        created

Get the Signed URL For the Backup File in UpCloud Object Storage

Next, restore your pg_dump backup to your new Heroku Postgres database. To restore, you need a URL that points to your backup file. The S3-compatible bucket you created isn’t public, but you can generate a temporary, presigned URL that points to your uploaded file.

In the operation, s3 presign takes the S3 URI for the file we want to access. Configure the presigned URL with a reasonable expiration time, such as 5-15 minutes, depending on your backup size.

In our example, the signed URL for our database dump file is:

https://l40iu.upcloudobjects.com/postgresql-for-migration/data-for-migration.sql?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA01A66C4C55E16975%2F20240930%2Feurope-1%2Fs3%2Faws4_request&X-Amz-Date=20240930T045349Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=b70c61e1957311346455c64e0229e8e1415347cf163eb481e7b7f4486ae06984

The presigned URL grants temporary access to your database dump. Use a short expiration time appropriate for your restore duration, and delete the dump file from UpCloud Object Storage after migration completes.

Restore Backup on Heroku

Now that you have the presigned URL, use the Heroku pg:backups:restore command to restore your backup into your new Heroku Postgres database.

Use the heroku pg:backups:restore command and provide the presigned S3 URL for your backup in quotes, and the add-on name to restore your database to:

$ heroku pg:backups:restore 'UPCLOUD-PRESIGNED_URL-IN-QUOTES' postgresql-rectangular-63793 \
    --app psql-migration-from-upcloud \
    --confirm psql-migration-from-upcloud

Use Ctrl-C at any time to stop monitoring progress; the backup will continue restoring.
Use heroku pg:backups to check progress.
Stop a running restore with heroku pg:backups:cancel.

Starting restore of [UPCLOUD-PRESIGNED-URL] to postgresql-rectangular-63793... done
Restoring... done

Keep in mind with this command:

  • When you paste in your UpCloud Object Storage-signed URL, make sure to contain it within quotes.
  • Provide the --app argument to tell Heroku which app and corresponding database you want to operate on.
  • This command is destructive, requiring you to confirm it. If you don’t provide the --confirm argument, you’re asked to confirm the action before continuing.
  • The restore process automatically reassigns ownership of all schemas and tables to the default Heroku credential. The command doesn’t import roles from the source UpCloud Postgres database because the default Heroku database role doesn’t have permission to create Postgres roles.
  • Make sure that all the extensions used in your UpCloud Postgres database are supported on Heroku Postgres.

Migrate Any Custom Settings

Just as you saved your UpCloud Postgres configurations to a file called /tmp/settings_postgres.csv, you can do the same for your Heroku Postgres configuration with the command:

$ heroku pg:psql --app psql-migration-from-upcloud \
    -c "\copy (select * from pg_settings) to '/tmp/settings_heroku.csv' with (format csv, header true);"

Compare your Heroku Postgres settings with your UpCloud Postgres settings. Find any configurations from your UpCloud Postgres setup and reapply them to your Heroku Postgres instance.

Testing and Verifying a Successful Migration

We recommend testing to verify that data has migrated over successfully. Testing can include:

  • Comparing table counts between the two databases.
  • Comparing row counts for every table between the two databases.
  • Comparing query results between the two databases.
  • Running various acceptance tests on your new database to validate proper behavior and performance.
  • Running the heroku pg:backups:info command to review the logs of your backup restore.

Connecting Existing Apps and Services

After verifying that the database migration was successful, point your existing apps and services to the new database.

Get Heroku Postgres Credentials

When you create the Heroku Postgres add-on, Heroku automatically configures a new environment variable called DATABASE_URL, which contains the connection string for the new database. Run the heroku config:get command to fetch the value of the config var:

$ heroku config:get DATABASE_URL --app psql-migration-from-upcloud

postgres://u4pjafvp2at0o7:paa9b63e0bd441af5e1b2d829bf0e4601063b4cbb66dceeb4736b2e3db141c85d@cenqjqs4iipva2.cluster-czrs8kj4isg7.us-east-1.rds.amazonaws.com:5432/d32ljn8e55ahm5

You can also find your credentials with the heroku:pg:credentials command.

The Postgres connection string follows this format, so that you can parse the individual pieces:

postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME

Alternatively, you can obtain the connection string of your database through the dashboard.

Update Dependent Systems and Test

Update your existing systems to point to the Heroku Postgres database using its connection string. Test each system to make sure the connection is successful.

Now, you can also suspend your UpCloud database. Click the Shut down button at the top right of your UpCloud database page.

UpCloud shut down

Wrap-up

Now that your apps and services are pointing to Heroku Postgres and running as expected, you can close the maintenance window and restore full availability to your end users.

When you’re confident that the migration is successful and you no longer need your UpCloud database, you can delete it completely.

With your migration complete, you can now enjoy the flexibility and low-cost convenience of Heroku Postgres. See our Heroku Postgres documentation for more information on using your database.

Feedback

Log in to submit feedback.

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure
  • .NET

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing
  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Github
  • LinkedIn
  • © 2026 Salesforce, Inc. All rights reserved. Various trademarks held by their respective owners. Salesforce Tower, 415 Mission Street, 3rd Floor, San Francisco, CA 94105, United States
  • heroku.com
  • Legal
  • Terms of Service
  • Privacy Information
  • Responsible Disclosure
  • Trust
  • Contact
  • Cookie Preferences
  • Your Privacy Choices