Redrock Postgres 文档
主页 切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页

数据库

每个正在运行的PostgreSQL服务器实例都管理着一个或多个数据库。因此,在组织SQL对象(“数据库对象”)的层次中,数据库位于最顶层。

数据库结构

数据库是在实例级别定义的,对应系统表pg_database,它是存储在pg_global表空间中的。实例内部有多个数据库,相互之间是彼此隔离的。每个数据库内部都有多个模式,它们包含表和函数等对象。因此,完整的层级结构为:实例、数据库、模式、表(或一些其他类型的对象,如函数)。

下面是一个 Redrock Postgres 的实例,里面有3个系统数据库(template0template1postgres)和几个用户数据库。

图 1 一个 Redrock Postgres 实例
图 1 一个 Redrock Postgres 实例

在该实例中,有一个叫erp的数据库,里面有几个系统角色(postgres和以pg_开头的内置角色)和3个用户角色,有2个系统表空间(pg_globalpg_default)和3个用户表空间,有3个系统模式(information_schemapg_catalogpg_recyclebin)和3个用户模式。

图 2 erp数据库
图 2 erp数据库

erp数据库中,有一个叫hr的模式,里面有表、函数和视图对象。

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