Table of Contents
每个正在运行的PostgreSQL服务器实例都管理着一个或多个数据库。因此,数据库是组织SQL对象(“数据库对象”)的最高层级。本章描述数据库的属性,以及如何创建、管理和删除数据库。
少量对象,例如角色名、数据库名和表空间名,是在集簇级别定义并存储在pg_global表空间中的。集簇内部有多个数据库,它们彼此隔离,但可以访问集簇级对象。每个数据库内部又有多个模式,其中包含表、函数等对象。因此,完整的层次结构是:集簇、数据库、模式、表(或者函数等其他类型的对象)。
当连接到数据库服务器时,客户端必须在连接请求中指定数据库名。一个连接无法访问多个数据库。不过,客户端可以对同一个数据库建立多个连接,也可以连接到不同的数据库。数据库级安全由两部分组成:访问控制(见Section 20.1),由连接级管理;授权控制(见Section 5.8),由 GRANT 系统管理。外部数据包装器(见postgres_fdw)允许一个数据库中的对象充当其他数据库或集簇中对象的代理。较早的 dblink 模块(见dblink)也提供了类似的能力。默认情况下,所有用户都可以使用所有连接方法连接到所有数据库。
如果一个 PostgreSQL 服务器集簇计划容纳彼此无关、通常也不需要相互感知的项目或用户,建议将它们放入不同的数据库,并相应地调整授权和访问控制。如果这些项目或用户彼此相关,因此应当能够使用彼此的资源,那么它们应当位于同一个数据库中,但通常应放入不同的模式;这能提供具有名字空间隔离和授权控制的模块化结构。关于管理模式的更多信息见Section 5.10。
虽然可以在单个集簇中创建多个数据库,但仍建议仔细权衡其收益是否超过风险和限制。尤其要考虑共享 WAL(见Chapter 28)对备份和恢复选项的影响。虽然从用户角度看,集簇中的各个数据库彼此隔离,但从数据库管理员的角度看,它们又是紧密绑定的。
数据库使用CREATE DATABASE命令创建(见Section 22.2),使用DROP DATABASE命令删除(见Section 22.5)。要确定现有数据库的集合,可以检查系统目录pg_database,例如:
SELECT datname FROM pg_database;
psql程序的\l元命令和-l命令行选项也可用于列出现有数据库。
SQL标准将数据库称为“目录”,但在实践中两者没有区别。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。