PostgreSQL - 重命名数据库

166
我需要重新命名数据库,在 PGAdmin 中执行 ALTER DATABASE "databaseName" RENAME TO "databaseNameOld" 命令时出现了无法执行的提示。请问该怎么做?(版本为 WindowsXP 上的 8.3)更新:第一个错误消息是因为连接到了该数据库,所以我选择了另一个数据库并执行了查询;第二个错误消息告诉我有一些用户处于连接状态,我在 PGAdmin 屏幕上看到有许多 PID,但它们是不活动的……我不知道如何终止它们。

1
你可以详细说明为什么它不能这样做。我刚刚在另一个平台上尝试了一下,它是可以工作的。 - Vinko Vrsalovic
1
你能告诉我具体的错误信息吗?你是否在Postgres文档中查找过这个错误?也许这种行为有一个完美的原因。通常情况下,重命名应该是有效的。 - unexist
已更新,请查看问题。 - Patrick Desjardins
为什么不直接重启数据库呢? - unexist
1
你能告诉我具体的错误信息吗?你是否在Postgres文档中查找过这个错误?也许这种行为有一个完美的原因。通常情况下,重命名应该是有效的。如果你遇到了挂起或死亡连接的问题,只需重新启动数据库即可摆脱它们。 - unexist
好的,标签和标题从一开始就包含了PostGreSQL,你的观点是什么? - Patrick Desjardins
9个回答

228

尽量不要在引用数据库名称时使用引号:

ALTER DATABASE people RENAME TO customers;

同时确保没有其他客户端连接到数据库。最后,尝试发布返回的错误消息,以便我们可以获得更多信息。


22
如果名称中有大写字母,引述时需要使用引号。 - Patrick Desjardins
8
需要引用的场合并不限于特殊符号,当名称中包含 .@ 时同样需要进行引用。 - omar
7
引用也需要在名字包含“-”时使用。 - GreenTurtle
以上建议让我认为,如果可能的话,最好将表名限制为仅使用小写字母下划线 - Aswin Sanakan
当名称包含空格时,引用也是必需的。 - Alvaro Rodriguez Scelza

119

作为以后参考,你应该能够做到:

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

请注意,早期版本的 pg_stat_activity 表中的列 pid 被命名为 procpid。因此,如果您的 PostgreSQL 版本低于 9.2,请使用 procpid 而不是 pid


3
对我有用,谢谢!但是在pg_stat_activity中的列名应该是pid而不是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 - 31 bit
强制断开代码非常有用,应该包含在被接受的答案中。 - Jedidja

8

我刚遇到这个问题,以下是解决方法:

1)pgAdmin 是其中之一会话。使用 psql 代替。
2)停止 Windows 上的 pgBouncer 和/或调度程序服务,因为它们也会创建会话。


3

Unexist在评论中告诉我重新启动数据库即可解决问题!重新启动数据库将会断开所有现有连接,然后我连接到另一个数据库并成功地使用了最初的查询语句完成了重命名操作。

谢谢大家。


3

不要部署核弹(重新启动服务器),你应该尝试通过找到连接来源并关闭客户端进程或使用pg_cancel_backend()函数来关闭那些困扰你的连接。


3
ALTER DATABASE old_database RENAME TO new_database;

old_database 意味着已经存在的数据库。 new_database 意味着需要修改此名称。

Example: ALTER DATABASE profile RENAME TO address;

1

当通过pgadmin连接时,默认数据库为postgres。

ALTER DATABASE postgres RENAME TO pgnew;

这样做是行不通的。

您需要在pgadmin中右键单击服务器,将Maintenance DB设置为其他数据库并保存。然后重试,如果没有其他连接存在,则应该可以正常工作。


0

对于使用DBeaver遇到此问题并收到以下错误消息的任何人:

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

断开当前连接,并重新连接到同一服务器,使用不针对你正在更名的数据库的连接。

仅更改活动数据库是不够的。


0
从默认的postgres数据库登录为管理员,然后执行ALTER DATABASE old_database RENAME TO new_database; 它会起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接