J'ai une application de rails fonctionnant sur Postgres.
J'ai deux serveurs: un pour les tests et l'autre pour la production.
Très souvent, j'ai besoin de cloner la base de données de production sur le serveur de test.
La commande que je lance via Vlad est:
rake RAILS_ENV='test_server' db:drop db:create
Le problème que je rencontre est que je reçois l'erreur suivante:
ActiveRecord::StatementInvalid: PGError: ERROR: database <database_name> is being accessed by other users DROP DATABASE IF EXISTS <database_name>
Cela se produit si quelqu'un a récemment accédé à l'application via le Web (postgres garde une "session" ouverte)
Est-il possible que je puisse mettre fin aux sessions sur la base de données postgres?
Je vous remercie.
Éditer
Je peux supprimer la base de données en utilisant l'interface de phppgadmin mais pas avec la tâche rake.
Comment puis-je répliquer le drop de phppgadmin avec une tâche rake?
ruby-on-rails
postgresql
fjuan
la source
la source
Réponses:
Si vous supprimez les connexions postgresql en cours d'exécution pour votre application, vous pouvez alors exécuter db: drop très bien. Alors, comment tuer ces connexions? J'utilise la tâche de râteau suivante:
Tuer les connexions sous les rails le fera parfois barf la prochaine fois que vous essayez de charger une page, mais le recharger à nouveau rétablit la connexion.
la source
task "db:drop" => :kill_postgres_connections
Je pense que cette ligne devrait être supprimée, il risque d'étendre le comportement de la tâche système, de mon point de vue.db_name = Rails.configuration.database_configuration[Rails.env]['database']
Un moyen plus simple et plus mis à jour est: 1. Utilisez
ps -ef | grep postgres
pour trouver la connexion # 2.sudo kill -9 "# of the connection
Remarque: il peut y avoir un PID identique. Tuer un tue tout.
la source
Voici un moyen rapide de supprimer toutes les connexions à votre base de données postgres.
Attention: cela tuera tous les processus en cours que l'
postgres
utilisateur a ouverts, alors assurez-vous de vouloir le faire en premier.la source
sudo kill -9 `ps -u postgres -o pid=`
place, donc un en- tête PID ne sera pas imprimé parps
, donc un argument de chaîne n'est pas passé àkill
, donc une erreur ne sera pas déclenchée. Bon conseil en tout cas.sudo service postgresql start
Lorsque nous avons utilisé la méthode "kill processus" ci-dessus, le db: drop échouait (si: kill_postgres_connections était un prérequis). Je crois que c'était parce que la connexion que cette commande rake utilisait était en train d'être supprimée. Au lieu de cela, nous utilisons une commande sql pour supprimer la connexion. Cela fonctionne comme un prérequis pour db: drop, évite le risque de tuer des processus via une commande plutôt complexe, et cela devrait fonctionner sur n'importe quel OS (gentoo nécessitait une syntaxe différente pour
kill
).Voici une tâche de râteau qui lit le nom de la base de données à partir de database.yml et exécute une commande améliorée (IMHO). Il ajoute également db: kill_postgres_connections comme condition préalable à db: drop. Il comprend un avertissement qui hurle après la mise à niveau des rails, indiquant que ce correctif n'est peut-être plus nécessaire.
voir: https://gist.github.com/4455341 , références incluses
la source
J'utilise la tâche rake suivante pour remplacer la
drop_database
méthode Rails .lib/database.rake
la source
Veuillez vérifier si votre console ou serveur rails s'exécute dans un autre onglet, puis
arrêtez le serveur de rails et la console.
puis courir
la source
Laissez votre application fermer la connexion lorsqu'elle est terminée. PostgreSQL ne garde pas les connexions ouvertes, c'est l'application qui maintient la connexion.
la source
Rails se connecte probablement à la base de données pour la supprimer, mais lorsque vous vous connectez via phppgadmin, il se connecte via la base de données template1 ou postgres, vous n'êtes donc pas affecté par cela.
la source
J'ai écrit un joyau appelé pgreset qui supprimera automatiquement les connexions à la base de données en question lorsque vous exécutez rake db: drop (ou db: reset, etc.). Tout ce que vous avez à faire est de l'ajouter à votre Gemfile et ce problème devrait disparaître. Au moment d'écrire ces lignes, il fonctionne avec Rails 4 et plus et a été testé sur Postgres 9.x. Le code source est disponible sur github pour toute personne intéressée.
la source
Vous pouvez simplement monkeypatch le code ActiveRecord qui effectue la suppression.
Pour les rails 3.x:
Pour les rails 4.x:
(à partir de: http://www.krautcomputing.com/blog/2014/01/10/how-to-drop-your-postgres-database-with-rails-4/ )
la source
J'ai eu ce même problème lorsque je travaillais avec une application Rails 5.2 et une base de données PostgreSQL en production.
Voici comment je l'ai résolu :
Tout d'abord, déconnectez-vous de chaque connexion au serveur de base de données sur le client PGAdmin, le cas échéant.
Arrêtez chaque session en utilisant la base de données du terminal.
Démarrez le serveur PostgreSQL, puisque l'opération de suppression ci-dessus a arrêté le serveur PostgreSQL.
Déposez la base de données dans l'environnement de production en ajoutant les arguments de production.
C'est tout.
J'espère que ça aide
la source
Cela a fonctionné pour moi (rails 6):
rake db:drop:_unsafe
Je pense que nous avions quelque chose dans notre base de code qui a initié une connexion db avant que la tâche rake ne tente de la supprimer.
la source
Assurez-vous simplement que vous avez quitté la console des rails sur n'importe quelle fenêtre de terminal ouverte et que vous avez quitté le serveur de rails ... c'est l'une des erreurs les plus courantes commises par les gens.
la source
J'ai eu une erreur similaire en disant qu'un utilisateur utilisait la base de données, j'ai réalisé que c'était MOI! J'ai arrêté mon serveur rails, puis j'ai exécuté la commande rake: drop et cela a fonctionné!
la source
Après avoir redémarré le serveur ou l'ordinateur, veuillez réessayer.
Cela pourrait être la solution simple.
la source
Solution
la source