数据库
每个正在运行的 PostgreSQL 服务器实例都管理着一个或多个数据库。因此,在组织 SQL 对象(“数据库对象”)的层次中,数据库位于最顶层。
数据库是在实例级别定义的,对应系统表pg_database
,它是存储在pg_global
表空间中的。实例内部有多个数据库,相互之间是彼此隔离的。每个数据库内部都有多个模式,它们包含表和函数等对象。因此,完整的层级结构为:实例、数据库、模式、表(或一些其他类型的对象,如函数)。
下面是一个 Redrock Postgres 的实例,里面有 3 个系统数据库(template0
,template1
和postgres
)和几个用户数据库。
在该实例中,有一个叫erp
的数据库,里面有几个系统角色(postgres
和以pg_
开头的内置角色)和3个用户角色,有2个系统表空间(pg_global
和pg_default
)和 3 个用户表空间,有 3 个系统模式(information_schema
,pg_catalog
和pg_recyclebin
)和 3 个用户模式。
在erp
数据库中,有一个叫hr
的模式,里面有表、函数和视图对象。
当连接到数据库服务器时,客户端必须在它的连接请求中指定数据库名称。每个连接不可能访问多于一个数据库。但是,客户端可以和同一个数据库建立多个连接,也可以连接不同的数据库。数据库级别的安全有两个组成部分:访问控制(参见第 20.1 节),在连接级进行管理,还有授权控制(参见第 5.7 节),通过授权系统进行管理。外部数据包装器(参见 postgres_fdw)允许一个数据库中的对象作为其他数据库或实例中的对象的代理。dblink 插件提供了类似的功能。在 Redrock Postgres 中,用户是数据库级别的对象,每个用户只能连接它所属的数据库。
如果一个 PostgreSQL 服务器实例计划服务不相关的应用或用户,大部分情况它们彼此之间是不感知的,那么建议将它们放到单独的数据库中,并且调整相应的授权和访问控制。如果这些应用或用户是相互关联的,可以将它们放在同一个数据库中,这样就可以互相使用彼此的资源,不过还是可以将它们放到相互独立的模式中;这提供了具有名称空间隔离和授权控制的模块化结构。关于模式管理的更多信息在第 5.9 节中。
虽然可以在单个实例中创建多个数据库,但建议仔细考虑好处是否大于风险和限制。特别是,共享 WAL(参见第 29 章)对备份和恢复选项的影响。从用户的角度来看,实例中的各个数据库是隔离的,但从数据库管理员的角度来看,它们是紧密绑定的。
数据库是使用 CREATE DATABASE 命令创建的,并且用 DROP DATABASE 命令删除的。要确定现有数据库的集合,可以检查系统表pg_database
,例如
SELECT datname FROM pg_database;
psql 程序的\l
元命令和-l
命令行选项也可以用来列出已有的数据库。
SQL 标准把数据库称作“目录”,不过实际上没有区别。