PostgreSQL - Renombrar base de datos

126

Necesito cambiar el nombre de la base de datos, pero cuando lo hago PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld"me dice que no puede.

¿Cómo puedo hacerlo?

( Versión 8.3 en WindowsXP )

Actualizar

  • El primer mensaje de error: No se puede porque estaba conectado a él. Así que seleccioné otra base de datos e hice las consultas.

  • Recibo un segundo mensaje de error que me dice que el usuario se ha conectado. Veo en la PGAdminpantalla que tiene muchos PIDpero están inactivos ... No veo cómo matarlos.

Patrick Desjardins
fuente
1
Podrías explicar por qué no puede. Simplemente lo hice (en una plataforma diferente) y funcionó
Vinko Vrsalovic
1
¿Cuál es el mensaje de error exacto y buscó este error en los documentos de postgres? Tal vez hay una razón perfecta para ese comportamiento. Normalmente el cambio de nombre debería funcionar.
inexistente
Actualizado ver la pregunta
Patrick Desjardins
¿Por qué no simplemente reiniciar la base de datos?
inexistente
¿Cuál es el mensaje de error exacto y buscó este error en los documentos de Postgres? Tal vez hay una razón perfecta para ese comportamiento. Normalmente el cambio de nombre debería funcionar. Si tiene problemas con conexiones pendientes o inactivas, simplemente reinicie la base de datos para deshacerse de ellas.
inexistente

Respuestas:

189

Intente no citar el nombre de la base de datos:

ALTER DATABASE people RENAME TO customers;

También asegúrese de que no haya otros clientes conectados a la base de datos en ese momento. Por último, intente publicar el mensaje de error que devuelve para que podamos obtener un poco más de información.

bmdhacks
fuente
18
se requiere una cita cuando el nombre tiene mayúscula.
Patrick Desjardins
77
Este no es el caso, pero también se requiere una cita cuando el nombre tiene un .o @.
omar
66
También se requiere una -
cita
¡Las sugerencias anteriores me hacen pensar que es mejor mantener los nombres de las tablas restringidos a letras minúsculas y subrayar si es posible!
Aswin Sanakan
También se requiere una cita cuando el nombre contiene un espacio vacío
Loaderon
86

Para futuras referencias, debería poder:

-- 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";

Tenga en cuenta que la pg_stat_activitycolumna de la tabla pidfue nombrada como procpiden versiones anteriores a 9.2. Entonces, si su versión de PostgreSQL es inferior a 9.2, use en procpidlugar de pid.

gsiems
fuente
3
funcionó para mí, gracias! pero el nombre de la columna en pg_stat_activity es pid y no 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

Me encontré con esto y a continuación es lo que funcionó:

1) pgAdmines una de las sesiones. Usar en su psqllugar.
2) Detenga los pgBouncerservicios de planificador en Windows, ya que también crean sesiones

smoore4
fuente
3

Unexist me dijo en un comentario que reiniciara la base de datos y ¡funciona! Reiniciar la base de datos elimina todas las conexiones existentes y luego me conecto a otra base de datos y pude cambiarle el nombre con mi consulta inicial.

Gracias a todos.

Patrick Desjardins
fuente
3

En lugar de implementar una bomba nuclear (reiniciar el servidor), debe intentar cerrar las conexiones que le molestan, ya sea buscando de dónde son y cerrando los procesos del cliente o utilizando la pg_cancel_backend()función.

Milen A. Radev
fuente
0

Para cualquiera que se encuentre con este problema usando DBeaver y obtenga un mensaje de error como este:

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

Desconecte su conexión actual y vuelva a conectarse al mismo servidor con una conexión que no esté dirigida a la base de datos que está cambiando de nombre.

Cambiar la base de datos activa no es suficiente.

rovyko
fuente