Heroku transfer db from one app to another

2020-05-16 23:38发布

I need to transfer db from app_1 to app_2

I created backup on app_1

Then ran:

heroku pg:backups restore HEROKU_POSTGRESQL_COLOR --app app_2 heroku pgbackups:url --app app_1

HEROKU_POSTGRESQL_COLOR = database URL for app_2

Then I get:

 !    `pg:backups` is not a heroku command.
 !    Perhaps you meant `pgbackups`.
 !    See `heroku help` for a list of available commands.

So I ran:

heroku pgbackups:restore HEROKU_POSTGRESQL_COLOR --app app_2 heroku pgbackups:url --app app_1

Then I get the following:

!    WARNING: Destructive Action
!    This command will affect the app: app_2
!    To proceed, type "app_2" or re-run this command with --confirm app_2

So I confirmed with:

> app_2
 !    Please add the pgbackups addon first via:
 !    heroku addons:add pgbackups

So then I ran: heroku addons:add pgbackups --app app_2

Adding pgbackups on app_2... failed
 !    Add-on plan not found.

Is there a way around this issue? any help would be greatly appreciated!

* Solution *

I ended up emailing Heroku, they advised that I need to heroku update; heroku plugins:update but heroku update is only available to heroku toolbelt only and I had the gem installed.

Solution:

Install Heroku toolbelt here

Then uninstall the gem:

gem uninstall heroku --all

run the following to get the version and it should output heroku-toolbelt, instead of the gem, more info here

$ heroku --version
  heroku-toolbelt/2.39.0 (x86_64-darwin10.8.0) ruby/1.9.3

To copy the databases over:

heroku pg:backups restore `heroku pgbackups:url --app app_1` HEROKU_POSTGRESQL_COLOR --app app_2

But even better—you can copy directly from one database to another without needing the backup:

Assuming app_2 database url is: HEROKU_POSTGRESQL_GOLD

heroku pg:copy app_1::DATABASE_URL GOLD -a app_2 

That will copy the main database from app_1 to the GOLd database on app_2

8条回答
我欲成王,谁敢阻挡
2楼-- · 2020-05-17 00:20
heroku pg:copy app1_name::HEROKU_POSTGRESQL_ONYX_URL HEROKU_POSTGRESQL_AQUA_URL --app app2_name

Where the second db url is on app2_name

查看更多
Ridiculous、
3楼-- · 2020-05-17 00:21

I found the simpler solution to reuse/share the same resource (postgres database in this case - or any others that allow sharing/reuse) with more than one app on heroku is doing the following:

  1. Go to the older (source) app dashboard on Heroku
  2. Select the "Resources" tab
  3. Locate the resource (postgres database, in our case here)
  4. Click on the icon next to the plan name at the right most part of the row listing the resource
  5. Select the "Attach to another app" option and select the newer (target) app name from the list that shows up

Sample of the extended menu mentioned @ step #4 above!

That's all it takes to share the resource between the apps as it automatically updates all the related configuration settings on the target app. This comes handy since none of the add-on related configuration variables are directly editable, at least from the dashboard (have not checked through the CLI). Hope this helps anyone looking for similar thing.

查看更多
Root(大扎)
4楼-- · 2020-05-17 00:21

I had a related issue. You can save a backup to your local machine, then upload it to some hosting, like amazon s3, and import from given url. This question and following answer may help you: Can't import to heroku postgres database from dump

查看更多
ら.Afraid
5楼-- · 2020-05-17 00:21

You may find useful pgAdmin III (http://pgadmin.org/), a free db management tool specifically designed to do these types of tasks. You can edit/view/import/export from/to your Heroku db directly. Let me know if you need help in setup. (It's like MySQL Workbench, but for PostgreSQL).

查看更多
够拽才男人
6楼-- · 2020-05-17 00:24

If you look at heroku docs it says

PG Backups as an add-on has been deprecated. The commands exist as part of the Heroku Postgres namespace in the CLI. The new functionality is live and available for use.

So you can use the pgbackups functionality directly without having to add any add-ons

To create a backup you can run

 heroku pg:backups capture --app app_name

if you have multiple databases then you can specify database url like this

heroku pg:backups capture HEROKU_POSTGRESQL_PINK

To restore from a backup on another app you can run

heroku pg:backups restore b001 DATABASE_URL --app app_name

You can transfer database by

heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_PINK_URL --app app_name

You can also upload your database to a public url and then use that url to import database on another app by

heroku pg:backups public-url b001 --app app_name

and then import it by

heroku pg:backups restore 'https://s3.amazonaws.com/me/items/3H0q/mydb.dump' DATABASE -a app_name

If you are moving from one app to another and want to use same database for another app then you can follow these steps:

  • Login to your heroku account
  • Select your old app and go to settings tab
  • Reveal config vars for your old app
  • Copy DATABASE_URL
  • Go back and select your new app
  • Replace new apps DATABASE_URL with the old apps value
查看更多
Bombasti
7楼-- · 2020-05-17 00:25

There are simple ways to do this, and there is a fast way to do it

The simple ways generally involve using a backup/restore methodology (including pg:copy, which is a backup that streams the data directly to a pg_restore process), but these are slow in creating the new database because you are restoring a logical definition of tables, loading the data, and creating indexes on the data.

That's a lot of work, and for my 30GB standard-2 databases it can literally take hours.

The fast way to do it is to provision a follower of the database to be copied (e.g. production) on the application you want the data on (e.g. test). On the same 30GB databases that take hours to do a restore, this last took about 15 minutes.

The methodology I use is:

# Get the name of the source database addon (e.g. postgresql-clean-12345)
heroku pg:info -a production-app

# Create a follower on the destination app (choose your own plan)
# You create the follower on the new app because otherwise it is 
# perpetually associated with the source as it's "billing app"
heroku addons:create heroku-postgresql:standard-2 --follow postgresql-clean-12345 -a test-app
heroku pg:wait -a test-app

# Quiesce the destination app
heroku scale web=0 worker=0 -a test-app
heroku maintenance:on -a test-app

# Get the colour of the new database (e.g. HEROKU_POSTGRESQL_GRAY_URL)
heroku pg:info -a test-app

# Unfollow the source database.
# If you want to upgrade the database, do that now instead of the
# unfollow.
heroku pg:unfollow HEROKU_POSTGRESQL_GRAY_URL -a test-app

# Promote the new database on the destination app
heroku pg:promote HEROKU_POSTGRESQL_GRAY_URL -a test-app

# Get the colour of the old database, if any(e.g. HEROKU_POSTGRESQL_MAROON_URL)
heroku pg:info -a test-app

# Destroy the old database (if any)
heroku addons:destroy HEROKU_POSTGRESQL_MAROON_URL -a test-app

# Bring the test app back up
heroku scale web=1 worker=1 -a test-app
heroku maintenance:off -a test-app

Why is this faster?

I believe that when creating a follower, Heroku creates the new database by either copying data files or restoring from a physical (file) backup, then replaying the logs to bring it up to date.

查看更多
登录 后发表回答