作者:自由狼-台风

MySQL不支持视图和子查询,只能做最轻量级的应用。想功能强一点,还是要 PostgreSQL(当然这就不是强“一点”了,PostgreSQL 几乎是开放源代码数据库管理系统中唯一强悍到媲美商业软件的)。


一. 安装篇


下载了 PostgreSQL 7.3.4 源代码,保存为“/opt/lin_app02/tmp/download/PostgreSQL/R1/postgresql-7.3.4.tar.gz”。下载后,我在这个目录下开了终端(rxvt),执行命令:

代码:
[root@TFW-RFL40F R1]# tar zxvfp ./postgresql-7.3.4.tar.gz
[root@TFW-RFL40F R1]# cd postgresql-7.3.4
[root@TFW-RFL40F postgresql-7.3.4]# ./configure \
--prefix=/opt/lin_app01/postgres --enable-locale \
--enable-multibyte --with-perl --with-odbc \
--with-tcl


对上面一步的说明:
./configure
configure不加任何选项,系统将按默认的设置安装 postgresql,查看 configre 的相关选项可以使用:configure --help

一些最常用的如下:

--prefix=BASEDIR
为安装 PostgreSQL 选择一个不同的基础路径。缺省是 /usr/local/pgsql。

--enable-locale
如果您想用本地化支持。

--enable-multibyte
允许使用多字节字符编码。这个选项主要用于象日语,韩语或中文这样的语言。

--with-perl
添加 Perl 模块接口。请注意 Perl 接口将安装到 Perl 模块的常用位置(典型的是在 /usr/lib/perl),所以要成功使用这个选项,您必须有 root 权限。

--with-odbc
制作 ODBC 驱动包。

--with-tcl
制作 Tcl/Tk 需要的接口库和程序,包括 libpgtcl,pgtclsh,和 pgtksh。

这些编译参数告诉编译器如何编译 PostgreSQL:

代码:
[root@TFW-RFL40F postgresql-7.3.4]# make
[root@TFW-RFL40F postgresql-7.3.4]# make install

中间不报错的话,安装就完成了。



二. 初始化


创建一个存放数据库文件的目录:
代码:
[root@TFW-RFL40F postgresql-7.3.4]# mkdir /opt/lin_app01/postgre-data



下面要设置环境变量。由于安全原因,PostgreSQL 是不让“root”等特权用户用的。为了方便,我就用日常工作的“TFW”身份管理 PostgreSQL,但是建议大家为管理 PostgreSQL 新创建一个用户。为了方便,我直接修改了“/etc/profile”,但是建议修改个人主目录下的“.bash_profile”。我在环境变量文件里添加了如下内容:

代码:
##########################################
# PostgreSQL 7.3.4
##########################################
LD_LIBRARY_PATH=/opt/lin_app01/postgres/lib
PGLIB=/opt/lin_app01/postgres/lib
PGDATA=/opt/lin_app01/postgre-data
PATH=$PATH:/opt/lin_app01/postgres/bin
MANPATH=$MANPATH:/opt/lin_app01/postgres/man
export LD_LIBRARY_PATH PGLIB PGDATA PATH MANPATH
##########################################


看着挺麻烦,其实就是下面的格式:

LD_LIBRARY_PATH=[--prefix所指的地方]/lib
PGLIB=[--prefix所指的地方]/lib
PGDATA=[您放数据库文件的地方]
PATH=$PATH:[--prefix所指的地方]/bin
MANPATH=$MANPATH:[--prefix所指的地方]/man
export LD_LIBRARY_PATH PGLIB PGDATA PATH MANPATH


刚才提到的那些目录都是在“root”身份下创建的,要让它们能为“TFW”所用,还得改变文件的属主和群组:

代码:
[root@TFW-RFL40F postgresql-7.3.4]# chown -R TFW.TFW /opt/lin_app01/postgre*
即:
chown -R [PostgreSQL管理员用户名].[PostgreSQL管理员所在组] [--prefix所指的地方]
或者:
chown -R [PostgreSQL管理员用户名].[PostgreSQL管理员所在组] [您放数据库文件的地方]

然后关闭 X,并注销,再重新登录,以使环境变量生效。
……



初始化 PostgreSQL:

代码:
[TFW@TFW-RFL40F TFW]$ initdb
请确保执行前您放数据库文件的地方是空的。初始化后会自动创建数据库的超级用户,用户名与安装、执行初始化的操作系统用户同名。可能还会自动创建一个与用户名同名的数据库。在我这里就是用户“TFW”和数据库“TFW”。直接执行“[--prefix所指的地方]/bin/psql”就能登录进去。“\q”可以退回操作系统的shell。如果这个数据库没有自动生成,请执行“[--prefix所指的地方]/bin/createdb [用户名]”,即以您的用户名创建一个数据库。这个数据库就相当于您的“Home”,没这个数据库,做某些事情就不方便。



三. 启停方法


代码:
[TFW@TFW-RFL40F TFW]$ postmaster -i -D ./postgre-data/ &
即:
postmaster -i -D [database-path] &

这是开始数据库系统的服务。后面那个“&”最好带上,否则,......:-D


上面说的启动方法是正规方法,PostgreSQL还提供了封装的控制脚本“[--prefix所指的地方]/bin/pg_ctl”。

代码:
[TFW@TFW-RFL40F TFW]$ pg_ctl -l ./123/pg.log start
如果有“-l 文件名”这个参数,所有的错误都会被记录到这个日志文件里。

