9.1第一章

From PostgreSQL wiki
Jump to navigationJump to search

1.1安装

不用说,在使用PostgreSQL之前你需要去安装它。如果PostgreSQL已经预装在你的操作系统或者系统管理员已经安装了它,你需要从操作系统的文档中或者是系统管理员那里得到如何访问PostgreSQL的信息。

如果你不能确定PostgreSQL是否已经安装,或者安装好的PostgreSQL是否可以用,那么你可以自行安装它。PostgreSQL的安装并不是很难,安装本身还是个很好的锻炼机会。PostgreSQL 可以由无特权用户安装,不需超级用户(root)访问权限。

如果你要自己安装PostgreSQL,请参考第15章的安装说明书,在安装完成之后返回到本说明。一定要注意设置好相关的的环境变量。

如果你的服务器的管理员安装PostgreSQL时,不是按照缺省的方式安装的话,你还需要作些额外的工作。例如,如果数据库服务器在远程计算机上,那你要把PGHOST的环境变量设置为数据库服务器的计算机名,环境变量PGPORT可能也需要进行设置。最常见的是,如果你启动应用程序时,但它不能连接到数据库,你应该马上与你的系统管理员联系;如果你就是管理员,那么你就要参考文档以确保你的环境变量设置正确。如果你对前面谈到的内容还有不清楚的地方,请先阅读下一节。

1.2体系基本概念

首先,需要先了解PostgreSQL 系统的基本体系结构。理解 PostgreSQL 体系各部分之间的相互关系将会使本章节显得更清晰一些。

PostgreSQL 使用客户机/服务器(C/S)的模式提供服务,一个PostgreSQL会话由下列相关的进程(程序)组成:

(1)一个服务器端进程。该进程管理数据库文件,接受客户端与数据库的连接,且代表客户端对数据库进行操作。该进程的程序名叫做 postgres。

(2)前端应用,即需要进行数据库操作的客户端应用。客户端应用可能本身就是多种多样的:它们可以是一个字符界面的工具, 也可以是一个图形界面的应用,或者是一个通过访问数据库来显示网页的 web 服务器,或者是一个特殊的数据库管理工具。 一些客户端应用是和 PostgreSQL 发布一起提供的,但绝大部分是用户开发的。

和典型的客户端/服务器应用(C/S应用)一样,客户端和服务器可以在不同的主机上。此时,它们通过TCP/IP进行网络连接,你应该记住这一点,因为在客户机上可以访问的文件未必能够在数据库服务器机器上访问(或者只能用不同的文件名进行访问)。

PostgreSQL 服务器可以处理来自客户端的多个并发请求。为了能这样处理,它会为每个请求启动(“forks”)一个新的进程,然后,客户端和新服务器端进程就不再经过最初的postgres 进程而直接通信。 因此, 服务器端的主进程一直运行,等待着来自客户端的连接;而客户端和相关联的服务器端进程则在需要的时候才会运行。(当然,这些对用户来说是透明的,在这里谈这些主要是为了说明的完整性。)


1.3创建一个数据库

测试能否访问数据库服务器的第一个例子是试着创建一个数据库,一台PostgreSQL服务器可管理多个数据库,通常我们会为每个项目和每个用户使用一个独立的数据库。

你的系统管理员可能已经为你创建了数据库,且已经把数据库名告诉你。要是这样的话你就可以省略这一步直接跳到下一节

要创建一个名为mydb的新数据库(在我们这个例子里叫 mydb),你可以使用下面的命令:

   $ createdb mydb

如果命令运行之后没有显示特别的信息的话,这个命令就是成功了,那么你可以跳过本节的余下部分了。

如果你看到类似下面这样的信息

   createdb: command not found 

那么就是PostgreSQL没有安装好。要么是就根本没装上,要么是你的shell搜索路径设置没有包含它。尝试用绝对路径调用该命令试试:

   $ /usr/local/pgsql/bin/createdb mydb 

你的节点上的路径可能不一样。和你的管理员联系或者看看安装指导获取正确的位置。

另外一种响应可能是这样:

   createdb: could not connect to database postgres: could not connect to server:
   No such file or directory
       Is the server running locally and accepting
       connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

这意味着该服务器没有启动,或者没有在 createdb 预期的地方启动。同样, 你也要检查安装指导或者找管理员。

另外一个响应可能是这样:

   createdb: could not connect to database postgres: FATAL: role "joe" does not exist 

在这里提到了你的登录帐号,如果管理员没有为你创建 PostgreSQL 用户帐号, 就会发生这些现象。(PostgreSQL 用户帐号和操作系统用户帐号是不同的。) 如果你是管理员,参阅 Chapter 20 获取创建用户帐号的帮助。 你需要切换到安装 PostgreSQL 的操作系统用户的身份(通常是 postgres)才能创建第一个用户帐号。 也有可能是赋予你的 PostgreSQL 用户名和你的操作系统用户名不同;这种情况下,你需要使用 -U 开关或者使用 PGUSER 环境变量声明你的 PostgreSQL 用户名。

