在集群级别定义数量很少的对象,例如角色、数据库和表空间名称,并储存在 pg_global
表空间中。集群内部有多个数据库,这些数据库彼此隔离,但是可以访问集群级别的对象。每个数据库内部有多个模式,其中包含表格和函数之类的对象。所以,完整的层次结构为:集群、数据库、模式、表格(或其他类型的对象,例如函数)。
在连接到数据库服务器时,客户端必须在其连接请求中指定数据库名称。每个连接无法访问一个以上数据库。但是,客户端可以打开到相同数据库或不同数据库的多个连接。数据库级别的安全性包含两个部分:通过授予系统管理的访问控制(见第 20.1 节),并在连接级别管理,以及授权控制(见第 5.8 节)。外部数据包装器(见postgres_fdw)允许一个数据库中的对象用作其他数据库或集群中对象的代理。较旧的 dblink 模块(见dblink)提供类似的功能。默认情况下,所有用户都可以使用所有连接方法连接到所有数据库。
如果一个 PostgreSQL 服务器集群计划包含彼此基本上互不干扰的不相关的项目或用户,建议将这些项目或用户置于各个不同的数据库中,并相应调整授权和访问控制。如果这些项目或用户相互关联,因而能够使用彼此的资源,则应将这些项目或用户置于同一数据库中,但可能位于不同的模式中;这提供了一个具有命名空间隔离和授权控制的模块化结构。有关管理模式的更多信息,请见第 5.10 节。
尽管可以在单个集群中创建多个数据库,但建议谨慎考虑,权衡风险和限制是否大于好处。尤其是,在考虑备份和恢复选项时,共享 WAL(见第 28 章)会造成的影响。虽然从用户的角度考虑时,集群中的各个数据库都是隔离的,但从数据库管理员的角度考虑时,它们密切相关。
数据库使用 CREATE DATABASE
命令创建(见第 22.2 节),并使用 DROP DATABASE
命令销毁(见第 22.5 节)。要确定现有数据库的集合,请检查 pg_database
系统目录,例如
SELECT datname FROM pg_database;
psql 程序的 \l
元命令和 -l
命令行选项也可用于列出现有数据库。
TheSQL标准称数据库为“目录”,但实际上没有区别。