PostgreSQL - Renomear banco de dados

126

Preciso renomear o banco de dados, mas quando o faço PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld"me diz que não pode.

Como eu posso fazer isso?

( Versão 8.3 no WindowsXP )

Atualizar

  • A primeira mensagem de erro: Não é possível porque eu estava conectado a ele. Então, selecionei outro banco de dados e fiz as consultas.

  • Recebo uma segunda mensagem de erro informando que ele chegou ao usuário. Vejo na PGAdmintela que tem muitos, PIDmas eles estão inativos ... Não vejo como matá-los.

Patrick Desjardins
fonte
1
Você pode explicar por que não pode. Eu só fiz isso (em uma plataforma diferente embora) e funcionou
Vinko Vrsalovic
1
Qual é a mensagem de erro exata e você procurou esse erro nos documentos do postgres? Talvez haja uma razão perfeita para esse comportamento. Renomear normalmente deve funcionar.
inexistia 27/09/08
Atualizado veja a pergunta
Patrick Desjardins
Por que não apenas reiniciar o banco de dados?
inexistia 27/09/08
Qual é a mensagem de erro exata e você procurou esse erro nos documentos do postgres? Talvez haja uma razão perfeita para esse comportamento. Renomear normalmente deve funcionar. Se você tiver problemas com conexões pendentes ou inativas, basta reiniciar o banco de dados para se livrar delas.
inexistia 27/09/08

Respostas:

189

Tente não citar o nome do banco de dados:

ALTER DATABASE people RENAME TO customers;

Verifique também se não há outros clientes conectados ao banco de dados no momento. Por fim, tente postar a mensagem de erro que ela retorna para que possamos obter um pouco mais de informação.

bmdhacks
fonte
18
a citação é necessária quando o nome possui uma letra maiúscula.
Patrick Desjardins
7
Este não é o caso, mas a citação também é necessária quando o nome tem um .ou @.
Omar
6
A citação também é necessária quando o nome contém um-
GreenTurtle
As sugestões acima me fazem pensar que é melhor manter os nomes das tabelas restritos a apenas letras minúsculas e sublinhado, se possível!
Aswin Sanakan
A citação também é necessária quando o nome contém espaço vazio
Loaderon
86

Para referência futura, você deve ser capaz de:

-- disconnect from the database to be renamed
\c postgres

-- force disconnect all other clients from the database to be renamed
SELECT pg_terminate_backend( pid )
FROM pg_stat_activity
WHERE pid <> pg_backend_pid( )
    AND datname = 'name of database';

-- rename the database (it should now have zero clients)
ALTER DATABASE "name of database" RENAME TO "new name of database";

Observe que a pg_stat_activitycoluna da tabela pidfoi nomeada como procpidnas versões anteriores à 9.2. Portanto, se sua versão do PostgreSQL for inferior a 9.2, use em procpidvez de pid.

gsiems
fonte
3
funcionou para mim, obrigado! mas o nome da coluna em pg_stat_activity é pid e não procpid. ( PostgreSQL 9.3.5 on x86_64-apple-darwin, compiled by i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00), 64-bit)
bodman
7

Acabei de encontrar isso e abaixo é o que funcionou:

1) pgAdminé uma das sessões. Use em psqlvez disso.
2) Interrompa os serviços pgBouncere / ou planejador no Windows, pois eles também criam sessões

smoore4
fonte
3

Unexist me disse no comentário para reiniciar o banco de dados e funciona! Reiniciar o banco de dados elimina todas as conexões existentes e, em seguida, conecto-me a outro banco de dados e pude renomeá-lo com minha consulta inicial.

Thx all.

Patrick Desjardins
fonte
3

Em vez de implantar uma bomba nuclear (reiniciando o servidor), tente fechar as conexões que o incomodam, descobrindo de onde elas são e desligando os processos do cliente ou usando a pg_cancel_backend()função

Milen A. Radev
fonte
0

Para quem está enfrentando esse problema usando o DBeaver e recebendo uma mensagem de erro como esta:

ERROR: database "my_stubborn_db" is being accessed by other users
  Detail: There is 1 other session using the database.

Desconecte sua conexão atual e reconecte-se ao mesmo servidor com uma conexão que não tenha como alvo o banco de dados que você está renomeando.

Alterar o banco de dados ativo não é suficiente.

rovyko
fonte