技术开发 频道

行式数据库PostgreSQL 9.04版本评测

  【IT168 专稿】PostgreSQL 是一种对象-关系型数据库管理系统(ORDBMS),功能强大,特性丰富的自由软件数据库系统。这个起源于伯克利(BSD)的数据库研究计划目前已经成为一项国际开发项目,并且有非常广泛的用户。在灵活的BSD风格许可证下发行。

  PostgreSQL的前身是BSD的始于1977年的Ingres项目,这个项目是Michael Stonebraker教授领导的,在1982 年,Michael Stonebraker离开伯克利商业化了Ingres,Ingres是一个非关系型的数据库,数据关系需要由用户有意识地维护,在1985年,Michael Stonebraker回到伯克利开始一个后-Ingres(post-Ingres)的项目,目的是解决Ingres中,同时也是1980年代的数据库系统中的主要问题:数据关系维护的问题。这就是 Postgres 的开端。1989年6月发布了版本1,1990年6月发布了版本2,1991年发布了版本3。在版本3里改进了规则系统,增加了多存储系统支持以及改进了查询引擎。在1993年,特性需求急剧增加;在做了一些代码清理、发布了版本4之后,Postgres 项目正式终止。

  Postgres 并没有因为 Postgres 项目的终止而停止发展,而是仍然在各种场合被人们所使用,在1994年,两名伯克利的研究生,来自中国香港的 Andrew Yu 和 Jolly Chen,向 Postgres 里增加了现代的 SQL 语言的支持。而原先Postgres用的是 QUEL/Postquel 语言, 1992年SQL 语言的国际标准发布,当时称为 SQL2,但是人们常称为 SQL92。两位研究生是用 bison 和 flex 工具的组合,把Postgres 的Postquel查询语言替换成了 SQL92,然后将Postgres改名为 Postgres95,并将其发布到了互联网上,随后的 1996 年,加拿大的 Marc Fournier提供了第一个非大学的开发服务器平台,然后 Bruce Momjian(美国)和 Vadim B. Mikheev(俄国)开始修改以及稳定伯克利发布的代码,并于1996年8月发布了第一个开源版本。

  随后,这些开发者把项目名称改变为 PostgreSQL,以对应 SQL 的支持,并且把 PostgreSQL 的版本号重新放到了原先 Postgres 项目的顺序中去,从 6.0 开始(Postgres 本身到4.2,Postgres95 算5.0)。7.x版本增加了预写入日志的功能,优化了In查询等,8.x版本提升了EXISTS 和NOT EXISTS性能,增加了并行恢复、分析函数和递归With查询等。9.x版本增加了对SQL:2008标准的支持,在数据恢复性能、分析函数等方面加强。

  目前,PostgreSQL 的稳定版本到了9.0.4,同时还支持8.x版本的更新,在RDBMS的各种特性方面,已经接近于“无可指摘”的境界了。而目前 PostgreSQL 的开发是围绕在更易用的 SQL 语言扩展、SQL 标准的兼容(比如SQL2003、XML/Xquery的支持)、扩展工具、外围工具等方面。

  一些商业公司在PostgreSQL代码的基础上,添加了Oracle兼容性和集群等增强功能,发行了各种企业级商业数据库,著名的有EnterpriseDB 和Greenplum,请读者自行查阅相关资料,这里不再赘述。

  一、数据库安装

  PostgreSQL在其官方网站http://www.postgresql.org/download/上提供了各种版本软件的下载连接,官方主要发布源代码版本,而编译好的二进制发行版由认证的第3方公司提供,RPM版本的下载连接是http://www.openscg.org/se/postgresql/packages.jsp ,提供32位和64位版本,我们选择64位rpm版进行测试。

  PostgreSQL网站http://www.postgresql.org/docs/9.0/interactive/index.html提供了文档在线浏览。http://www.postgresql.org/docs/也有部分其它语言的文档,但没有简体中文版,国内PostgreSQL的志愿者在http://www.pgsqldb.org/提供了8.x的中文文档,便于熟悉中文的用户学习。如果要学习最新的9.0版本,还是建议下载http://www.postgresql.org/files/documentation/pdf/9.0/postgresql-9.0-A4.pdf,制作精美,具备搜索功能。

  本次测试基于 Intel Xeon 7550*8的 PC服务器上用 VMWare VSphere 4.1管理的虚拟机,虚拟机的逻辑 CPU个数是 8,内存 100GB,存储为 8个 300GB SAS本地磁盘,采用一块 512M缓存 RAID卡,按 RAID5方式组成磁盘阵列。操作系统采用和 RHEL 5相同的核心级别的 RedFlag Asian Linux Sever 3.0 x64。因此选用的安装文件是RHEL5 (x86, 64-bit), RPM Package版本,postgres-9.0.4-1.x86_64.openscg.rpm,总大小大约16MB。

  安装步骤如下:

  1.安装前准备工作

  文档中介绍安装PostgreSQL前,首先要创建postgres用户和组,但作为一款广受欢迎的软件,很多Linux发行版中都默认安装了PostgreSQL, RedFlag Linux也不例外,因此,建用户的步骤可以忽略。

  先来查看一下,系统中已经安装的版本:

-bash-3.2$ rpm -qa|grep post
postfix
-pflogsumm-2.3.3-2.9AXS3
postgresql
-tcl-8.1.18-2.1.1AXS3
postgresql
-libs-8.1.18-2.1.1AXS3
postgresql
-docs-8.1.18-2.1.1AXS3
postgresql
-devel-8.1.18-2.1.1AXS3
postfix
-2.3.3-2.9AXS3
postgresql
-pl-8.1.18-2.1.1AXS3
postgresql
-odbc-08.01.0200-3.1
postgresql
-devel-8.1.18-2.1.1AXS3
freeradius
-postgresql-1.1.3-1.6.AXS3
postgresql
-contrib-8.1.18-2.1.1AXS3
postgresql
-server-8.1.18-2.1.1AXS3
postgresql
-8.1.18-2.1.1AXS3
postgresql
-python-8.1.18-2.1.1AXS3
postgresql
-jdbc-8.1.407-1jpp.4
postgresql
-libs-8.1.18-2.1.1AXS3

   可见,系统预安装的是8.1版本。将下载来的安装文件上传到Linux服务器。然后不卸载旧版PostgreSQL,直接用rpm -ivh命令安装,安装成功了,但是需要注意:/usr/bin上的postgres和psql命令是连接到旧版的,如果要用9.0版,需要指定文件的路径。

-bash-3.2$ cd /user1
-bash-3.2$ ll p*rpm
-rw-r--r-- 1 root root 16397430 04-24 08:16 postgres-9.0.4-1.x86_64.openscg.rpm [root@redflag11012501 user1]# rpm -ivh *rpm
Preparing...                ########################################### [100%]
  
1 postgres-9.0           ########################################### [100%]

  Rpm文件安装完成,下一步是用initdb命令初始化数据库。

[root@redflag11012501 user1]# su - postgres

-bash-3.2$ cd /opt
-bash-3.2$ ls post*
9.0
-bash-3.2$ cd post*/9.0
-bash-3.2$ pwd
/opt/postgres/9.0
-bash-3.2$ cd bin
-bash-3.2$ ./initdb --encoding=utf8 -D /user1/postgresql/data
The files belonging to this database system will be owned by user "postgres".
This
user must also own the server process.

The
database cluster will be initialized with locale zh_CN.GB18030.
initdb: encoding mismatch
The encoding you selected (UTF8)
and the encoding that the
selected locale uses (GB18030) do
not match.  This would lead to
misbehavior
in various character string processing functions.
Rerun initdb
and either do not specify an encoding explicitly,
or choose a matching combination.
-bash-3.2$
0