Eu tenho um aplicativo Rails em execução no Postgres.
Tenho dois servidores: um para teste e outro para produção.
Freqüentemente, preciso clonar o banco de dados de produção no servidor de teste.
O comando que estou executando via Vlad é:
rake RAILS_ENV='test_server' db:drop db:create
O problema que estou tendo é que recebo o seguinte erro:
ActiveRecord::StatementInvalid: PGError: ERROR: database <database_name> is being accessed by other users DROP DATABASE IF EXISTS <database_name>
Isso acontece se alguém acessou o aplicativo via web recentemente (o postgres mantém uma "sessão" aberta)
Existe alguma maneira de encerrar as sessões no banco de dados postgres?
Obrigado.
Editar
Posso excluir o banco de dados usando a interface do phppgadmin, mas não com a tarefa rake.
Como posso replicar o drop do phppgadmin com uma tarefa rake?
ruby-on-rails
postgresql
Fjuan
fonte
fonte
Respostas:
Se você encerrar as conexões postgresql em execução para seu aplicativo, poderá executar db: drop muito bem. Então, como matar essas conexões? Eu uso a seguinte tarefa de rake:
Eliminar as conexões que estão sob os trilhos às vezes fará com que ela vire na próxima vez que você tentar carregar uma página, mas recarregá-la novamente restabelece a conexão.
fonte
task "db:drop" => :kill_postgres_connections
Acho que essa linha deve ser removida, é perigoso estender o comportamento das tarefas do sistema, a meu ver.db_name = Rails.configuration.database_configuration[Rails.env]['database']
A maneira mais fácil e atualizada é: 1. Use
ps -ef | grep postgres
para encontrar a conexão # 2.sudo kill -9 "# of the connection
Nota: pode haver PID idêntico. Matar um mata todos.
fonte
Esta é uma maneira rápida de eliminar todas as conexões com seu banco de dados postgres.
Aviso: isso eliminará todos os processos em execução que o
postgres
usuário abriu, portanto, certifique-se de fazer isso primeiro.fonte
sudo kill -9 `ps -u postgres -o pid=`
, então, um cabeçalho PID não será impressops
, então um argumento de string não é passado parakill
, então um erro não será gerado. Ótima dica em qualquer caso.sudo service postgresql start
Quando usamos o método "kill processos" acima, o db: drop estava falhando (se: kill_postgres_connections fosse um pré-requisito). Eu acredito que foi porque a conexão que aquele comando rake estava usando estava sendo encerrada. Em vez disso, estamos usando um comando sql para interromper a conexão. Isso funciona como um pré-requisito para db: drop, evita o risco de matar processos por meio de um comando bastante complexo, e deve funcionar em qualquer sistema operacional (o gentoo requer uma sintaxe diferente para
kill
).Aqui está uma tarefa rake que lê o nome do banco de dados em database.yml e executa um comando aprimorado (IMHO). Ele também adiciona db: kill_postgres_connections como um pré-requisito para db: drop. Inclui um aviso que grita depois de atualizar os trilhos, indicando que este patch pode não ser mais necessário.
consulte: https://gist.github.com/4455341 , referências incluídas
fonte
Eu uso a seguinte tarefa rake para substituir o
drop_database
método Rails .lib/database.rake
fonte
Por favor, verifique se o seu console Rails ou servidor está rodando em outra aba e então
pare o servidor Rails e o console.
então corra
fonte
Deixe seu aplicativo fechar a conexão quando terminar. PostgreSQL não mantém as conexões abertas, é a aplicação que mantém a conexão.
fonte
O Rails provavelmente está se conectando ao banco de dados para eliminá-lo, mas quando você se autentica via phppgadmin, ele se autentica via template1 ou banco de dados postgres, portanto, você não é afetado por isso.
fonte
Eu escrevi uma gema chamada pgreset que irá encerrar automaticamente as conexões com o banco de dados em questão quando você executar rake db: drop (ou db: reset, etc). Tudo que você precisa fazer é adicioná-lo ao seu Gemfile e este problema deve desaparecer. No momento em que este artigo foi escrito, ele funcionava com Rails 4 e superior e foi testado no Postgres 9.x. O código-fonte está disponível no github para todos os interessados.
fonte
Você pode simplesmente aplicar um monkeypatch ao código ActiveRecord que faz a eliminação.
Para Rails 3.x:
Para Rails 4.x:
(de: http://www.krautcomputing.com/blog/2014/01/10/how-to-drop-your-postgres-database-with-rails-4/ )
fonte
Eu tive esse mesmo problema ao trabalhar com um aplicativo Rails 5.2 e banco de dados PostgreSQL em produção.
Veja como eu resolvi :
Primeiro, efetue logout de todas as conexões com o servidor de banco de dados no Cliente PGAdmin, se houver.
Pare todas as sessões usando o banco de dados do terminal.
Inicie o servidor PostgreSQL, pois a operação kill acima interrompeu o servidor PostgreSQL.
Elimine o banco de dados no ambiente de produção anexando os argumentos de produção.
Isso é tudo.
Eu espero que isso ajude
fonte
Isso funcionou para mim (trilhos 6):
rake db:drop:_unsafe
Acho que tínhamos algo em nossa base de código que iniciou uma conexão db antes que a tarefa rake tentasse derrubá-la.
fonte
Apenas certifique-se de que você saiu do console do Rails em qualquer janela de terminal aberta e saiu do servidor Rails ... este é um dos erros mais comuns cometidos por pessoas
fonte
Eu tive um erro semelhante dizendo que 1 usuário estava usando o banco de dados, percebi que era EU! Eu desliguei meu servidor Rails e então fiz o comando rake: drop e funcionou!
fonte
Depois de reiniciar o servidor ou computador, tente novamente.
Pode ser a solução simples.
fonte
Solução
fonte