2015-02-26 14 views
6

Witam Mam aplikację ruby ​​na szynach hostowaną na heroku i używa ona mysql jako bazy danych.Jak ściągnąć bazę danych mysql z Heroku na lokalną maszynę

Teraz muszę wykonać kopię bazy danych na moim komputerze lokalnym. Ale dostaję problemy podczas wykonywania kopii zapasowej.

Do tego zainstalowałem taps gem i używam następujące polecenia na nim

heroku pg:pull mysql2://[email protected]/heroku_database local_database --app my_app 

ale daje błąd jak !Your app has no databases.

Może ktoś poprowadzi mnie jak wyciągnąć bazy danych MySQL z Heroku do lokalnego maszyna.

EDIT

użyłem następującej składni polecenia

heroku pg:pull <REMOTE_SOURCE_DATABASE> <LOCAL_TARGET_DATABASE> 

i uzyskiwania REMOTE_SOURCE_DATABASE Użyłem następujące polecenia

heroku config:get DATABASE_URL --app my_app 

odsyłam this link1 i link2 na bardziej szczegółowe dokumentacja heroku.

+0

Mysql w lokalnym .. prawo lub oba w języku lokalnym i hosta to MySql? –

+0

Nie jestem facetem MySql, ale myślę, że jest jeden sposób: połącz się ze zdalną bazą danych za pomocą jednego z narzędzi administracyjnych MySql i DATABASE_URL dostarczonego przez ClearDB i zrzuć dane na lokalny komputer, a następnie załaduj te zrzucone dane do istniejącej lokalnej bazy danych. Następnie migruj do PostgreSQL i bądź szczęśliwy przez cały czas, ponieważ Heroku ma niesamowite wsparcie dla tego rodzaju RDBMS – atomdev

+0

I jeszcze jeden komentarz: Myślę, że _okooku pg: pull_ jest poleceniem tylko dla usługi Heroku Postgres, więc nie masz pg bazy danych, którą widzisz błąd. Wcześniejsze dni, kiedy heroku obsługiwał _taps_, zawierało polecenie takie jak _heroku db: pull_, a użytkownik mógł migrować dane między różnymi rodzajami baz danych, ale teraz ta funkcjonalność już nie istnieje. – atomdev

Odpowiedz

7

Polecenie pg:pull działa tylko z bazami danych Postgres w aplikacji Heroku. Ale używasz dostawcy MySQL innej firmy. Twoja baza danych jest hostowana na serwerach ClearDB i jest dostępna dla każdego, kto ma odpowiednie poświadczenia, w tym zarówno twój serwer aplikacji na Heroku, jak i twój komputer deweloperski.

Mimo że nie ma specjalnych poleceń do pobrania bazy danych, nie trzeba żadnych - zwykły mysqldump powinien zrobić.

mysqldump -h hostname.cleardb.com -u username heroku_database | mysql local_database

+0

pobiera 'mysqldump: Mam błąd: 1045: Odmowa dostępu dla użytkownika 'users'@'ip-xx-xx-xx-xx.xx.internal' (przy użyciu hasła: NIE) podczas próby połączenia 'błąd. – Shrikant1712

+1

dodaj opcję '-p', a zostaniesz poproszony o podanie hasła – infused

+0

, ale zrobiłeś już ten sam problem. –

0

Running $heroku config | grep ^DATABASE daje coś takiego:

DATABASE_URL: mysql2://username:p[email protected]/dbname?reconnect=true` 

Stamtąd można stworzyć swoją komendę db przegubowe:

mysqldump -h host -p -u username dbname | mysql local_database 

ten poprosi o hasło, które otrzymałeś od poprzedniego polecenia. Jeśli chcesz utworzyć skrypt, który automatycznie zawierać hasło z poleceniem Heroku mógłby zrobić coś takiego:

mysqldump -u username --password=`heroku config | grep ^DATABASE | sed 's/.*[a-z0-9][a-z0-9]*:\([a-z][a-z0-9]*\).*/\1/'` -h host dbname | mysql cedric 

W ten sposób można mieć skrypt, który będzie zaimportować bazę danych bez konieczności wprowadzania danych przez użytkownika, ale również nie naraża hasła na twoją bazę danych.

1

(Zrzeczenie:.. Ty MUST mieć swój database.yml poprawnie skonfigurowany, aby to zadziałało nie jestem odpowiedzialny za jakiekolwiek dane, które tracą w wyniku prowadzenia poniższy skrypt)

Dla Ruby on Rails użytkowników ...można rozważyć napisanie zadania Rake podobnie jak poniższe zadania db: clone.

Ciągle używam tego skryptu do klonowania od produkcji do rozwoju. To sposób łatwiej niż pamiętanie składnię mysqldump, znacznie mniej wszystkich nazw użytkowników i haseł zaangażowanych ...

Aby sklonować od produkcji do rozwoju:

rake db:clone:production

Aby sklonować z inscenizacji do rozwoju :

rake db:clone:staging

Aby sklonować od produkcji do inscenizacji:

rake db:clone:production_to_staging

A oto kod lubią (i być ostrożnym w konfiguracji database.yml):

namespace :db do 
    namespace :clone do 

    class << self 
     %w(development test staging production).each do |env| 
     define_method("#{env}_db") do 
      Rails.configuration.database_configuration[env] 
     end 
     end 
    end 

    def clone_db(from_db, to_db) 
     start_time = Time.now 
     puts "Cloning Remote DB...." 
     system("mysqldump -h#{from_db['host']} -u#{from_db['username']} -p#{from_db['password']} #{from_db['database']} | mysql #{to_db['database']} -u#{to_db['username']} -p#{to_db['password']}") 
     puts "Import Successful" 
     end_time = Time.now 
     puts "====================" 
     puts "Job Completed: #{end_time - start_time} Seconds" 
    end 

    task :staging => :environment do 
     clone_db(staging_db, development_db) 
    end 

    task :production => :environment do 
     clone_db(production_db, development_db) 
    end 

    task :production_to_staging => :environment do 
     clone_db(production_db, staging_db) if Rails.env.staging? 
    end 

    end 
end 
Powiązane problemy