Skip to content

23.1. 概述#

少数对象(如角色、数据库和表空间名称)在集群级别定义,并存储在pg_global表空间中。集群内部有多个数据库,它们彼此隔离,但可以访问集群级对象。每个数据库内部有多个模式,其中包含表和函数等对象。因此,完整的层次结构是:集群、数据库、模式、表(或其他类型的对象,例如函数)。

连接到数据库服务器时,客户端必须在其连接请求中指定数据库名称。每个连接无法访问多个数据库。但是,客户端可以对同一数据库或不同数据库打开多个连接。数据库级安全性有两个组成部分:访问控制(参见第 21.1 节),在连接级别管理,以及授权控制(参见第 5.7 节),通过授权系统管理。外部数据包装器(参见postgres_fdw)允许一个数据库中的对象充当其他数据库或集群中对象的代理。较旧的 dblink 模块(参见dblink)提供了类似的功能。默认情况下,所有用户都可以使用所有连接方法连接到所有数据库。

如果一个PostgreSQL服务器集群计划包含不相关的项目或用户,他们应该在很大程度上互不了解,建议将它们放入单独的数据库中,并相应地调整授权和访问控制。如果项目或用户相互关联,因此应该能够使用彼此的资源,则应将它们放入同一个数据库中,但可能放入单独的模式中;这提供了一个具有命名空间隔离和授权控制的模块化结构。有关管理模式的更多信息,请参见第 5.9 节

虽然可以在单个集群内创建多个数据库,但建议仔细考虑收益是否大于风险和限制。特别是,具有共享 WAL(请参见第 30 章)对备份和恢复选项的影响。虽然从用户的角度来看,集群中的各个数据库是隔离的,但从数据库管理员的角度来看,它们是紧密绑定的。

使用CREATE DATABASE命令创建数据库(请参见第 23.2 节),并使用DROP DATABASE命令销毁数据库(请参见第 23.5 节)。要确定现有数据库的集合,请检查pg_database系统目录,例如

SELECT datname FROM pg_database;

psql程序的\l元命令和-l命令行选项也适用于列出现有数据库。

注意

SQL标准将数据库称为“目录”,但实际上没有区别。