源本科技 | 码上会

PostgreSQL 更改数据库

2026/03/17
3
0

学习目标

  • 掌握 ALTER DATABASE 语句的基本语法结构及其在数据库生命周期中的作用。

  • 学会执行重命名数据库、变更所有者、迁移表空间等关键管理操作。

  • 理解如何配置数据库级别的会话默认参数以优化运行时行为。

  • 明确执行修改操作时的权限要求及前置条件(如断开连接)。

  • 识别哪些数据库属性可以通过该语句修改,哪些是不可变的。


ALTER DATABASE

PostgreSQL 的 ALTER DATABASE 语句是一个功能强大的工具,专门用于修改已存在的数据库属性。一旦数据库创建完成,其部分特征并非一成不变,通过该语句可以灵活调整配置以适应业务需求的变化。

基本语法

ALTER DATABASE 目标数据库名 执行动作;

上述语法表明,在 ALTER DATABASE 关键字之后,需指定需要修改的目标数据库名称,随后紧跟具体的操作指令。


支持的操作类型

PostgreSQL 允许通过 ALTER DATABASE 执行以下几种核心操作:

重命名数据库

使用 ALTER DATABASE ... RENAME TO 语句可以更改数据库的名称。这在规范命名规则或合并项目时非常有用。

语法示例:

ALTER DATABASE 目标数据库名 RENAME TO 新数据库名;

变更数据库所有者

使用 ALTER DATABASE ... OWNER TO 语句可以将数据库的所有权转移给另一个角色。

语法示例:

ALTER DATABASE 目标数据库名 OWNER TO 新所有者;

注意: 只有超级用户(superuser)或当前数据库的所有者才有权限执行此操作。

更改默认表空间

使用 ALTER DATABASE ... SET TABLESPACE 语句可以修改数据库的默认表空间。执行此操作时,系统会将属于该数据库的表和索引从旧表空间移动到新表空间。

语法示例:

ALTER DATABASE 目标数据库名 SET TABLESPACE 新表空间名;

修改会话默认值

默认情况下,PostgreSQL 从 postgresql.conf 文件加载配置变量。该文件包含关于数据库角色及其认证哈希类型等信息。您可以使用 ALTER DATABASE SET 语句针对特定数据库编辑这些设置,使其在该数据库建立新连接时自动生效。

语法示例:

ALTER DATABASE 目标数据库名 SET 配置参数 = 值;

注意: 同样,只有超级用户或数据库所有者才能更改数据库的默认会话变量。


综合案例

接下来,我们将通过一个完整的案例,演示如何逐步使用 ALTER DATABASE 语句管理数据库。

1. 创建示例数据库

首先,以 postgres 用户身份登录,并创建一个名为 my_test_db 的示例数据库:

CREATE DATABASE my_test_db;

2. 重命名数据库

将数据库名称从 my_test_db 修改为 my_renamed_db

ALTER DATABASE my_test_db RENAME TO my_renamed_db;

3. 变更数据库所有者

假设系统中已存在名为 dev_team 的角色,我们将 my_renamed_db 的所有者从 postgres 变更为 dev_team

ALTER DATABASE my_renamed_db OWNER TO dev_team;

如果 dev_team 角色尚不存在,可以先执行以下命令创建它:

CREATE ROLE dev_team
 VALID UNTIL 'infinity';

4. 更改默认表空间

假设已存在名为 dev_tablespace 的表空间,我们将 my_renamed_db 的默认表空间从 pg_default 更改为 dev_tablespace

ALTER DATABASE my_renamed_db
SET TABLESPACE dev_tablespace;

若该表空间不存在,可先创建它(需指定拥有者和存储路径):

CREATE TABLESPACE dev_tablespace
 OWNER dev_team
 LOCATION E'C:\\pgdata\\dev_data';

提示: 在 Windows 系统中路径使用双反斜杠,Linux/macOS 系统则使用正斜杠(如 /var/lib/postgresql/data)。

5. 修改会话默认配置

escape_string_warning 配置参数设置为 off,以便在该数据库中禁用转义字符串警告:

ALTER DATABASE my_renamed_db SET escape_string_warning TO off;

注意事项

在执行 ALTER DATABASE 操作前,请务必关注以下关键点,以避免操作失败或影响生产环境:

  • 断开连接要求:在执行某些操作(如重命名数据库或更改表空间)之前,必须断开所有与该数据库的活动连接。否则,命令将被阻塞或报错。

  • 只读模式设置:您可以利用 ALTER DATABASE 将数据库设置为只读模式,这在进行维护任务或需要防止写入操作时非常有用。

  • 自定义参数支持:PostgreSQL 允许为特定数据库设置自定义的配置参数,实现细粒度的控制。

  • 不可变属性限制:数据库的排序规则(LC_COLLATE)和字符分类(LC_CTYPE)设置在数据库创建后无法通过 ALTER DATABASE 进行修改。若需更改,通常需要通过 dump/restore 流程重建数据库。


总结

  • ALTER DATABASE 是修改现有数据库属性的标准 SQL 命令。

  • 支持的主要操作包括:重命名、变更所有者、迁移表空间、设置会话默认参数。

  • 权限控制严格,关键操作仅限超级用户或数据库所有者执行。

  • 修改表空间或重命名时,必须确保没有活跃的连接占用数据库。

  • 区域设置(Locale)相关参数(LC_COLLATE, LC_CTYPE)在创建后不可更改。