使用 PostgreSQL ALTER DATABASE 语句重命名数据库

本文介绍了在 PostgreSQL 中重命名一个数据库的详细步骤。

PostgreSQL 允许您使用 ALTER DATABASE ... RENAME 语句来重命名一个数据库。

重命名数据库的注意事项

重命名数据库是一个简单的动作,但是它可能会带来一些其他的问题。如果您没有同步修改那些用到此数据库的代码,则他们可能不能正常运行。

当您打算修改一个数据库名的时候,您需要首先从整体上进行评估。然后,再决定是否进行重命名数据库。一旦您决定了要重命名一个数据库,您需要把需要同步修改的地方整理清楚。

PostgreSQL 重命名数据库语法

要重命名一个数据库,请按照下面的语法使用 ALTER DATABASE ... RENAME 语句:

ALTER DATABASE name RENAME TO new_name;

解释说明:

  • name 是要重命名的数据库的名字。
  • new_name 是数据库的新名字。

您不能重命名仍有活动连接的数据库,否则 PostgreSQL 将给出一个错误。

  • 如果您要重命名当前正在连接的数据库, PostgreSQL 将给出以下错误:

    ERROR:  current database cannot be renamed。
    
  • 如果您要重命名的数据库仍有活动连接,PostgreSQL 将给出以下错误:

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

实例

在本实例中,我们将使用 psql 工具连接 PostgreSQL 服务器, 创建一个数据库 test_db 并将它重命名为 test_new_db

  1. 首先,请使用具有权限的用户登录 PostgreSQL 服务器:

    [~] psql -U postgres
    psql (14.4)
    Type "help" for help.
    
  2. 其次,使用默认的选项创建 test_db 数据库:

    CREATE DATABASE test_db;
    
    CREATE DATABASE

    如果您输入了一个已经存在的数据库名称, PostgreSQL 将返回一个错误:ERROR: database "test_db" already exists

  3. 然后,使用 \c 命令切换到刚刚创建的 test_db 数据库:

    \c test_db;
    
    You are now connected to database "test_db" as user "postgres".
  4. 然后,尝试将 test_db 数据库重命名为 test_new_db

    ALTER DATABASE test_db RENAME TO test_new_db;
    
    ERROR:  current database cannot be renamed

    也就是说,您不能重命名当前打开的数据库。

  5. 保持刚刚的会话,打开一个新的会话并登陆,然后尝试重命名 test_db 数据库:

    ALTER DATABASE test_db RENAME TO test_new_db;
    
    ERROR:  database "test_db" is being accessed by other users
    DETAIL:  There is 1 other session using the database.

    这里, PostgreSQL 报告了一个错误: 数据库 test_db 正在被其他用户访问。

  6. 关闭以前的会话,并回到这个会话,重新尝试重命名:

    ALTER DATABASE test_db RENAME TO test_new_db;
    
    DROP DATABASE

    此时, test_db 数据库已经被重命名为 test_new_db

查看并关闭数据库的活动连接

有时候,并不是我们自己连接了要重命名的数据库。我们可以从 pg_stat_activity 视图中查询数据库中的活动连接,如下:

SELECT
  pid,
  usename,
  application_name
FROM
  pg_stat_activity
WHERE
  datname = 'test_db';
 pid  | usename  | application_name
------+----------+------------------
 8777 | postgres | psql
(1 row)

然后,使用 pg_terminate_backend() 函数结束刚刚返回的活动连接:

SELECT pg_terminate_backend(8777);
 pg_terminate_backend
----------------------
 t
(1 row)

最后,使用 ALTER DATABASE ... RENAME 重命名数据库就可以了。

结论

PostgreSQL ALTER DATABASE ... RENAME 语句用来重命名数据库。 您不能重命名有活动连接的数据库。