少数对象,如角色、数据库和表空间名称,是在集群级别定义的,并存储在 pg_global
表空间中。集群内部有多个数据库,它们彼此隔离,但可以访问集群级别的对象。每个数据库内部都有多个模式(schema),其中包含表和函数等对象。因此,完整的层级结构是:集群、数据库、模式、表(或其他类型的对象,如函数)。
连接到数据库服务器时,客户端必须在其连接请求中指定数据库名称。每个连接不能访问多个数据库。但是,客户端可以打开到同一数据库或不同数据库的多个连接。数据库级别的安全性有两个组成部分:访问控制(请参阅 第 20.1 节),在连接级别管理;授权控制(请参阅 第 5.8 节),通过 grant 系统管理。外部数据包装器(请参阅 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
命令行选项也有助于列出现有数据库。
该SQL标准称数据库为“目录”(catalogs),但实际上没有区别。
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。