由 徐永久 发表于 01月31日 02:16。
说实在的,我的这个 LAMP 网站,其实是不能遗忘这头大象的。MySQL 是一条轻快的小海豚,但是缺少很多现代关系数据库应有的特色,例如:引用完整性,视图,触发器等。因此,如果你需要开发一个电子商务的网站,需要这些功能的话,你或许应该考虑 PostgreSQL 了。本文将通过其在 Red Hat 7.1 上安装过程,简要介绍其用法。
PostgreSQL 的官方下载地址为:
ftp://ftp.postgresql.org/pub/v7.1.3/postgresql-7.1.3.tar.gz
http://www.postgresql.org/
如果下载最新的开发版本,你需要下载并安装 flex(版本号大于 2.5.4) 以及 bison (版本号大于 1.28)
设计人员为了安全考虑,PostgreSQL 不能以 root 用户运行,所以必须建立对应的用户和组。
# useradd postgre (自动建立 postgre 组)
安装的过程并不复杂和其他源码版本的安装方法类似:
解压到 /usr/local/src:
# tar xvfz postgresql-7.1.3.tar.gz
# cd postgresql-7.1.3
# ./configure --prefix=/usr/local/pgsql
# make
# make install
# chown -R postgre.postgre /usr/local/pgsql
这样安装完毕后,并不是万事大吉了,还有一些收尾工作要做:
# vi ~postgre/.bash_profile
添加:
PGLIB=/usr/local/pgsql/lib
PGDATA=$HOME/data
PATH=$PATH:/usr/local/pgsql/bin
MANPATH=$MANPATH:/usr/local/pgsql/man
export PGLIB PGDATA PATH MANPATH
以 postgres 用户登录,
# su - postgre
建立数据库目录:
$ mkdir data
启动数据库引擎:
$ initdb
[postgre@www postgre]$ initdb
This database system will be initialized with username "postgre".
This user will own all the data files and must also own the server process.
Fixing permissions on pre-existing data directory /home/postgre/data
Creating database system directory /home/postgre/data/base
Creating database XLOG directory /home/postgre/data/pg_xlog
Creating template database in /home/postgre/data/base/template1
Creating global relations in /home/postgre/data/base
Adding template1 database to pg_database
Creating view pg_user.
Creating view pg_rules.
Creating view pg_views.
Creating view pg_tables.
Creating view pg_indexes.
Loading pg_description.
Vacuuming database.
Success. You can now start the database server using:
/usr/local/pgsql/bin/postmaster -D /home/postgre/data
or
/usr/local/pgsql/bin/pg_ctl -D /home/postgre/data start
$ postmaster -i -D ~/data &
[1] 22603
[postgre@www postgre]$ DEBUG: Data Base System is starting up at Thu Jan 31 02:00:44 2002
DEBUG: Data Base System was shut down at Thu Jan 31 01:57:58 2002
DEBUG: Data Base System is in production state at Thu Jan 31 02:00:44 2002
这样 PostgreSQL 使用位于 /usr/local/pgsql/data 的数据库,允许 Internet 用户的连接( -i ) ,并在后台运行。
建立数据库
$createdb mydb
PostgreSQL 会返回 “ CREATED DATABASE”的信息,表明数据库建立完成。
$psql mydb
进入交互 psql 工具,建立表:
CREATE TABLE mytable (
id varchar(20),
name varchar(30));
建立完成后,会得到一条 “CREATED” 的信息,表示建立成功。现在插入一条数据:
INSERT INTO mytable values('Author', 'Xu Yongjiu');
psql 返回 INSERT 18732 1,查询插入是否成功:
SELECT * FROM MYTABLE;
退出 psql ,用 /q 命令。
要让网上别的机子都可以访问则要修改以下东西
$vi /home/postgre/data/pg_hba.conf
在底下加入
local all trust #允许通过本地的所有机子
host all 0.0.0.0 0.0.0.0 trust #允许网内所有机子
host all 192.168.0.96 255.255.255.255 trust #允许网内192.168.0.96的机子
$vi /home/postgre/data/postgresql.conf
#tcpip_socket = false 修改成 tcpip_socket = true
$ pg_ctl start #启动数据库
$ pg_ctl restart #重启数据库
$ pg_ctl stop #关闭数据库
=================================================
访问认证配置主要涉及到两个主要的配置文件:postgresql.conf 和 pg_hba.conf。
postgresql.conf
unix_socket_group: 设置 Unix 域套接字的组所有人,(套接字的所有权用户总是启动 postmaster 的用户)与 UNIX_SOCKET_PERMISSIONS 选项一起使用可以给这种套接字类型增加额外的访问控制机制, 缺省时是一个空字串,也就是使用当前用户的缺省的组, 这个选项只能在服务器启动时设置。
unix_socket_permissions:给 Unix 域套接字设置访问权限,Unix 域套接字使用通常的 Unix 文件系统权限集。可选的值可以是一个 chmod 和 umask 系统调用可以接受的数字模式。(要使用客户化的八进制格式,该数字必须以 0 (零)开头)
缺省权限是 0777,意即任何人都可以联接,合理的选则可能是0770 (只有用户和组, 参阅UNIX_SOCKET_GROUP)和 0700 (只有用户)。(请注意对于 Unix 套接字而言,实际上只有写权限有意义,而且 也没有办法设置或者取消读或执行权限)
这个选项只能在服务器启动时设置。
pg_hba.conf
是设置访问认证的主要文件,格式为每条记录一行,每行指定一条访问认证。设定一条访问认证包含了7个部分:
连接方式(type)、
数据库(database)、
用户名(user)、
ip地址(ip-address)、
子网掩码(ip-mask)、
认证方法(authentication method)、
认证配置(authentication-option),以下是这7个部分的详细说明:
连接方式(type):连接方式共有三种:local、host、hostssl
local
这条记录匹配通过 Unix 域套接字进行的联接企图, 没有这种类型的记录,就不允许 Unix 域套接字的联接。
host
这条记录匹配通过 TCP/IP 网络进行的联接尝试,请注意,除非服务器是 带着 -i 选项或者打开了 postgresql.conf 里面的 tcpip_socket 配置参数集启动的,否则 TCP/IP 联接是被禁止掉的。
hostssl
这条记录匹配通过在 TCP/IP 上进行的 SSL 联接企图, host 记录可以匹配 SSL 和非 SSL 的联接企图, 但 hostssl 记录需要 SSL 联接。
数据库(database):声明记录所匹配的数据库。值 all 表明该记录匹配所有数据库, 值 sameuser表示如果被请求的数据库和请求的用户同名,则匹配。 samegroup 表示请求的用户必须是一个与数据库同名的组中的成员。 在其他情况里,这就是一个特定的 PostgreSQL 的名字。 我们可以通过用逗号分隔的方法声明多个数据库。 一个包含数据库名的文件可以 通过对该文件前缀 @ 来声明.该文件必需和 pg_hba.conf 在同一个目录。
用户名(user):为这条记录声明所匹配的 PostgreSQL 用户,值 all 表明它匹配 于所有用户。否则,它就是特定 PostgreSQL 用户的名字,多个用户名可以通过用逗号分隔的方法声明,组名字 可以通过用 + 做组名字前缀来声明。一个包含用户名的文件可以 通过在文件名前面前缀 @ 来声明,该文件必需和 pg_hba.conf 在同一个目录。
ip地址(ip-address)和 子网掩码(ip-mask):这两个字段包含标准的点分十进制表示的 IP地址/掩码值。 (IP地址只能用数字的方式声明,而不能用域名或者主机名)它们俩放在一起,声明了这条记录匹配的客户机的 IP 地址。 准确的逻辑是: (actual-IP-address xor IP-address-field) and IP-mask-field
对于要匹配的记录必需为零。如果连接方式是host或者hostssl的话,这两项必须指定,否则可以不填。
认证方法(authentication method):
trust
无条件地允许联接,这个方法允许任何可以与PostgreSQL 数据库联接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。
reject
联接无条件拒绝,常用于从一个组中"过滤"某些主机。
md5
要求客户端提供一个 MD5 加密的口令进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。
crypt
类似 md5 方法,只是用的是老式的 crypt 加密认证, 用于 7.2 以前的客户端,对于 7.2 以及以后的客户端,我们建议使用 md5。
password
和"md5"一样,但是口令是以明文形式在网络上传递的,我们不应该在不安全的网络上使用这个方式。
krb4
用 Kerberos V4 认证用户,只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos,"克尔波洛斯",故希腊神话冥王哈得斯的多头看门狗。Kerberos 是 MIT 开发出来的基与对称加密算法的认证协议和/或密钥 交换方法,其特点是需要两个不同用途的服务器,一个用于认证身份, 一个用于通道两端用户的密钥交换。同时 Kerberos 对网络时间同步 要求比较高,以防止回放攻击,因此通常伴随 NTP 服务。)
krb5
用 Kerberos V5 认证用户.只有在进行 TCP/IP 联接的时候才能用。(译注:Kerberos V5 是上面 V4 的改良,主要是不再依赖 DES 算法, 同时增加了一些新特性。)
ident
获取客户的操作系统名(对于 TCP/IP 联接,用户的身份是通过与运行在客户端上的 ident 服务器联接进行判断的,对于本地联接,它是从操作系统获取的。) 然后检查一下,看看用户是否允许以要求的数据库用户进行联接, 方法是参照在 ident 关键字后面声明的映射。
如果你使用了 sameuser 映射,那么假设用户名 是相等的。如果没有声明这个关键字,则在 $PGDATA/pg_ident.conf 文件中找出映射名。如果这个文件里包含一条记录标识着ident提供的用户名 和请求的 PostgreSQL 用户名的映射, 那么联接被接受。
对于本地联接,只有在系统支持Unix域套接字信任证的情况下 才能使用(目前是 Linux, FreeBSD, NetBSD, 和 BSD/OS)。
pam
使用操作系统提供的可插入的认证模块服务 (Pluggable Authentication Modules) (PAM)来认证。
1、无论在本地还是通过tcp/ip,任何人都可以不加任何限制的使用任何他想用的身份访问我的数据库
local all trust
host all 0.0.0.0 0.0.0.0 trust
2、所有的访问都使用了md5认证方法
local all md5
host all 0.0.0.0 0.0.0.0 md5
3、pgsql用户的认证方法必须为trust不要密码,其它的都用md5认证
local pgsql trust
local all md5
host all 0.0.0.0 0.0.0.0 md5
4、在随后的检测中我发现,虽然通过网络得到了保护,但是如果在本地通过Unix域套接字进行连接的话,任何人都还是可以使用`psql -U pgsql -d template1`的方式轻松的进入我的数据库,这样做显而易见不是我想要的结果,现在我需要unix_socket_permissions的协助,当我把这个项设置为0700以后,就只有套接字的所有人,即系统用户pgsql可以使用套接字进行连接,另外如果我的数据库有几个管理员需要最高权限的话,0770也是一个选择,不过暂时只有我一个管理员,所以我选择了0700,现在我的pg_hba.conf改变为:
local pgsql trust
host all 0.0.0.0 0.0.0.0 md5
结合了unix_socket_permissions以后,现在只有系统用户pgsql可以无任何限制的连接(当然,伟大的root例外),并且我也不用每次启动的时候都跑到终端前去输入一次密码了,而其他人只能通过网络连接,即使登录到了本地计算机上,其他用户也只能使用`psql -U xx -d template1 -h 127.0.0.1`的方式连接,这种连接是受到密码认证的保护的,这一切正是我想要的。
##############################################
数据库启动等命令
pg_ctl start [-w] [-s] [-D datadir] [-l filename] [-o options] [-p path]
pg_ctl stop [-W] [-s] [-D datadir] [-m s[mart] | f[ast] | i[mmediate] ]
pg_ctl restart [-w] [-s] [-D datadir] [-m s[mart] | f[ast] | i[mmediate] ] [-o options]
pg_ctl reload [-s] [-D datadir]
pg_ctl status [-D datadir]