Deep-dive on the Next Gen Platform. Join the Webinar!

Skip Navigation
Show nav
Dev Center
  • Get Started
  • Documentation
  • Changelog
  • Search
  • 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 inorSign 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
  • Developer 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
      • Node.js Behavior in Heroku
      • Working with Node.js
      • Troubleshooting Node.js Apps
    • Ruby
      • Rails Support
      • 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
      • Working with PHP
      • PHP Behavior in Heroku
    • 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
      • Migrating to Heroku Postgres
    • Heroku Key-Value Store
    • Apache Kafka on Heroku
    • Other Data Stores
  • AI
    • Working with AI
    • Heroku Inference
      • AI Models
      • Inference Essentials
      • Inference API
      • Quick Start Guides
  • 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
    • Heroku Connect (Salesforce sync)
      • Heroku Connect Administration
      • Heroku Connect Reference
      • Heroku Connect Troubleshooting
  • 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
  • Databases & Data Management
  • Heroku Postgres
  • Postgres Basics
  • Changing the Plan or Infrastructure of a Heroku Postgres Database

Changing the Plan or Infrastructure of a Heroku Postgres Database

English — 日本語に切り替える

Last updated February 26, 2025

Table of Contents

  • Changing with addons:upgrade
  • Changing with Follower Changeover
  • Changing with pg:copy
  • Deprovisioning the Old Primary Database

This article describes available methods for changing the plan or underlying infrastructure of a Heroku Postgres database.

This article documents the process of changing your PostgreSQL plan and infrastructure, which in some cases can also upgrade your PostgreSQL version. If you only want to upgrade your PostgreSQL version, see Upgrading the Version on Heroku Postgres Databases.

Heroku supports three methods for changing Postgres plans and infrastructure. All methods require some application downtime to ensure that no data is lost during the process.

Plan Change Method Description
heroku addons:upgrade Description: Changes the plan and infrastructure of a production database while preserving its major PostgreSQL version.

Compatible plans: Works for all Heroku Postgres plans. You can use this command to change Essential-tier databases to another plan in that tier. To change Essential-tier databases to plans on other tiers, use pg:copy instead.

Downtime required: Requires up to several hours to prepare a replacement (during which the application can remain active), and less than 1 minute of downtime during the changeover.

Follower databases: Repoints any database followers to the new primary.
Follower changeover Description: Changes the plan and infrastructure of a production database while preserving its major PostgreSQL version.

Compatible plans: Only works with Standard, Premium, Private, or Shield tier databases.

Downtime required: Requires up to several hours to prepare a follower (during which the application can remain active), and less than 1 minute of downtime during the changeover.

Follower databases: Requires recreation of followers to point to the new primary.

In general, addons:upgrade is preferable to a follower changeover, due to follower repointing and Heroku-controlled mechanisms for running maintenance.
pg:copy Description: Works for all plan change scenarios. Required to change an Essential-tier database plan to a plan in another tier.

Version upgrades: Can be used to upgrade major PostgreSQL version.

Downtime required: Requires downtime of about 3 minutes per GB, though this amount can vary substantially.

Follower databases: Requires recreation of followers to point to the new primary.

Changing with addons:upgrade

Essential-Tier

To change an Essential-tier database plan to another plan in the same tier, running addons:upgrade starts the plan change immediately without waiting for or running a scheduled maintenance.

$ heroku addons:upgrade HEROKU_POSTGRESQL_CRIMSON_URL heroku-postgresql:essential-1 -a example-app
Changing HEROKU_POSTGRESQL_CRIMSON_URL on example-app from heroku-postgresql:essential-0 to heroku-postgresql:essential-1... done, ~$0.012/hour (max $9/month)
Your database's plan is being changed from essential-0 to essential-1.

Running addons:upgrade to change an essential-* plan puts the database in read-only mode, so no writes happen during the plan change. You can also put your app in maintenance mode before starting the plan change so no new data is written to your database during the process. The plan change transfers data to a new database on the chosen Essential plan and updates the config vars to point to the new Essential database.

Standard-Tier and Higher

You can’t use addons:upgrade to change a Standard-tier or higher database to an Essential-tier database. Instead, you can use pg:copy.

To change a database plan with addons:upgrade, you:

  1. Run heroku addons:upgrade on your database
  2. Run or wait for your scheduled maintenance window

