|
作者:糊涂@Linuxsir.org
(这是本人的学习笔记,未完成,未勘误。如有谬误请指正,先此谢过!)
一、安装配置服务器:
服务器是一台放在机房里的服务器,我打算除了安装操作系统的时候直接在本机操作之外,其他操作一律从远程登录进行。
1、安装操作系统:openSUSE 10.3,安装为纯文本模式。为简洁起见,不必安装任何GUI相关包。为了编译PostgeSQL和pgAdmin III需要安装GNU C++。为了远程登录服务器,需要安装SSH服务。如果安装了防火墙(SuSEfirewall2),安装之后要首先用yast配置防火墙,打开SSH服务端口。为了方便,我还安装了screen。
初步安装配置完成后,测试一下ssh远程登录,成功后,服务器就可以放到机房里,以下的操作就都可以通过SSH远程登录服务器完成了。
另外,安装之后应配置安装源以备不时之需,因为安装操作系统时没仔细选择安装项,可能以后安装其他东西的时候会报一堆“XXXX找不到”之类的依赖性错误。我添加了三个安装源,一个是本地openSUSE的DVD光盘iso,一个是packman,一个是lizardsource.cn 。
2、然后就是创建PosgreSQL专用用户,手册上以用户名“postgres”为例,但你可以任意选择其他用户名。我使用yast创建,默认同时创建用户目录和必要的用户环境文件。创建后可见用户目录下有3个目录,没用,我把他们都干掉了。其他以“.”开头的隐藏目录和隐藏文件保留(其实也不是全都有用)。
3、配置防火墙:
为能够从远程连接这台服务器管理PosgreSQL,需要在防火墙中打开5432端口(这个端口可以随后在配置文件里按需修改指定,只要此处保持与配置文件一致即可);为方便远程用户登录管理服务器还应开放SSH服务(22端口);
4、安装PosgreSQL:
没什么特殊的。普通用户操作,先下载源码包postgresql-8.x.y.tar.bz2,解开到任意目录(tar xjvf postgresql-8.x.y.tar.bz2),然后进入解包目录,执行:
./configure --enable-nls=zh_CN --with-python --with-openssl --with-pam
我这里增加了四个编译选项
如果报缺其他软件包就先su成root用yast安装后再回来重新configure,直至成功。缺的包大部分是开发包。然后就是gmake,gmake install,完成。(gmake install需要su成root)。
这一部分手册里第3部分第14章第14.1节有个简版,可参考
-----------
以下开始数据库配置过程
-----------
5、创建数据库专用的操作系统用户
首先必须明确:数据库自己有一套用户和权限体系,与操作系统的用户权限体系无关。他们之间唯一有点关系的就是:当你试图访问数据库时,如果没有指定数据库用户名和数据库名,则postgresql以你当前的操作系统用户名作为默认的数据库用户名和数据库名尝试连接数据库,当然,如果二者任何一个实际上并不存在时会连接失败。
手册建议创建一个维护数据库专用的操作系统用户postgres,并且建议从属于postgres组。这个用户将成为数据库系统的超级用户。照做就是了,为什么我也不懂。不懂的先照做当无大碍。
其实,你可以任意指定或创建一个普通用户作为数据库的超级用户。
首先用yast创建postgres组和postgres用户,创建时选择“同时创建用户家目录”这个选项,如果用命令行方式则为:
# group add postgres
# useradd postgres -d /home/postgres -m -g users -G postgres
(以上两条需验证,-g和-G选项)
由于我通常习惯于只在用户家目录下工作,因此创建了postgres系统用户后,首先修改一下家目录下的.profile文件,在PATH环境变量中增加postgresql安装路径,即在文件中增加下列三行:
export PATH=$PATH:/usr/local/pgsql/bin
export MANPATH=$MANPATH:/usr/local/pgsql/man
export LD_LIBRARYPATH=$LD_LIBRARYPATH:/usr/local/pgsql/lib
6、初始化数据库目录:
一旦postgres系统超级用户创建完毕,就可以开始创建数据库系统了。postgresql要求在开始使用之前要先创建一个数据库目录。数据库目录是存放数据库的地方。
默认安装目录:/usr/local/pgsql
创建数据库目录:手册上的建议是/usr/local/pgsql,我是创建在postgres用户自己的家目录中,因此我的数据库目录是/home/postgres/db。
初始化数据库目录:
1)关于数据库初始化环境:
书上说:“缺省时,initdb 将会按照它的执行环境的区域设置初始化数据库集群”。由于我们通常都要(甚至主要)是处理中文信息,因此,在初始化数据库之前,首先修改环境:
postgres@dbhost $ export LANG=zh_CN.UTF-8
然后查看一下修改后的结果:
postgres@dbhost $ locale
*****屏幕输出*****
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
*****屏幕输出完*****
当然也可以不用在这里修改环境,而是在initdb命令行上用 --locale 选项指定。书上还介绍了指定locale的更复杂的方法,不赘,看书吧。
2)在postgres用户家目录下执行:
postgres@dbhost $ cd # 切换到家目录
postgres@dbhost $ initdb -D ./db --pwprompt -A md5
*****屏幕输出*****
属于此数据库系统的文件宿主为用户 "postgres".
此用户也必须为服务器进程的宿主.
数据库簇将带有 locale zh_CN.UTF-8 初始化.
默认的数据库编码已经相应的设置为 UTF8.
initdb: could not find suitable text search configuration for locale zh_CN.UTF-8
The default text search configuration will be set to "simple".
创建目录 ./db ... 成功
creating subdirectories ... 成功
选择默认最大联接数 (max_connections) ... 100
selecting default shared_buffers/max_fsm_pages ... 32MB/204800
创建配置文件 ... 成功
在 ./db/base/1 中创建 template1 数据库 ... 成功
initializing pg_authid ... 成功
输入新的超级用户口令:
再输入一遍:
设置口令 ... 成功
initializing dependencies ... 成功
创建系统视图 ... 成功
loading system objects' descriptions ... 成功
创建字符集转换 ... 成功
creating dictionaries ... 成功
对内建对象设置权限 ... 成功
创建信息模式 ... 成功
清理数据库 template1 ... 成功
拷贝 template1 到 template0 ... 成功
copying template1 to postgres ... 成功
Success. You can now start the database server using:
postgres -D ./db
or
pg_ctl -D ./db -l logfile start
*****屏幕输出完*****
注意到中间有一段英文信息:
initdb: could not find suitable text search configuration for locale zh_CN.UTF-8
The default text search configuration will be set to "simple".
以目前我的水平还不能对此作出解释。
7)编辑数据库服务器配置文件
接下来要为数据库服务器编辑配置文件postgresql.conf 和 pg_hba.conf,它们在你创建的数据库目录中。
postgresql.conf文件中的“CONNECTIONS AND AUTHENTICATION”部分是配置本机连接参数的地方,
listen_addresses = 'IP地址' # IP地址要放在单引号中。这个IP地址是指对你这台数据库服务器的访问从本机哪个IP进来,因此要指定一个本机IP,开始我是很困惑了一段时间。
port = 5432 # 这是你这台数据库服务器的连接端口,预设值是5432。注意,如果本机操作系统启动了防火墙,则防火墙要开放这个端口
以下为手册相关内容摘录:
---------摘录始--------
17.3.1. 连接设置
listen_addresses (string)
声明服务器监听客户端连接的 TCP/IP 地址。值是一个逗号分隔的主机名和/或数字 IP 地址。特殊项 * 对应所有可用 IP 接口。如果这个列表是空的,那么服务器不会监听任何 IP 接口,这种情况下,只有 Unix 域套接字可以用于连接数据库。缺省值 localhost 只允许进行本地"回环"连接。这个参数只能在服务器启动的时候设置。
port (integer)
服务器监听的 TCP 端口;缺省是 5432 。请注意同一个端口号用于服务器监听的所有 IP 地址。这个参数只能在服务器启动的时候设置。
---------摘录完--------
我只是简单地修改了这两处,将这两行前面的#号去掉,将监听地址设为服务器本机的IP地址,端口就用默认的5432,其他保持不变。
pg_hba.conf文件中设置哪些主机可以访问这个数据库服务器,每行说明一个允许来访主机的IP地址(段)。每行分为5个字段,字段之间用空白字符(空格,Tab字符)隔开。字段从左向右依次为:
TYPE:来访主机类型
DATABASE:允许访问的数据库
USER:允许来访的数据库用户名
CIDR-ADDRESS:IP地址/网络号
METHOD:认证方式
我的配置文件是这样的:
host postgres postgres 10.0.100.0/24 md5
host postgres postgres 172.16.1.0/24 md5
host abc postgres 10.0.100.0/24 md5
host abc postgres 172.16.1.0/24 md5
host abc pgadmin 10.0.100.0/24 md5
host abc pgadmin 172.16.1.0/24 md5
说明:
abc是我将要创建的用于项目开发的数据库名,pgadmin是我开发时用于操作abc的数据库普通用户名(在数据库里“用户”这个概念被“角色”所取代),10网段的IP地址是我在局域网里工作站所在的网段,172网段的IP地址是我通过VPN远程连接的公司局域网后所处的网段。
解释一下以上配置:
1)只有来自10.0.100.xxx和172.16.1.xxx这两个网段的连接请求可被接受,并且
2)上述请求中只有postgres和pgadmin这两个数据库用户的请求可被接受,并且
3)上述请求中只有对postgres和abc这两个数据库的请求可被接受,并且
4)上述请求中只有pgadmin对abc这一个数据库的访问请求可被接受,以及,postgres对postgres、abc这两个数据库的访问请求可被接受
再举例说明一下以上配置:
第五行记录:
host abc pgadmin 10.0.100.0/24 md5
这行记录表示:允许pgadmin用户从10.0.100.xxx这个网段连接访问abc这个数据库
8)启动、停止、重启数据库服务器
启动数据库服务必须以数据库专用系统用户身份,也就是上面的postgres用户身份。
postgres数据库服务器程序的名字是postgres,位于/usr/local/pgsql/bin(它还有个别名叫postmaster,手册里说:“反对使用”。OK,那我们别用就是了)。启动数据库服务就是以postgres用户身份运行这个程序。它有很多命令行选项,还有上述postgres.conf和pg_hba.conf两个配置文件以及一堆环境变量配合使用,详见手册吧,反正我是看得头大。
系统还提供了一个上述程序的封装:pg_ctl,大概是为了简化命令行输入。由于我是个超级懒人,所以我在postgers家目录下建了个简单脚本,内容如下:
#! /bin/sh
echo 'start or reload or stop'
pg_ctl -D ./db $1 2>&1 >>pglog
脚本文件名为 p ,加上可执行属性即可。现在启动数据库服务:
postgres@dbhost $ ./p start
屏幕上除了一行“start or reload or stop”之外,没有任何输出,即使报错也不会有输出,所有屏幕输出信息都在postgres用户家目录下的pglog文件中,这就是脚本中“2>&1 >>pglog”的作用,这样做目的是为了便于追踪操作记录。
要停止数据库服务:
postgres@dbhost $ ./p stop
如果修改了配置文件需要重启数据库服务才能生效:
postgres@dbhost $ ./p reload
9)连接数据库
现在就可以以数据库超级用户身份连接数据库服务器了
*****屏幕输出*****
postgres@dbhost $ psql postgres
密码:
欢迎来到 psql 8.3.5,这是 PostgreSQL 互动式文字终端机。
键入: \copyright 显示发行条款
\h 显示 SQL 命令的说明
\? 显示 pgsql 命令的说明
\g 或者以分号(;)结尾以执行查询
\q 退出
postgres=#
*****屏幕输出完*****
二、安装管理端客户机:
一台笔记本电脑,用于远程登录服务器,实现除安装操作系统之外的其他所有管理工作
1、操作系统:我也用的是openSUSE 10.3,GUI用SUSE自带的KDE 3.5,这个纯属个人习惯而已。
2、客户端管理工具pgAdmin III 官方下载:http://www.postgresql.org/ftp/pgadmin3/release/v1.8.4/opensuse/
我首次安装是源码编译安装的1.8.1,后来用rpm包升级为1.8.4。编译安装过程没什么难点,rpm升级就更简单了。不赘。
3、pgAdmin III
详细的没有,先简单写几条。
1)[color="Red"]注意:如果你在创建数据库连接项时勾选了“保存口令”,pgAdmin III会将数据库登录用户的口令以[color="Red"]明文保存在~/.pgpass这个文件中。请[color="Blue"]自行斟酌是否存在安全性隐患
2)如果你像我一样总是远程登录数据库,连接期间应[color="#ff0000"]确保网络连接不要断掉,尤其是对数据库作较长时间的查询操作时。如果操作返回结果前断网,将造成pgAdmin III及其所有打开的子窗口死掉,而服务器端的登录连接子进程不会自动中止(断开)从而变成死连接。对于这样的“死连接”,我是ssh登录到服务器上用htop将子进程kill掉(先kill 15,不行就kill 2,再不行 kill 9——参阅手册16.5节<v8.2.3>)。
(注:我在家里用VPN连接到单位里的服务器,VPN很有规律地每5分27秒断一次,而windows一点儿都没事儿,即使是虚拟机的windows也不断,超级郁闷)
三、使用:
(待续)
四、(扩展)安装psycopg2(PostgreSQL的Python访问接口)
进入解包后的目录,安装命令:
postgres@dbhost $ python setup.py install
如果系统要求安装mxDatetime组件,会显示:
*****屏幕输出*****
error: psycopg requires a datetime module:
error: mx.DateTime module not found
error: python datetime module not found
error: Note that psycopg needs the module headers and not just the module
error: itself. If you installed Python or mx.DateTime from a binary package
error: you probably need to install its companion -dev or -devel package.
*****屏幕输出完*****
此时应该搜索安装egenix-mx-base这个包,Packman的源里就有,注意一定要把开发包选中装上
安装后还可能setup失败,尝试编辑setup.cfg文件,找到了下面这部分:
# If the build system does not find the mx.DateTime headers, try
# uncommenting the following line and setting its value to the right path.
#mx_include_dir=
yast查看mxDateTime头文件的安装位置:
/usr/lib/python2.5/site-packages/mx/BeeBase/mxBeeBase/mxBeeBase.h,
/usr/lib/python2.5/site-packages/mx/BeeBase/mxBeeBase/btr.h,
/usr/lib/python2.5/site-packages/mx/BeeBase/mxBeeBase/mxh.h,
/usr/lib/python2.5/site-packages/mx/DateTime/mxDateTime/mxDateTime.h,
/usr/lib/python2.5/site-packages/mx/DateTime/mxDateTime/mxh.h,
/usr/lib/python2.5/site-packages/mx/Proxy/mxProxy/mxProxy.h,
/usr/lib/python2.5/site-packages/mx/Proxy/mxProxy/mxh.h,
/usr/lib/python2.5/site-packages/mx/Queue/mxQueue/mxQueue.h,
python-egenix-mx-base-devel== 3.1.1-0.pm.1,
/usr/lib/python2.5/site-packages/mx/Queue/mxQueue/mxh.h,
/usr/lib/python2.5/site-packages/mx/Stack/mxStack/mxStack.h,
/usr/lib/python2.5/site-packages/mx/Stack/mxStack/mxh.h,
/usr/lib/python2.5/site-packages/mx/TextTools/mxTextTools/mxTextTools.h,
/usr/lib/python2.5/site-packages/mx/TextTools/mxTextTools/mxbmse.h,
/usr/lib/python2.5/site-packages/mx/TextTools/mxTextTools/mxh.h,
/usr/lib/python2.5/site-packages/mx/Tools/mxTools/mxTools.h,
/usr/lib/python2.5/site-packages/mx/Tools/mxTools/mxh.h,
/usr/lib/python2.5/site-packages/mx/UID/mxUID/mxUID.h,
/usr/lib/python2.5/site-packages/mx/UID/mxUID/mxh.h,
/usr/lib/python2.5/site-packages/mx/URL/mxURL/mxURL.h,
/usr/lib/python2.5/site-packages/mx/URL/mxURL/mxh.h
把mxDateTime.h的路径加入setup.cfg文件:
即把
#mx_include_dir=
这行改为:
mx_include_dir=/usr/lib/python2.5/site-packages/mx
又报错:
running install
error: invalid Python installation: unable to open /usr/lib/python2.5/config/Makefile (No such file or directory)
见鬼!
解决:安装python-devel包
还报错!我倒!
python setup.py install
running install
running build
running build_py
running build_ext
Warning: /bin/sh: pg_config: command not found
building 'psycopg2._psycopg' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -O2 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -g -fPIC -DPY_MAJOR_VERSION=2 -DPY_MINOR_VERSION=5 -DHAVE_PYBOOL=1 -DHAVE_DECIMAL=1 -DHAVE_MXDATETIME=1 -DHAVE_PYDATETIME=1 -DPSYCOPG_DEFAULT_PYDATETIME=1 -DPSYCOPG_VERSION="2.0.8 (dec mx dt ext pq3)" -DPSYCOPG_EXTENSIONS=1 -DPSYCOPG_NEW_BOOLEAN=1 -DHAVE_PQFREEMEM=1 -DHAVE_PQPROTOCOL3=1 -I/usr/lib/python2.5/site-packages/mx -I/usr/include/python2.5 -I. -c psycopg/psycopgmodule.c -o build/temp.linux-i686-2.5/psycopg/psycopgmodule.o
In file included from psycopg/psycopgmodule.c:28:
./psycopg/psycopg.h:27:22: error: libpq-fe.h: 没有那个文件或目录
In file included from psycopg/psycopgmodule.c:28:
./psycopg/psycopg.h:146: error: expected declaration specifiers or ‘...’ before ‘PGconn’
In file included from psycopg/psycopgmodule.c:29:
./psycopg/connection.h:62: error: expected specifier-qualifier-list before ‘PGconn’
In file included from psycopg/psycopgmodule.c:30:
./psycopg/cursor.h:57: error: expected specifier-qualifier-list before ‘PGresult’
In file included from psycopg/psycopgmodule.c:31:
./psycopg/lobject.h:27:28: error: libpq/libpq-fs.h: 没有那个文件或目录
In file included from psycopg/psycopgmodule.c:31:
./psycopg/lobject.h:47: error: expected specifier-qualifier-list before ‘Oid’
./psycopg/lobject.h:53: error: expected declaration specifiers or ‘...’ before ‘Oid’
./psycopg/lobject.h:53: error: expected declaration specifiers or ‘...’ before ‘Oid’
psycopg/psycopgmodule.c:44:24: error: mxDateTime.h: 没有那个文件或目录
psycopg/psycopgmodule.c:46: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
psycopg/psycopgmodule.c: In function ‘psyco_register_type’:
psycopg/psycopgmodule.c:249: error: ‘cursorObject’ has no member named ‘string_types’
psycopg/psycopgmodule.c:252: error: ‘connectionObject’ has no member named ‘string_types’
psycopg/psycopgmodule.c: In function ‘psyco_adapters_init’:
psycopg/psycopgmodule.c:289: error: ‘mxDateTimeP’ undeclared (first use in this function)
psycopg/psycopgmodule.c:289: error: (Each undeclared identifier is reported only once
psycopg/psycopgmodule.c:289: error: for each function it appears in.)
psycopg/psycopgmodule.c: In function ‘init_psycopg’:
psycopg/psycopgmodule.c:737: warning: implicit declaration of function ‘mxDateTime_ImportModuleAndAPI’
psycopg/psycopgmodule.c:742: error: ‘mxDateTimeP’ undeclared (first use in this function)
psycopg/psycopgmodule.c:742: error: ‘mxDateTime’ undeclared (first use in this function)
error: command 'gcc' failed with exit status 1
解决:
找到第一行报错信息:libpq-fe.h: 没有那个文件或目录,yast查找libpq,果然libpq-xx包没装,装之
也没用!
再改mxDatetime路径:
mx_include_dir=/usr/lib/python2.5/site-packages/mx/DateTime/mxDateTime
再装:
postgres@dbhost $ python setup.py install
running install
running build
running build_py
running build_ext
building 'psycopg2._psycopg' extension
gcc -pthread ......
下面是整屏的gcc信息......喜!
......
还是高兴太早了......
......
running install_lib
creating /usr/local/lib/python2.5
error: could not create '/usr/local/lib/python2.5': Permission denied
postgres@dbhost $
唉!烦了!不再细想,直接干吧:
postgres@dbhost $ su
口令:
postgres@dbhost $ # python setup.py install
running install
running build
running build_py
running build_ext
running install_lib
creating /usr/local/lib/python2.5
creating /usr/local/lib/python2.5/site-packages
creating /usr/local/lib/python2.5/site-packages/psycopg2
copying build/lib.linux-i686-2.5/psycopg2/tz.py -> /usr/local/lib/python2.5/site-packages/psycopg2
copying build/lib.linux-i686-2.5/psycopg2/extras.py -> /usr/local/lib/python2.5/site-packages/psycopg2
copying build/lib.linux-i686-2.5/psycopg2/extensions.py -> /usr/local/lib/python2.5/site-packages/psycopg2
copying build/lib.linux-i686-2.5/psycopg2/psycopg1.py -> /usr/local/lib/python2.5/site-packages/psycopg2
copying build/lib.linux-i686-2.5/psycopg2/pool.py -> /usr/local/lib/python2.5/site-packages/psycopg2
copying build/lib.linux-i686-2.5/psycopg2/__init__.py -> /usr/local/lib/python2.5/site-packages/psycopg2
copying build/lib.linux-i686-2.5/psycopg2/_psycopg.so -> /usr/local/lib/python2.5/site-packages/psycopg2
copying build/lib.linux-i686-2.5/psycopg2/errorcodes.py -> /usr/local/lib/python2.5/site-packages/psycopg2
byte-compiling /usr/local/lib/python2.5/site-packages/psycopg2/tz.py to tz.pyc
byte-compiling /usr/local/lib/python2.5/site-packages/psycopg2/extras.py to extras.pyc
byte-compiling /usr/local/lib/python2.5/site-packages/psycopg2/extensions.py to extensions.pyc
byte-compiling /usr/local/lib/python2.5/site-packages/psycopg2/psycopg1.py to psycopg1.pyc
byte-compiling /usr/local/lib/python2.5/site-packages/psycopg2/pool.py to pool.pyc
byte-compiling /usr/local/lib/python2.5/site-packages/psycopg2/__init__.py to __init__.pyc
byte-compiling /usr/local/lib/python2.5/site-packages/psycopg2/errorcodes.py to errorcodes.pyc
running install_egg_info
Writing /usr/local/lib/python2.5/site-packages/psycopg2-2.0.8-py2.5.egg-info
postgres@dbhost # exit
postgres@dbhost $
总算装完了。验证一下:
(待续) |
|