PostgreSQL-重命名数据库


126

我需要重命名数据库,但是当我这样做 PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld"时告诉我它不能。

我该怎么做?

WindowsXP上的8.3版

更新资料

  • 第一条错误消息:不能,因为我已连接到它。因此,我选择了另一个数据库并进行了查询。

  • 我收到第二条错误消息,告诉我它已经连接了用户。我在PGAdmin屏幕上看到它有很多,PID但是它们是不活动的...我看不到如何杀死它们。


1
您可以详细说明为什么它不能。我只是做到了(尽管在另一个平台上),但它起作用了
Vinko Vrsalovic

1
确切的错误消息是什么,您是否在postgres文档中查找了此错误?也许有一个完美的理由。通常,重命名应该可以。
存在的

更新看问题
帕特里克德信

为什么不重启数据库呢?
存在的

确切的错误消息是什么,您是否在postgres文档中查找了此错误?也许有一个完美的理由。通常,重命名应该可以。如果您对挂起或挂起的连接有问题,只需重新启动数据库即可摆脱它们。
存在的

Answers:


189

尝试不引用数据库名称:

ALTER DATABASE people RENAME TO customers;

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


18
名称中包含大写字母时,必须加引号。
Patrick Desjardins

7
情况并非如此,但是当名称中带有.or 时,也需要加引号@
omar 2015年

6
当名称中包含-
GreenTurtle,时间为

以上建议使我认为最好将表名限制为仅小写字母下划线
阿斯温·萨纳坎

报价在名称包含空的空间也需要
Loaderon

86

供将来参考,您应该能够:

-- 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与9.2之前的版本相同。因此,如果您的PostgreSQL版本低于9.2,请使用procpid代替pid


3
它对我有用,thanx!但是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
波德曼

7

我只是遇到了这个,下面是起作用的:

1)pgAdmin是会话之一。使用psql代替。
2)停止pgBouncerWindows上的和/或计划程序服务,因为它们也会创建会话


3

Unexist在评论中告诉我重新启动数据库,它可以正常工作!重新启动数据库会终止所有现有连接,然后我连接到另一个数据库,并能够使用初始查询将其重命名。

谢谢。



0

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

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

断开当前连接,然后使用不以您要重命名的数据库为目标的连接重新连接到同一服务器。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.