Auf Heroku versuche ich, die Produktionsdatenbank mit dem Add-In für pgbackups in meine Staging-App zu kopieren. Ich habe die Anweisungen auf der Addon-Seite befolgt: https://devcenter.heroku.com/articles/pgbackups
Zuerst habe ich die Datenbank erfasst:
heroku pgbackups:capture --app production-app
Das hat funktioniert:
HEROKU_POSTGRESQL_PURPLE (DATABASE_URL) ----backup---> b238
Capturing... done
Storing... done
Jedoch, wenn ich versuche, es in der Staging-App wiederherzustellen:
heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --remote staging
Ich erhalte folgende Fehlermeldung:
DATABASE_URL does not match any of your databases
! Could not resolve database DATABASE
!
! Available databases:
Ich habe auch versucht, die vollständige URL einzugeben:
heroku pgbackups:url b238 --app production-app
heroku pgbackups:restore DATABASE "https://s3.amazonaws.com/..." --remote staging
und versuchte auch, die App zu benennen (anstelle von --remote staging):
heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --app staging-app
Nichts davon funktionierte. Es ist interessant zu beachten, dass die Fehlermeldung besagt, dass es keine "verfügbaren Datenbanken" gibt. Ich gehe davon aus, dass es sich um die Staging-App handelt, die tatsächlich leer ist. Wenn ich tippe:
heroku pgbackups
Ich bekomme:
! No backups. Capture one with `heroku pgbackups:capture`.
Um die verfügbaren Backups (Produktion) zu finden, muss ich Folgendes eingeben:
heroku pgbackups --app production-app
und ich bekomme die Liste der aktuellen Sicherungen. Ich weiß nicht, ob dies normal ist oder sogar, ob es mit dem Problem zusammenhängt, aber ich dachte, ich sollte es erwähnen.
Ich habe jede Antwort hier auf SO gelesen und ausprobiert, aber nichts hat funktioniert. Irgendwelche Ideen?
Update für Mitte 2017 (Diebstahl von Takehiro Mouri - Vereinfachung des Teils DATABSE_NAME)
Update für Mitte 2015 ...
Das pgbackups-Add-on wurde nicht mehr unterstützt. Nicht mehr pgbackups:transfer
.
So kopieren Sie eine Datenbank von yourapp nach yourapp_staging:
# turn off the web dynos in staging
heroku maintenance:on -a yourapp-staging
# if you have non-web-dynos, do them too
heroku ps:scale worker=0 -a yourapp-staging
# backup the staging database if you are paranoid like me (optional)
heroku pg:backups capture -a yourapp-staging
# execute the copy
heroku pg:copy your-app::DATABASE_URL DATABASE_URL -a yourapp-staging
Wenn es fertig ist, schalten Sie die Inszenierung wieder ein:
# this is if you have workers, change '1' to whatever
heroku ps:scale worker=1 -a yourapp-staging
heroku maintenance:off -a yourapp-staging
UPDATE: Das funktioniert nicht mehr. Bitte beziehen Sie sich auf @ lucas-nelsons answer unten.
Damit ist es jetzt noch einfacher. Checkout des transferbefehls als Teil von pgbackups
heroku pgbackups:transfer HEROKU_POSTGRESQL_PINK sushi-staging::HEROKU_POSTGRESQL_OLIVE -a sushi
Das hat wunderbar funktioniert, wenn ich den Produktionscode mit auf meine Staging-Site gebracht habe.
UPDATE: Sie können diesen Befehl ausführen, um die Datenbank von der Produktion zum Staging zu übertragen: heroku pg:copy your-app::DATABASE_URL DATABASE_URL -a yourapp-staging
Sie werden aufgefordert, die Aktion zu bestätigen. Sobald Sie dies getan haben, werden alle Daten migriert.
Hier ist eine einfache und sichere Lösung mit Herokus Zusatzgeräten und Gabelungen. Es sind keine Sicherungen, keine Ausfallzeiten und keine Datenbank überschrieben.
Sie müssen zuerst die Produktionsdatenbank an die Staging-App anschließen und dann die Staging-App aufrufen. Wenn Sie sich in der Produktions-App verzweigen, dann an die Staging-App anschließen, wird die Abrechnungs-App die Produktions-App, und Sie können die Gabel nicht von ihr trennen.
1. Ermitteln Sie zuerst den Add-On-Namen Ihrer Produktionsdatenbank (hier ist es postgres-prod-123
):
$ heroku addons --app myapp-production
heroku-postgresql (postgresql-prod-123) standard-0 $50/month
└─ as DATABASE
2. Dann Attach das Add-On der Produktionsdatenbank an Ihre Staging-App. Vergeben Sie einen Namen wie PRODUCTION_DB
, damit Sie ihn leicht erkennen können:
$ heroku addons:attach postgresql-prod-123 --app myapp-staging --as PRODUCTION_DB
3. Dann Erstellen Sie einen Fork der Produktionsdatenbank in der Staging-App:
$ heroku addons:create heroku-postgresql:standard-0 --fork PRODUCTION_DB_URL --as STAGING_DB --app myapp-staging
4. Steigern Sie die Gabel schließlich als primäre Datenbank Ihrer Staging-App:
$ heroku pg:promote STAGING_DB --app myapp-staging
Erledigt! Ihre Staging-App verwendet jetzt eine Kopie Ihrer Produktionsdatenbank. Beachten Sie, dass Ihre vorherige Staging-Datenbank noch vorhanden ist. Möglicherweise möchten Sie sie löschen, nachdem Sie sichergestellt haben, dass alles funktioniert.
Trennen Sie zum Bereinigen die Produktionsdatenbank von der Staging-App:
$ heroku addons:detach postgresql-prod-123 --app myapp-staging
Das funktioniert für mich:
heroku pg:copy you-app-production::DATABASE DATABASE -a you-app-staging
Erstellen Sie zunächst eine aktuelle Sicherung der Produktion:
heroku pgbackups:capture -a productionappslug --expire
Finden Sie heraus, in welcher Farbe Heroku Ihre Datenbank benannt hat.
https://postgres.heroku.com/databases oder https://dashboard.heroku.com/apps/STAGINGAPPSLUG/resources
Laden Sie dann das Produktions-DB-Backup in das Staging (ändern Sie ROT in jede Farbe):
heroku pgbackups:restore HEROKU_POSTGRESQL_RED -a stagingappslug `heroku pgbackups:url -a productionappslug`
stagingappslug und liveappslug sind die Kurznamen, die Ihre Heroku-Apps heißen.
Sie können dies mit dem folgenden Befehl tun
heroku pg:copy <production_app_name>::HEROKU_POSTGRESQL_BLACK_URL OLIVE -a <staging_app_name> --confirm <staging_app_name>
Um die Produktions- Datenbank (Quelle Datenbank) in die Staging Datenbank (Ziel Datenbank) zu übertragen (zu kopieren), müssen Sie pg:copy
aufrufen. aus der Anwendung target, die auf eine source -Datenbank verweist.
heroku pg:copy source-application::OLIVE HEROKU_POSTGRESQL_PINK -a target-application
Ein anderes Beispiel:
heroku pg:copy my-production-app::HEROKU_POSTGRESQL_OLIVE HEROKU_POSTGRESQL_PINK --app my-staging-app
Um die Farbnamen Ihrer Datenbanken zu erhalten, verwenden Sie:
heroku pg --app my-production-app
heroku pg --app my-staging-app
Siehe pg: copy
Ich hatte mit dem gleichen Problem zu kämpfen. Entsprechend der Antwort auf diese Frage könnte das Problem Ihre Heroku-Edelstein-Version sein. Ich habe gerade meine Version aktualisiert (von 2.26.2 auf 2.26.6) und jetzt funktioniert es.
Nach keinem Glück. (Ich benutze Heroku-Edelstein 2.31.4) .__ Ich habe folgendes getan (Hilfe für die Müden)
Melden Sie sich an der Heroku Database Console an
Melden Sie sich bei Staging> "Einstellungen"> PGRestore> "Verbindungseinstellungen" in eine Textdatei an.
Melden Sie sich bei Produktion> Snapshots an, drücken Sie '+', um ab sofort ein neues Backup zu erstellen. Dann drücken Sie Download. Laden Sie In den Ordner apps/tmp oder wo immer Sie möchten.
Staging auf Wartungsmodus setzen
$ heroku wartung: ein
Führen Sie den Befehl wie folgt aus, mit Connection Settings Text und Dump-Datei am Ende: PGPASSWORD = {... Bits von Zeug hier ...} -p 5432 'tmp/b048.dump.dump'
Nach dem Lauf:
$ heroku wartung: aus
Melden Sie sich bei der Inszenierung an und prüfen Sie, ob die Dinge übereinstimmen. Suchen Sie nach einer kürzlich durchgeführten Transaktion, von der Sie wissen, dass sie sich in der Produktion befindet. $ heroku führt die Konsole für beide Apps aus und überprüft, ob die IDs übereinstimmen.
Ich denke, dass es nicht --remote ist --app - versuchen Sie folgendes:
heroku pgbackups:restore DATABASE `heroku pgbackups:url --app production-app` --app staging-app
Das hat bei mir funktioniert
heroku pg:backups restore 'DUMP_FILE_URL_FROM_S3' DATABASE --app MY_APP