PostgreSQL是一个在Unix世界被广泛应用的免费数据库管理系统(DBMS),无论是它支持的特性,还是它的性能都可以和其它的商业数据库一比高低。由于它采用C语言编写,在不同的Unix之间互相移植非常方便,于是PostgreSQL能够在众多的平台上运行,包括:Solaris、AIX、 SCO Unix、HP Unix、Linux、FreeBSD等。
PostgreSQL起源于美国加州大学伯克莱分校计算机科学系的一个数据库研究项目——Postgres。从最初的雏形到现在, PostgreSQL已经发展15年了,新的特性、新的组织方法不断被加进来,其中最重要的要算它对SQL-92标准的完全支持及扩展。目前, PostgreSQL已离开校园,由一个全球性的核心开发队伍维护,并走上了开放源代码的道路。
我现在就介绍一下在RedHat Linux6.1上如何应用 PostgreSQL。
Linux上的安装
在RedHat Linux6.1的光盘上已经带有PostgreSQL的RPM包,安装很方便。这些RPM包有:
postgresql-6.5.2-1.i386.rpm ①
postgresql-server-6.5.2-1.i386.rpm ②
这两个是最基本的,一定要安装。
postgresql-devel-6.5.2-1.i386.rpm ③
postgresql-jdbc-6.5.2-1.i386.rpm ④
postgresql-odbc-6.5.2-1.i386.rpm ⑤
postgresql-perl-6.5.2-1.i386.rpm ⑥
postgresql-python-6.5.2-1.i386.rpm ⑦
postgresql-tcl-6.5.2-1.i386.rpm ⑧
如果你要在Linux上开发基于PostgreSQL的应用,那么你就还得安装以上6项。④和⑤顾名思义是(Linux平台的)JDBC和ODBC驱动;⑥是PERL的接口;⑦和⑧是用python和tcl写的GUI数据库前端访问工具,工作在X Window下,初学者肯定会喜欢用。
postgresql-test-6.5.2-1.i386.rpm ⑨
这是提供给用户测试PostgreSQL运行是否正常的样例,一般可以不安装。
如果没有RPM包,我们就要先进行编译才能继续安装,具体步骤请参阅有关的文档,这里限于篇幅不再详细介绍。
准备创建数据库
用rpm -i postgresql-xxxx-xxxx-x.i386.rpm命令安装所有需要的文件后,我们便要为创建数据库作准备了。检查一下目录:
/usr/lib/pgsql/目录里面有数据库的模板、样例文件;
/var/lib/pgsql/这是PostgreSQL默认存放数据库的目录,由于我们不用它存放数据,所以不用理会。
接下来的这一步很重要——创建数据库拥有者。由于数据库监听进程postmaster(后面将会详细说明)不能由root用户启动,否则会存在安全漏洞,所以我们必须创建一个用户(暂且称为数据库拥有者,以dbms表示),由它来启动postmaster:
#useradd dbms
#passwd dbms
一般我们会把同一个数据库的文件放在一个统一的目录下,例如/database:
#mkdir /database
别忘了赋予dbms对/database的全部权限:
#chown dbms.dbms /database
为了更好地进行维护、备份,建议在硬盘单独划分一个区用来专门存放/database目录的内容(也就是整个数据库的数据及配置文件),我也是这样做的。在我的硬盘里,划分了一个500MB的分区(/dev/hda10),在赋予权限之前修改/etc/fstab文件。仿照其它硬盘分区加入类似下面的一项:
/dev/hda10 /database ext2 defaults 1 2
当然,别忘了要用mkfs命令把/dev/hda10格式化为ext2类型的分区。
好,重启机器,在新配置生效后(可用mount查看)再赋予dbms对/database的权限。然后用dbms登录。
运行数据库初始化程序,我们需要告诉它至少两样东西:一样是原始模板的目录(用“-l”指出,在这里是/usr/lib/pgsql/);另一样是存放初始化后的数据库文件的目录(用“-r”指出,在这里是/database/):
$initdb -r /database/ -l /usr/lib/pgsql/
应用PostgreSQL
如无意外,初始化成功后我们就可以建立自己的数据库了。首先要知道,数据库用户是这样访问数据的:
所以先要启动postmaster:
$postmaster -i -D/database&
“-i”选项允许从网络上访问数据库,如果要开发和使用Client/Server模式的应用程序,一定要加这个参数。“-D”指出数据库目录。“&"是以后台方式运行监听进程。
现在,我们创建一个数据库,假定叫“mydb”:
$createdb mydb
然后启动前端访问工具:
$psql mydb
这时会出现提示符:
mydb=>
我们便可以键入SQL语句构造数据库了。例如以下命令建立一张名叫“test”的表,它由三个字段(id、name、income)组成:
mydb=>create table test (id int2, name varchar(10), income int4);
以上操作如果没问题就表明PostgreSQL数据库已经创建成功。但还有一些问题需要解决,例如我们并不想让任何人在任何地方都能访问任何数据库文件,这就需要建立授权/鉴别机制来分辨哪些是合法用户的合法请求、哪些不是。
刚完成安装的PostgreSQL默认只有一个合法超级用户——dbms,只有它才能写服务器上的/database目录,但是也由于dbms一开始就存在,所以鉴别机制对它不起作用。只要它喜欢,可以访问任何数据库(因为dbms可以修改鉴别机制的配置文件,下面会提到)。正如Unix系统的root用户,它可以修改任何文件的权限、可以修改存放用户口令的shadow文件。所以当完成安装后,我们就要创建新的管理者,暂且称它为dba。
由于用字符界面的psql创建dba比较烦琐,所以最好用GUI的pgaccess,这需要我们成功安装RPM包⑧。完成后进入系统目录:
#cd /usr/lib/pgsql/pgaccess
把可执行属性赋予main.tcl:
#chmod +x main.tcl
然后便可以启动X Window,打开一个xterm窗口,运行pgaccess:
$./main.tcl
我们只须键入数据库名字(mydb)即可进入维护界面。我们必须创建一个新用户dba(记得为它指定password),并赋予它创建其它用户和数据库的权限,即选择以下两项:
Allow user to create databases
Allow user to create other users
保存并退出pgaccess。
最后要做的就是修改控制机器和用户访问数据库的配置文件:
$chmod u+w /database/pg_hba.conf
$emacs /database/ pg_hba.conf
里面有详细的说明,这里只是简单的介绍。文件除了注释以外,全部由统一格式的项组成:
entry_type DBNAME IP_ADDRESS ADDRESS_MASK USERAUTH [AUTH_ARG]
entry_type:项的类型,分两种,一种是“host”,另一种是“local”。host类型的项负责网络访问(带有IP地址的访问)的鉴别机制,local负责本地(即服务器自身)Unix Socket接口访问的鉴别;
DBNAME:数据库名字;
IP_ADDRESS:允许访问的IP地址范围(与IP_MASK一起决定);
ADDRESS_MASK:同上;
USERAUTH:鉴别方式;
[AUTH_ARG]:某些鉴别方式需要的参数。
如下例子:
host mydb 192.168.0.0
55.255.255.0 crypt
这条记录允许IP地址为192.168.0.x的机器通过加密的用户口令文件验证口令后访问mydb数据库。加密的用户口令文件是/database/pg_shadow。这是最常用的鉴别方式。
又如:
local all trust
这条记录允许所有用户本地访问(例如用远程登录方式访问)任何数据库(最好不要这样做,虽说SQL语句本身带有授权/鉴别机制,但小心一点还是没有坏处的)。
假定我们采用crypt鉴别方式控制对mydb的访问,并且通过网络连接到IP为192.168.0.3的Linux数据库服务器上的mydb数据库,这时就要提供用户名和口令:
$psql -d mydb -u -h 192.168.0.3
“- d”指出数据库名字,“-u”指出需要提供用户名和口令,“-h”指出服务器IP。一旦pg_hba.conf指定使用crypt机制则必须加“-u”参数,否则无法连接数据库,即使你是dbms。所以从今以后我们便要以dba的身份来维护数据库(dbms由于没有加密的口令存放在pg_shadow,所以无法通过crypt验证登录数据库,不过,必要时dbms还是可以修改pg_hba.conf来强行登录)。
心急的朋友已经忍不住了——怎样开发PostgreSQL的客户端应用呢?
放心,PostgreSQL提供了基于Windows95的ODBC驱动,只要安装了ODBC驱动,便可以用VC、Delphi等开发应用。另外,通过JDBC驱动访问PostgreSQL也可以(例如Jbuilder里有关的数据库访问API或JavaBean等)。
更详细的信息请参阅有关文档或访问http://www.postgresql.org/。