Changing with addons:upgrade requires little app downtime (less than a minute). Before the changeover, however, it can take several hours to prepare the replacement (during which your application is still active), so plan accordingly.

1. Run the heroku addons:upgrade Command

This command prepares your database for a plan change. This process isn’t instant, and can take several hours for larger databases.

$ heroku addons:upgrade HEROKU_POSTGRESQL_LAVENDER_URL heroku-postgresql:premium-4 -a example-app
Changing HEROKU_POSTGRESQL_LAVENDER_URL on tc-data-test from heroku-postgresql:standard-0 to heroku-postgresql:premium-4... done, ~$1.042/hour (max $750/month)
Your database's plan is being changed.
This triggers a maintenance that you can run with `heroku data:maintenances:run`.

When your database is ready for a plan change, you receive an email about upcoming scheduled maintenance for your database

2. Run (or Wait for) the Scheduled Maintenance

When ready, the addons:upgrade command schedules your database for a maintenance that performs the plan change on the database.

This process is the same as the maintenance mechanism described in Heroku Postgres Maintenance Windows.

When you’re ready to run maintenance on your database, refer to Running a maintenance manually. After the maintenance is complete, your database will be on hardware matching the new plan.

If your database has one or more followers, when the plan change maintenance occurs, Heroku attempts to point the followers to the replacement database. Pointing the followers to the replacement requires the follower database to be restarted. In some cases, if we’re unable to point the follower at the replacement, we automatically prepare and promote a replacement database.

If you want to stop a plan change, see this Help article.

Changing with Follower Changeover

Changing a plan with a follower changeover involves these manual steps:

  1. Provision a follower database with the plan you want to change to, and wait for it to catch up to your primary database. If you change to update the underlying hardware for your plan, choose the same plan your database is currently on.
  2. Place your app in maintenance mode.
  3. Unfollow and promote the follower to be your primary database.
  4. Exit maintenance mode.

For a more automated method, use addons:upgrade.

Before the changeover, it can take several hours to complete the manual sets of preparing the follower and placing your app in maintenance mode, so plan accordingly. After preparing the steps, the follower changeover requires usually less than a minute app downtime to complete.

1. Provision the Follower Database

Create a follower for your database and wait for the follower to catch up to the primary database:

The addons:create example follows the syntax for Heroku CLI v9.0.0 or later. If you’re on v8.11.5 or earlier, use the command:

$ heroku addons:create heroku-postgresql:standard-2 --follow HEROKU_POSTGRESQL_LAVENDER_URL --app example-app
$ heroku addons:create heroku-postgresql:standard-2 --app example-app -- --follow HEROKU_POSTGRESQL_LAVENDER_URL
Creating heroku-postgresql:standard-2 on example-app... $200/month
! WARNING: Follower will become available for read-only queries when up-to-date.
Use `heroku pg:wait` to track status.
postgresql-shaped-12345 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-shaped-12345 to check creation progress
$ heroku addons:wait
Creating postgresql-shaped-12345... done
Created postgresql-shaped-12345 as HEROKU_POSTGRESQL_WHITE_URL

The follower is considered “caught up” when it is within 200 commits of the primary database. You can check how many commits the follower is behind with the pg:info command (see the Behind By row of the follower database):

$ heroku pg:info --app example-app
=== HEROKU_POSTGRESQL_LAVENDER
Plan:        Standard 0
Status:      Available
...
=== HEROKU_POSTGRESQL_WHITE
Plan:        Standard 2
Status:      Available
...
Following:   HEROKU_POSTGRESQL_LAVENDER (DATABASE_URL)
Behind By:   125 commits

2. Enter Maintenance Mode to Prevent Database Writes

It’s important that no new data is written to your current primary database during the plan change process, because it doesn’t transfer to the new database. To accomplish this, place your app into maintenance mode. If you have scheduler jobs running as well, disable them.

Maintenance mode doesn’t automatically scale down dynos. Scale down web and any non-web dynos (for example, heroku ps:scale worker=0) to ensure that no connections are writing data to the database.

 

If the database you’re changing is using Heroku Connect, pause the synchronization at this point to ensure that the connection isn’t writing data to the database. Instructions are available in Heroku Connect: Upgrading Your Database.

 

Your application is unavailable starting at this point in the plan change process.

$ heroku maintenance:on
Enabling maintenance mode for example-app... done

3. Promote the Follower Database

