Chapter 22. 管理数据库
每个正在运行的PostgreSQL服务器实例都管理着一个或多个数据库。因此,在组织SQL对象(“数据库对象”)的层次中,数据库位于最顶层。本章描述数据库的属性,以及如何创建、管理、删除它们。
22.1. 概述
一个数据库是一些SQL对象(“数据库对象”)的命名集合。通常每个数据库对象(表、函数等) 属于并且只属于一个数据库(不过有几个系统表如pg_database属于整个集簇并且对集簇中的每个数据库都是可访问的)。更准确地说,一个数据库是一个模式的集合, 而模式包含表、函数等等。因此完整的层次是这样的:服务器、数据库、模式、表(或者某些其他对象类型,如函数)。
当连接到数据库服务器时,客户端必须在它的连接请求中指定它要连接的数据库名。每次连接不能访问超过一个数据库。不过,一个应用能够在同一个或者其他数据库上打开的连接数并没有受到限制。数据库是物理上相互隔离的,并且访问控制是在连接层面进行管理的。
如果一个PostgreSQL服务器实例用于承载那些应该分隔并且相互之间并不知晓的用户 和项目,那么我们建议把它们放在不同的数据库里。如果项目或者用户是相互关联的, 并且可以相互使用对方的资源,那么应该把它们放在同一个数据库里,但可能在不同的模式中。
模式只是一个纯粹的逻辑结构并且谁能访问某个模式由权限系统管理。有关管理模式的更多信息在Section 5.8中。
数据库是使用CREATE DATABASE(见Section 22.2),并且用DROP DATABASE命令删除(见Section 22.5)。要确定现有数据库的集合,可以检查系统目录pg_database,例如
SELECT datname FROM pg_database;
psql程序的\l元命令和-l命令行选项也可以用来列出已有的数据库。
SQL标准把数据库称作“目录”,不过实际上没有区别。
22.2. 创建一个数据库
为了创建一个数据库,PostgreSQL服务器必须启动并运行(见Section 18.3)。数据库用 SQL 命令CREATE DATABASE创建:
CREATE DATABASE name;
其中name遵循SQL标识符的一般规则。当前角色自动成为该新数据库的拥有者。以后删除这个数据库也是该拥有者的特权(同时还会删除其中的所有对象,即使那些对象有不同的拥有者)。
创建数据库是一个受限的操作。如何授权请见Section 21.2。因为你需要连接到数据库服务器来执行CREATE DATABASE命令, 那么还有一个问题是任意给定站点的第一个数据库是怎样创建的?第一个数据库总是由initdb命令在初始化数据存储区域时创建的(见Section 18.2)。这个数据库被称为postgres。因此要创建第一个“普通”数据库时,你可以连接到postgres。
在数据库集簇初始化期间也会创建第二个数据库template1,。当在集簇中创建一个新数据库时,实际上就是克隆了template1。这就意味着你对template1所做的任 何修改都会体现在所有随后创建的数据库中。因此应避免在template1中创建对象,除非你想把它们传播到每一个新创建的数据库中。详见Section 22.3。
为了方便,你还可以用一个程序来创建新数据库: createdb。
createdb dbname
createdb没什么神奇的。它连接到postgres数据库并且发出CREATE DATABASE命令,和前面介绍的完全一样。createdb参考页包含了调用细节。注意不带任何参数的createdb将创建一个使用当前用户名的数据库。
Chapter 20包含有关如何限制谁能连接到一个给定数据库的信息。
有时候你想为其他人创建一个数据库,并且使其成为新数据库的拥有者, 这样他们就可以自己配置和管理这个数据库。要实现这个目标,使用下列命令之一: 用于 SQL 环境的
CREATE DATABASE dbname OWNER rolename;
或者用于 shell 的
createdb -O rolename dbname
只有超级用户才被允许为其他人(即为一个你不是其成员的角色)创建一个数据库。