如果你有个数据库用户帐号,但是没有创建数据库所需要的权限,那么你会看到下面的提示:

   createdb: database creation failed: ERROR:  permission denied to create database

并非所有用户都有创建新数据库的授权。 如果 PostgreSQL 拒绝你你创建数据库, 那么你需要让节点管理员赋予你创建数据库的权限。出现这种情况时请咨询你的节点管理员。 如果你自己安装了 PostgreSQL, 那么你应该以你启动数据库服务器的用户身份登陆然后参考手册完成权限的赋予工作。 [1]

你还可以用其它名字创建数据库。 PostgreSQL 允许你在一个给定的节点上创建任意数量的数据库。 数据库名必须是以字母开头并且小于 63 个字符长。 一个便捷的做法是创建和你当前用户名同名的数据库。 许多工具都会假设该数据库名为缺省数据库名,这样就可以节省你的敲键。 要创建这样的数据库,只需要键入

   $ createdb

如果你不想再使用你的数据库了,那么你可以删除它。 例如,如果你是数据库 mydb 的所有人(创建人), 那么你就可以用下面的命令删除它:

   $ dropdb mydb

(对于这条命令而言,数据库名不是缺省的用户名。这样你就必须声明它。)这个动作物理上将所有与该数据库相关的文件都删除并且不可取消, 因此做这件事之前一定要想清楚。

关于createdb和dropdb的资料可分别在createdb和dropdb的独立部分找到。

注:

[1] 关于可以这么做的原因:PostgreSQL的用户名是和操作系统用户账号分开的。 当你连接到一个数据库的时候,你可以选择以何种 PostgreSQL 用户名进行联接; 如果你不选择,那么缺省就是你的当前操作系统账号。 如果这样,那么总有一个与操作系统用户同名的 PostgreSQL 用户账号用于启动服务器, 并且通常这个用户都有创建数据库的权限。如果你不想以该用户身份登陆, 那么你也可以在任何地方声明一个 -U 选项以选择一个联接的 PostgreSQL 用户名。

1.4访问数据库

一旦你已经创建了一个数据库,你就可以通过以下方式访问它;

  • 运行 PostgreSQL 交互的终端程序psql, 它允许你交互地输入、编辑和执行 SQL 命令。
  • 使用现有的图形前端工具,比如 Pgadmin 或者带 ODBC或JDBC支持的办公套件来创建和管理数据库。 这种方法在这份教程中没有介绍。
  • 写一个客户应用,使用多种语言绑定中的一种。 这些可能性在 Part IV 中有更深入的讨论。

你可能想要启动 psql来试验本教程中的例子。可以输入下面的命令来启动mydb 数据库:

   $ psql mydb

如果你没有提供数据库名字,那么它缺省就是你的用户账号名字。 你已经在前面的小节里知道如何使用createdb了。

在 psql 里,你会看到以下信息:

   psql (9.1)
   Type "help" for help.
   mydb=>

最后一行也可能是

   mydb=#

这个提示符意味着你是一个数据库超级用户,出现这种情况最可能的原因是你自己安装的PostgreSQL。作为超级用户意味着你不受访问控制的限制。 对于本教程的目的而言,是否超级用户并不重要。

如果你启动 psql 时碰到了问题,那么请回到前面的小节。 诊断 createdb 的方法和诊断 psql 的方法很类似, 如果前者能运行那么后者也应该能运行。

psql 打印出的最后一行是提示符,它表示 psql 正听着你说话,这个时候你就可以输入 SQL 查询语句到一个 psql 维护的工作区中。试验一下下面的命令:

mydb=> SELECT version();
                              version
-----------------------------------------------------------------------
PostgreSQL 9.1 on i586-pc-linux-gnu, compiled by GCC 2.96, 32-bit
(1 row)
mydb=> SELECT current_date;
   date
------------
 2002-08-31
(1 row)
mydb=> SELECT 2 + 2;
 ?column?
----------
       4
(1 row)

psql 程序有一些不属于 SQL 命令的内部命令。 它们以反斜杠开头,"\"。 例如,你可以用下面的命令获取各种PostgreSQL SQL 命令的帮助语法:

   mydb=> \h

要退出 psql,键入

   mydb=> \q

然后 psql 就会退出并且给你返回到shell命令行 。 (要获取更多有关内部命令的信息,你可以在 psql 提示符上键入 \?)。 psql 的完整功能在 psql文档中有记录。如果 PostgreSQL 安装正确,那么你还可以在操作系统的 shell 提示符上键入 man psql 来阅读该文档。在这份文档里,我们将不会明确使用这些特性,但是你自己可以在合适的时候使用它们。