Ich habe eine Rails-Anwendung, die über Postgres läuft.
Ich habe zwei Server: einen zum Testen und einen für die Produktion.
Sehr oft muss ich die Produktionsdatenbank auf dem Testserver klonen.
Der Befehl, den ich über Vlad ausführe, lautet:
rake RAILS_ENV='test_server' db:drop db:create
Das Problem, das ich habe, ist, dass ich den folgenden Fehler erhalte:
ActiveRecord::StatementInvalid: PGError: ERROR: database <database_name> is being accessed by other users DROP DATABASE IF EXISTS <database_name>
Dies passiert, wenn jemand kürzlich über das Web auf die Anwendung zugegriffen hat (postgres hält eine "Sitzung" geöffnet)
Gibt es eine Möglichkeit, die Sitzungen in der Postgres-Datenbank zu beenden?
Danke dir.
Bearbeiten
Ich kann die Datenbank über die Schnittstelle von phppgadmin löschen, aber nicht mit der Rake-Task.
Wie kann ich den Drop von phppgadmin mit einer Rake-Aufgabe replizieren?
ruby-on-rails
postgresql
Fjuan
quelle
quelle
Antworten:
Wenn Sie die laufenden Postgresql-Verbindungen für Ihre Anwendung beenden, können Sie db: drop ganz gut ausführen. Wie kann man diese Verbindungen beenden? Ich benutze die folgende Rechenaufgabe:
Wenn Sie die Verbindungen unter den Schienen beenden, wird sie manchmal beim nächsten Versuch, eine Seite zu laden, blockiert. Wenn Sie sie jedoch erneut laden, wird die Verbindung wiederhergestellt.
quelle
task "db:drop" => :kill_postgres_connections
Ich denke, diese Zeile sollte entfernt werden, es besteht aus meiner Sicht die Gefahr, das Verhalten der Systemaufgabe zu erweitern.db_name = Rails.configuration.database_configuration[Rails.env]['database']
Einfacher und aktueller ist: 1. Verwenden Sie
ps -ef | grep postgres
diese Option , um die Verbindung Nr. 2 zu finden.sudo kill -9 "# of the connection
Hinweis: Möglicherweise ist die PID identisch. Wenn man einen tötet, werden alle getötet.
quelle
Hier ist eine schnelle Möglichkeit, alle Verbindungen zu Ihrer Postgres-Datenbank zu beenden.
Warnung: Dadurch werden alle laufenden Prozesse beendet, die der
postgres
Benutzer geöffnet hat. Stellen Sie daher sicher, dass Sie dies zuerst tun möchten.quelle
sudo kill -9 `ps -u postgres -o pid=`
stattdessen, damit kein PID- Header gedruckt wirdps
, sodass kein String-Argument an übergeben wird und keinkill
Fehler ausgelöst wird. Toller Tipp auf jeden Fall.sudo service postgresql start
Als wir die Methode "Kill-Prozesse" von oben verwendeten, schlug der db: drop fehl (wenn: kill_postgres_connections Voraussetzung war). Ich glaube, das lag daran, dass die Verbindung, die dieser Rechenbefehl verwendete, unterbrochen wurde. Stattdessen verwenden wir einen SQL-Befehl, um die Verbindung zu trennen. Dies ist eine Voraussetzung für db: drop, vermeidet das Risiko, Prozesse über einen recht komplexen Befehl abzubrechen, und sollte auf jedem Betriebssystem funktionieren (Gentoo erfordert eine andere Syntax für
kill
).Hier ist eine Rake-Task, die den Datenbanknamen aus database.yml liest und einen verbesserten Befehl (IMHO) ausführt. Außerdem wird db: kill_postgres_connections als Voraussetzung für db: drop hinzugefügt. Es enthält eine Warnung, die nach dem Upgrade der Schienen ertönt und darauf hinweist, dass dieser Patch möglicherweise nicht mehr benötigt wird.
Siehe: https://gist.github.com/4455341 , einschließlich Referenzen
quelle
Ich verwende die folgende Rechenaufgabe, um die Rails-
drop_database
Methode zu überschreiben .lib/database.rake
quelle
Bitte überprüfen Sie, ob Ihre Rails-Konsole oder Ihr Rails-Server auf einer anderen Registerkarte ausgeführt wird
Stoppen Sie den Rails-Server und die Konsole.
dann renne
quelle
Lassen Sie Ihre Anwendung die Verbindung schließen, wenn sie fertig ist. PostgreSQL hält keine Verbindungen offen, sondern die Anwendung, die die Verbindung aufrechterhält.
quelle
Rails stellt wahrscheinlich eine Verbindung zur Datenbank her, um sie zu löschen. Wenn Sie sich jedoch über phppgadmin anmelden, wird sie über die Datenbank template1 oder postgres angemeldet, sodass Sie davon nicht betroffen sind.
quelle
Ich habe ein Juwel namens pgreset geschrieben , das Verbindungen zur fraglichen Datenbank automatisch beendet, wenn Sie rake db: drop (oder db: reset usw.) ausführen. Alles was Sie tun müssen, ist es zu Ihrer Gemfile hinzuzufügen und dieses Problem sollte verschwinden. Zum Zeitpunkt dieses Schreibens funktioniert es mit Rails 4 und höher und wurde auf Postgres 9.x getestet. Der Quellcode ist auf Github für alle Interessierten verfügbar .
quelle
Sie können den ActiveRecord-Code, der das Löschen ausführt, einfach monkeypatchen.
Für Schienen 3.x:
Für Schienen 4.x:
(von: http://www.krautcomputing.com/blog/2014/01/10/how-to-drop-your-postgres-database-with-rails-4/ )
quelle
Ich hatte das gleiche Problem bei der Arbeit mit einer Rails 5.2-Anwendung und einer PostgreSQL-Datenbank in der Produktion.
So habe ich es gelöst :
Melden Sie zunächst jede Verbindung zum Datenbankserver auf dem PGAdmin ab Client ab, falls vorhanden.
Stoppen Sie jede Sitzung mit der Datenbank vom Terminal aus.
Starten Sie den PostgreSQL-Server, da der obige Kill-Vorgang den PostgreSQL-Server gestoppt hat.
Löschen Sie die Datenbank in der Produktionsumgebung, indem Sie die Produktionsargumente anhängen.
Das ist alles.
ich hoffe das hilft
quelle
Das hat bei mir funktioniert (Schienen 6):
rake db:drop:_unsafe
Ich denke, wir hatten etwas in unserer Codebasis, das eine Datenbankverbindung initiierte, bevor die Rake-Task versuchte, sie zu löschen.
quelle
Stellen Sie einfach sicher, dass Sie die Rails-Konsole in einem geöffneten Terminalfenster verlassen und den Rails-Server verlassen haben. Dies ist einer der häufigsten Fehler, die von Personen begangen wurden
quelle
Ich hatte einen ähnlichen Fehler, der besagte, dass 1 Benutzer die Datenbank benutzte. Ich erkannte, dass es ICH war! Ich habe meinen Rails-Server heruntergefahren und dann den Befehl rake: drop ausgeführt und es hat funktioniert!
quelle
Versuchen Sie es nach dem Neustart des Servers oder Computers erneut.
Es könnte die einfache Lösung sein.
quelle
Lösung
quelle