↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本。 PostgreSQL 7.1 已结束支持。 请参阅 当前版本手册.

第 6 章 管理数据库

数据库是一个命名的 SQL 对象(“数据库对象”);每个数据库对象(表、函数等)都属于且只属于一个数据库。连接到数据库服务器的应用用它的连接请求指定它想要连接的数据库的名称。每个连接不能访问多于一个数据库。(但一个应用可以打开的到同一数据库或其他数据库的连接数量不受限制。)

注意

SQL 把数据库称为“目录”,但在实践中没有区别。

要创建或删除数据库,Postgres postmaster 必须已经启动并正在运行(见第 3.3 节)。

6.1. 创建数据库 #

数据库使用查询语言命令 CREATE DATABASE 创建:

CREATE DATABASE name

其中name可以自由选择。(取决于当前的实现,底层操作系统的某些特殊字符可能被禁止。届时会有运行时检查。)当前用户自动成为新数据库的所有者。数据库的所有者有权在以后删除它(这也会删除其中的所有对象,即使它们有不同的所有者)。

创建数据库是一项受限操作。关于如何授予该权限,见第 7.1.1 节。

引导(Bootstrapping).  由于执行CREATE DATABASE命令时必须先连接到数据库服务器,因此还会有一个问题:某个站点上的第一个数据库是如何创建的?第一个数据库总是由initdb命令在初始化数据存储区时创建的(见第 3.2 节)。这个数据库叫做 template1,并且不能被删除。因此,要创建第一个“真正”的数据库,你可以连接到 template1。

“template1” 这个名字并非偶然:每当创建一个新数据库时,模板数据库都会被实质性地克隆。这意味着你在 template1 中所做的任何更改,都会传播到后来创建的所有数据库中。这暗示你不应把模板数据库用于实际工作,但如果使用得当,这一特性可以带来便利。

为了方便,还可以从 shell 中执行一个程序来创建新数据库,即 createdb。

createdb dbname

createdb并没有什么特殊之处。它连接到 template1 数据库并执行CREATE DATABASE命令,和上面描述的完全一样。它在内部使用 psql 程序。createdb 的参考页包含调用细节。特别是,不带任何参数的 createdb 会创建一个与当前用户名同名的数据库,这未必是你想要的。

6.1.1. 备选位置

可以在默认位置之外的地方创建数据库。请记住,所有数据库访问都是通过数据库服务器后端进行的,因此所指定的任何位置都必须是后端可以访问的。

备选数据库位置通过一个环境变量来引用,该变量给出预期存储位置的绝对路径。这个环境变量必须在后端启动之前已被定义。任何有效的环境变量名都可以用来引用备选位置,不过建议使用以 PGDATA 为前缀的变量名,以避免与其他变量混淆和冲突。

要在服务器进程的环境中创建变量,你必须先关闭服务器、定义变量、初始化数据区域,最后重新启动服务器。(见第 3.6 节和第 3.3 节。)要设置环境变量,在 Bourne shell 中输入

PGDATA2=/home/postgres/data
export PGDATA2

或者在 csh 或 tcsh 中输入

setenv PGDATA2 /home/postgres/data

你必须确保这个环境变量始终在服务器环境中有定义,否则你将无法访问那个数据库。因此你大概会想在某个 shell 启动文件或服务器启动脚本中设置它。

要在 PGDATA2 中创建一个数据存储区域,首先要确保 /home/postgres 已经存在,并且运行后端的用户账号可以写入它(见第 3.1 节)。然后在命令行输入

initlocation PGDATA2

这之后就可以重新启动服务器。

要在新位置创建数据库,使用命令

CREATE DATABASE name WITH LOCATION = 'location'

其中 location 是你使用的环境变量,本例中即 PGDATA2。createdb 命令有 -D 选项用于此目的。

用这种方法在备选位置创建的数据库可以像任何其他数据库一样被访问和删除。

注意

也可以直接向 CREATE DATABASE 命令指定绝对路径而不定义环境变量。默认情况下这是不允许的,因为它有安全风险。要允许这样做,你必须在编译 Postgres 时定义 C 预处理器宏 ALLOW_ABSOLUTE_DBPATHS。一种做法是这样运行编译步骤:gmake CPPFLAGS=-DALLOW_ABSOLUTE_DBPATHS all。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.