Now that you are in maintenance mode and no additional data is being written to the primary database, you can promote the follower database to take over from the current primary one.

Wait for the follower database to fully catch up to the primary (as indicated by being behind by 0 commits).

$ heroku pg:info --app example-app
=== HEROKU_POSTGRESQL_LAVENDER_URL
Plan:        Standard 0
Status:      available
...
=== HEROKU_POSTGRESQL_WHITE_URL
Plan:        Standard 2
Status:      available
...
Following:   HEROKU_POSTGRESQL_LAVENDER_URL (DATABASE_URL)
Behind By:   0 commits

When the follower is caught up and no new data is being generated, issue an unfollow command to convert the follower into a full, writeable database.

$ heroku pg:unfollow HEROKU_POSTGRESQL_WHITE_URL --app example-app
 ▸    WARNING: Destructive action
 ▸    postgresql-shaped-12345 will become writeable and no longer follow HEROKU_POSTGRESQL_LAVENDER. This cannot be undone.
 ▸
 ▸    To proceed, type example-app or re-run this command with --confirm example-app

> example-app
postgresql-shaped-12345 unfollowing... done

After the unfollow is successful, pg:info shows that the database is now a fork of its parent (Forked From: HEROKU_POSTGRESQL_LAVENDER).

You can also verify that the database is out of read-only mode by running the SQL command: SELECT pg_is_in_recovery();, which returns false when the new database is ready for read-write connections.

Then, promote it to set it as the primary database (at the DATABASE_URL location) used by your application:

$ heroku pg:promote HEROKU_POSTGRESQL_WHITE_URL --app example-app
Promoting HEROKU_POSTGRESQL_WHITE_URL to DATABASE_URL on example-app... done

The follower database is now the primary database (although the application isn’t yet receiving new requests).

If your original primary database was attached to multiple apps, you must attach your new database to those apps with heroku addons:attach.

After the changeover, other followers of your original primary database don’t automatically start to follow your new primary. You must recreate followers to point to your new primary database.

Create followers for the new primary database as needed. If you’re using Heroku CLI v9.0.0 or later, run the command:

$ heroku addons:create heroku-postgresql:standard-0 -a example-app -- --follow DATABASE_URL

If you’re using Heroku CLI v8.11.5 and earlier, run the command:

$ heroku addons:create heroku-postgresql:standard-0 --follow DATABASE_URL -a example-app

Be sure to deprovision your old followers after you no longer need them.

 

If your old primary was using connection pooling, and it was attached with the default name DATABASE_CONNECTION_POOL, the promote reattaches the connection pooler to the new primary under the same name DATABASE_CONNECTION_POOL.

Attachments under non-default names aren’t reattached. You must activate connection pooling on your new primary if you wish to keep using connection pooling on your new primary with the same non-default name as the old primary:

$ heroku pg:connection-pooling:attach DATABASE_URL --as MY_DATABASE_CONNECTION_POOL -a example-app

4. Exit Maintenance Mode

To resume normal application operation, scale any non-web dynos back to their original levels. For example, if you had previously scaled down a worker dyno, you would scale it back up now with heroku ps:scale worker=1.

Finally, turn off maintenance mode:

$ heroku maintenance:off
Disabling maintenance mode for example-app... done

Your application is now receiving requests to your database instance. You can confirm maintenance mode is off by running heroku pg:info. The database denoted by DATABASE_URL is considered the primary database.

If your Heroku Postgres database isn’t connected to a Heroku application, you must retrieve the HEROKU_POSTGRESQL_WHITE_URL and update your application to use it as your primary database.

Changing with pg:copy

The pg:copy command supports plan changes between all supported Heroku Postgres plans and version upgrades. Additionally, it’s the only supported method to change an Essential-tier database to a plan in another tier.

Instructions for using pg:copy are available in Upgrading Heroku Postgres Databases.

Deprovisioning the Old Primary Database

After you change your database plan with either a follower changeover or pg:copy, be sure to deprovision your old primary database:

$ heroku addons:destroy HEROKU_POSTGRESQL_LAVENDER_URL

Dataclips that were associated with the old primary database must be reassigned to the new database. Follow the instructions on Dataclip recovery to resolve any recoverable Dataclips.

Keep reading

  • Postgres Basics

Feedback

Log in to submit feedback.

Upgrading the Version of a Heroku Postgres Database Choosing the Right Heroku Postgres Plan

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
  • © 2025 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