代码:
[TFW@TFW-RFL40F TFW]$ pg_ctl stop
停止服务。既然是停止,就别管什么记录文件了。

代码:
[TFW@TFW-RFL40F TFW]$ pg_ctl -l ./123/pg.log restart
相当于先“stop”再“start”。

代码:
[TFW@TFW-RFL40F TFW]$ pg_ctl reload
如果对配置文件做了修改,想不中断服务而立即生效,就这样。

注意:PostgreSQL 管理员最好从“Login:”、xdm、gdm 或 kdm 登录系统,因为如果“su”过去操作将不能正常执行。


下面是参考的帖子:
http://www.freelamp.com/new/publish/1012414614/index_html
http://chinaunix.net/jh/18/546.html
http://chinaunix.net/jh/18/548.html

帖子里所说的“egcs-c++”已经被整合进高版本的“gcc”里了。如果您的“gcc”版本高于 2.8,也就不要再到处找“egcs-c++”了。


四. 安全管理

初始化后,在数据库目录里会有这样两个文件:“postgresql.conf”和“pg_hba.conf”。


修改“postgresql.conf”第 30 行左右的地方为顶格“tcpip_socket = true”,以允许网络访问。

修改“pg_hba.conf”,基于主机的访问控制(Host Based Access)。左边有“#”的内容都是被注释掉的,起说明或参考等作用。我以我现在的文件为例做说明(里面的中文为我的说明):

代码:
# PostgreSQL Client Authentication Configuration File 
# =================================================== 
# 
# Refer to the PostgreSQL Administrator's Guide, chapter "Client 
# Authentication" for a complete description.  A short synopsis 
# follows. 
# 
# This file controls: which hosts are allowed to connect, how clients 
# are authenticated, which PostgreSQL user names they can use, which 
# databases they can access.  Records take one of three forms: 
# 
# local    DATABASE  USER  METHOD  [OPTION] 
# host     DATABASE  USER  IP-ADDRESS  IP-MASK  METHOD  [OPTION] 
# hostssl  DATABASE  USER  IP-ADDRESS  IP-MASK  METHOD  [OPTION] 
# 
# (The uppercase quantities should be replaced by actual values.) 
# DATABASE can be "all", "sameuser", "samegroup", a database name (or 
# a comma-separated list thereof), or a file name prefixed with "@". 
# USER can be "all", an actual user name or a group name prefixed with 
# "+" or a list containing either.  IP-ADDRESS and IP-MASK specify the 
# set of hosts the record matches.  METHOD can be "trust", "reject", 
# "md5", "crypt", "password", "krb4", "krb5", "ident", or "pam".  Note 
# that "password" uses clear-text passwords; "md5" is preferred for 
# encrypted passwords.  OPTION is the ident map or the name of the PAM 
# service. 
# 
# This file is read on server startup and when the postmaster receives 
# a SIGHUP signal.  If you edit the file on a running system, you have 
# to SIGHUP the postmaster for the changes to take effect, or use 
# "pg_ctl reload". 

# Put your actual configuration here 
# ---------------------------------- 
# 
# CAUTION: The default configuration allows any local user to connect 
# using any PostgreSQL user name, including the superuser, over either 
# Unix-domain sockets or TCP/IP.  If you are on a multiple-user 
# machine, the default configuration is probably too liberal for you. 
# Change it to use something other than "trust" authentication. 
# 
# If you want to allow non-local connections, you need to add more 
# "host" records.  Also, remember TCP/IP connections are only enabled 
# if you enable "tcpip_socket" in postgresql.conf. 

# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD 
#访问来源 数据库    用户        IP-地址           子网掩码          认证方式 

local   TFW         TFW                                             md5 
#对于来自本地的访问,数据库“TFW”对用户“TFW”采用“md5”加密口令认证 

local   TFW         all                                             reject 
#对于来自本地的访问,数据库“TFW”对上面没提到的所有用户无条件拒绝认证 

host    TFW         TFW         127.0.0.1         255.255.255.255   md5 
#对于来自网络的访问,数据库“TFW”对用户“TFW”,如果提出访问的是本机,采用“md5”加密口令认证 

host    TFW         all         0.0.0.0           0.0.0.0           reject 
#对于来网络的访问,数据库“TFW”对上面没提到的所有用户,不管提出访问的哪台机器,也不管它来自哪个子网,无条件拒绝认证 

local   all         all                                             md5 
#对于来自本地的访问,上面没提到的数据库对上面没提到的所有用户采用“md5”加密口令认证 
host    all         all         0.0.0.0           0.0.0.0           md5 
#对于来网络的访问,上面没提到的数据库对上面没提到的所有用户,不管提出访问的是哪台机器,也不管它来自哪个子网,采用“md5”加密口令认证 

######################################## 
#   Others are all denied
#   其他访问一概无条件拒绝 
local   all         all                                             reject 
host    all         all         0.0.0.0           0.0.0.0           reject 
######################################## 

######################################## 
#   All denied permissed, not safe 
#   对所有访问都信任,太不安全,被注释掉了,只作为参考 
#local   all         all                                             trust 
#host    all         all         0.0.0.0           0.0.0.0           trust 
######################################## 



这些认证的规则是从上到下一条一条加载的,要注意的是,里面的“all”并不是真正意义上的“所有”,只是前面的规定中没有提到的那部分。个人感觉用“other”也许更恰当。


这样,最终的结果是:所有用户都能通过加密口令访问“TFW”以外的数据库,但是只有用户“TFW”能以加密口令访问数据库“TFW”。
更多中文文档参见:PostgreSQL 文档中文化主页