关于postgresql的安装与实用
好久没有使用Postgresql了,今天参考网上的资料进行整理。
系统环境为Ubuntu 11.10 server。
安装
各个平台都有丰富的安装手册,详细可以在google里面搜索。这里是debian上安装 方式,ubuntu类似:
aptitude install postgresql # 这个是数据库aptitude install pgadmin3 # 这个是GUI界面的管理工具
这里debian机器(172.16.70.175)是我笔记本,我是需要一个pgadmin3,然后在实 验机器(fedora系统,172.16.70.254)上安装了postgresql。
# rpm -qa|grep postgresql postgresql-libs-8.3.7-1.fc10.i386 postgresql-8.3.7-1.fc10.i386 postgresql-server-8.3.7-1.fc10.i386
在Ubuntu中只需要sudo apt-get install postgresql就饿可以了。sudo apt-get install postgresql-9.1-postgis postgis可以帮助安装上postGIS.
初始化配置
postgresql的用户和系统用户是分开的,我们需要初始化数据库,设置数据库的用 户,配置postgresql的访问权限。
设置密码
如果是在debian/ubuntu,或者fedora这些系统上使用deb或rpm包安装的,都会建立 好postgres用户。我们需要以这个用户权限运行psql命令设置postgres用户密码:
# su postgres -c psql template1 欢迎来到psql 8.3.7,这是PostgreSQL 互动式文字终端机。 键入:\copyright 显示发行条款\h 显示SQL 命令的说明\? 显示pgsql 命令的说明\g 或者以分号(;)结尾以执行查询\q 退出postgres=# ALTER USER postgres with password 'abc123'; ALTER ROLE postgres=# \q
上面abc123就是我们设置的密码。
创建数据库
su postgres -c createdb mydb
配置远程链接
1. 首先看看防火墙是否开启,如果开启需要允许5432端口的联通。如不知怎样配置 防火墙,就关闭它。
$sudo ufw allow 5432
2. 配置postgresql.conf文件,这个文件在数据库pgsql目录下的data目录里。我在fedora上现在的地方是/var/lib/pgsql/data/postgresql.conf。
listen_addresses = '*' #把这句的注释去掉,'*' 号表示监听所有网络地址的链接
注:Ubunt的配置文件比较规整,存储在/etc/postgresql/下。
3. 配置pg_hba.conf文件,通常和postgresql.conf文件在同一个目录下:
host all all 172.16.70.175 255.255.252.0 md5 # 我在最后加上了这一句# 我的笔记本IP是175, netmask是255.255.252.0 # 这里和我同一网段的机器都以链接
如果开放一段host all all 172.16.70.0/24 md5.参考http://wiki.postgresql.org/wiki/9.1%E7%AC%AC%E5%8D%81%E4%B9%9D%E7%AB%A0,理解各字段含义。
-----------------------------------------------------------
关于客户端认证
当一个客户端应用连接数据库服务器的时候,它需要指定将以哪个PostgreSQL数据库的用户名进行连接,就像我们用指定的用户去登陆一台Unix。在SQL环境中,活跃的数库用户名确定了数据库对象的访问权限--请参阅第二十章获取更多的信息。因此,我们只需要限制用户可以连接的数据库。
注意:正如在第二十章所述,PostgreSQL其实是用角色进行权限管理,在这一章节,我们用从数据库用户的角度来讲“角色的登录权限”。
认证是数据库服务器建立客户端的标识,然后通过某种方法确定是否允许客户端应用(或者说是运行这个客户端应用的用户)能否用请求的用户名进行连接。PostgreSQL提供许多不同的客户端认证方式。认证某个特定客户端联接所使用的方法可以通过基于(客户端)的主机地址,数据库和用户的方式进行选择。PostgreSQL数据库用户名在逻辑上是和我们运行这个数据库服务器的操作系统的用户名是相互独立的。如果某个服务的所有用户在其他有这个服务的机器上也有帐号,那么给数据库用户赋与操作系统用户名是有意义的。不过,一个接受远程连接的服务器上可能有许多数据库用户但是在本地操作系统上没有的同名的账户,在这种情况下数据库用户和操作系统用户名之间不必有任何联系。
pg_hba.conf文件
客户端认证是由一个配置文件控制的,通常文件名为pg_hba.conf并且存放在数据库集群的数据目录中。(HBA 的意思是host-based authentication:基于主机的认证。当用initdb命令初始化一个数据目录的时候,pg_hba.conf将被缺省安装。不过,我们也可以将认证文件放到其他地方;参阅hba_file配置参数.
pg_hba.conf文件的一般格式是每一行一条记录,空行将被忽略,在#符后的文字都将注释掉。记录不能跨行。一条记录是由若干用空格和/或tab 分隔的字段组成。如果字段用引号包围。引用了数据库里的关键字例,用户或者地址字段(例如:其他所有的或者复制)将会失去他们特殊的含义,只是和数据库里的用户和主机同名而已。 每一个记录都指定了一个连接类型,一个客户端IP范围(如果和连接类型相关),一个数据库名,一个用户名,以及匹配这些连接参数的认证方法。拥有连接类型,客户端IP地址,请求连接的数据库名和用户名的第一条记录将会被执行认证。这个过程没有“跨越”和“回头”的说法;如果选择了一条记录并且认证失败,那么将不会考虑后面的记录。如果没有记录匹配,访问将会被禁止。
每条记录可以是以下七种格式之一:
local database user auth-method [auth-options] host database user address auth-method [auth-options] hostssl database user address auth-method [auth-options] hostnossl database user address auth-method [auth-options] host database user IP-address IP-mask auth-method [auth-options] hostssl database user IP-address IP-mask auth-method [auth-options] hostnossl database user IP-address IP-mask auth-method [auth-options]
各个字段的含义如下:
local
这个记录匹配通过unix套接字的进行的连接请求。没有这种类型的记录,unix套接字连接将会被禁止。
host
这个记录匹配通过TCP/IP的进行的连接请求。host记录匹配SSL或者非SSL的连接 注意:除非服务器带着合适的listen_addresses 配置参数值启动,否则远程的TCP/IP将不能连接。因为缺省只监听本地回环地址localhost的TCP/IP连接。
hostssl
这个记录匹配通过TCP/IP进行的连接请求,但是只能使用SSL加密进行连接。要用这个选项,服务器必须要支持SSL。此外,当服务器启动的时候必须通过设置将SSL启用(参阅Section 17.9获取更多信息)
hostnossl
这个记录刚好与hostssl的逻辑相反;它只能匹配用TCP/IP但是不用SSL的连接。
database
指定记录匹配的数据库名。值all将匹配所有的数据库。值sameuser表示如果请求连接的数据库名和用户名相同,则匹配。值samegroup表示请求的用户必须是与数据库同名的组中的成员。(samegropu是一个过时的参数但是samerole的拼写方式仍旧被接受)。值replication表示如果一个replication的连接被请求,则匹配(注意:replication连接不需要指定任何特定的数据库)。在其他情况下,这就是一个特定的PostgreSQL 数据库的名字。我们可以通过用逗号分隔的方法声明多个数据库。一个包含数据库名的文件可以通过对在该文件前加@来声明。
user
为这条记录声明所匹配的PostgreSQL用户。值all表示匹配所有用户。否则,它就是特定的数据库用户的名字,组名字可以通过用+ 做组名字前缀来声明.(在PostgreSQL中这些并不是用户和组的真正区别;a+标识真实的意思是:“匹配任意一个在这个角色中直接的或者间接的成员”,当角色的名字没有用a+来表示,那么它只匹配这一个角色。)多个用户名只可以可以用逗号隔开。一个包含用户名的文件可以通过对在该文件前加@来声明。
address
声明这条记录匹配的客户端机器的地址。这个字段可以包含一个主机名、一个IP地址范围或者下面提到的特殊关键字。
一个IP地址是一个标准的CIDR 掩码长度的点分十进制的数。掩码长度表示客户端IP 地址必须匹配的高位二进制位数。在给出的IP 地址里,这个长度的右边的二进制位必须为零。在IP 地址,/,和CIDR 掩码长度之间不能有空白。
一个IP地址范围的典型例子可以用这种方法表示:172.20.143.89/32,这表示一个主机,或者用172.20.143.0/24表示一个小型网段,或者用10.6.0.0/16来表示一个大型网段。0.0.0.0/0表示所有IPV4的地,::/0表示所有IPV6的地址。要声明一个主机,给IPv4 地址声明CIDR 掩码32,给IPv6 地址声明128。在网络地址中,不要在尾部省略零点。
以IPv4 格式给出的IP地址会匹配那些拥有对应地址的IPv6 连接。例如:127.0.0.1将匹配IPV6的地址::ffff:127.0.0.1.以IPV6格式给出的地址只能匹配IPV6的连接,即使对应的地址在IPv4-in-IPv6 范围内。请注意如果系统的C类库不支持IPV6的地址,那么所有IPV6的连接将会被拒绝。 你也可以写成all来匹配所有IP地址。samehost值将匹配该服务器自己拥有的任意一个IP地址,或者用samenet值来匹配在这个服务器连接的网段里的任意一个IP地址。 如果声明一个主机名(不是一个IP地址或者一个将要指定的一个关键字作为主机名),该名称是相对于一个客户端的IP地址反向名称解析的结果(例如:DNS解析,如果DNS被启用)。主机名不区分大小写。如果记录被匹配,那么,在这个主机上将会主机名进行正解析(例如:DNS正解析),然后检查解析的地址是否和客户端的IP地址相同。如果两者匹配,那么这个记录将被匹配。(在pg_hba.conf文件中的主机名应当是这样一个名字:客户端IP用address-to-name解析返