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标准把数据库称作目录,不过实际上没有区别。