Kozupon.com    
 
 PostgreSQL7.1.3のインストール(source版)!


PostgreSQLは、機能も拡張され広く使われるようになってきた。インストールについては色々なサイトで紹介しているが、老齢の小生はいつものようにすぐ忘れるのでメモ書きしておく。インストールはLinuxでもFreeBSDでもさほど変わりはないが、今回はFreeBSDでのインストールとした。
まあ、FreeBSDの場合はPortsでやっつければ早いのですが、あえてSourceインストールを紹介する(特に理由なしです)。

注:古いFreeBSD(4.xx系)でPostgreSQL7をインストールする場合、Shared Shared Memory(共有メモリ)機能が必要となる。したがって、あらかじめ、共有メモリ機能を有効にするためにkernelのコンフィグレーションファイルに以下のオプションを記述してカーネルの再構築を行ってほしい。

options SYSVSHM         #SYSV-style shared memory
options SYSVMSG         #SYSV-style message queues
options SYSVSEM         #SYSV-style semaphores

さらに、このオプションで再構築しても最終的にinitdbもしくはpostmaster起動時に、

Shared Memory Error

が出るときは、optionsパラメータのMemory領域を数値で設定してやる必要がある。その後もう一度カーネルの再構築を行う!(特に、レガシーノートPCなどはメモリ容量が小さいのでErrorが起きやすいです、はい!)


1.まずは、ソースのダウンロード

ソースのダウンロードは、 ここ のミラーサイトで行う。

ここでは、postgresql-7.1.3.tar.gzをダウンロード。


2.インストール

1) インストールする前の準備

■ あらかじめセットアップされている事が前提のモジュール
gmake(3.75以上)
gcc(2.7.2以上)
bison
flex(2.5.4以上)
patch

■ postgresユーザを作る
PostgreSQLの最高権限であるpostgresユーザとpostgresグループを作成する。インストールもこのユーザの権限で行うため必ず作ること。

# pw useradd postgres

/stand/sysinstallでユーザとグループを追加しても良い。

■ ソースディレクトリとインストールディレクトリを作る
あらかじめ、ソースディレクトリとインストールディレクトリを作成する。

# mkdir /usr/local/pgsql

# chown postgres:postgres /usr/local/pgsql

# chown postgres:postgres /usr/local/src

2)ファイルの展開

とりあえず、/tmpあたりにpostgresql-7.1.3.tar.gzを置いたことにして説明する。
postgresユーザにスイッチ。

# su - postgres

$ cd /usr/local/src

$ tar -zxvf /tmp/postgresql-7.1.3.tar.gz

3)コンパイル

■ 本体のインストール

$ cd postgresql-7.1.3

$ ./configure --enable-multibyte=EUC_JP --enable-syslog

エラーがなければ、

$ make all

エラーがなければ、

$ make install

■ マニュアルのインストール

$ cd doc

$ make install

4)環境変数とコマンドサーチパスを作る

postgresユーザの.profileに環境変数とコマンドサーチパスを追加する。
( 今回は、bashの場合で説明する。csh場合はそれなりに書いてください(ーー;) )

$ cd ~/
$ vi .profile

PATH="$PATH":/usr/local/pgsql/bin
export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export LD_LIBRARY_PATH="LD_LIBRARY_PATH":"$PGLIB"

追加編集後、設定を反映させる。

$ source .profile

5)データベースの初期化

コンパイル後、データベースを初期化する(Postgres権限で)。

$ initdb

This database system will be initialized with username "postgres".
This user will own all the data files and must also own the server process.

Creating directory /usr/local/pgsql/data
Creating directory /usr/local/pgsql/data/base
Creating directory /usr/local/pgsql/data/global
Creating directory /usr/local/pgsql/data/pg_xlog
Creating template1 database in /usr/local/pgsql/data/base/1
DEBUG: database system was shut down at 2003-03-09 12:27:16 JST
DEBUG: CheckPoint record at (0, 8)
DEBUG: Redo record at (0, 8); Undo record at (0, 8); Shutdown TRUE
DEBUG: NextTransactionId: 514; NextOid: 16384
DEBUG: database system is in production state
Creating global relations in /usr/local/pgsql/data/global
DEBUG: database system was shut down at 2003-03-09 12:27:47 JST
DEBUG: CheckPoint record at (0, 108)
DEBUG: Redo record at (0, 108); Undo record at (0, 0); Shutdown TRUE
DEBUG: NextTransactionId: 514; NextOid: 17199
DEBUG: database system is in production state
Initializing pg_shadow.
Enabling unlimited row width for system tables.
Creating system views.
Loading pg_description.
Setting lastsysoid.
Vacuuming database.
Copying template1 to template0.

Success. You can now start the database server using:

/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
or
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start

少々、時間がかかるかも特に遅いPCは。。。。。
注:Shared Memory Errorに注意!


3.データベース起動

いよいよ、データベースを起動する。データベースの起動は、postmasterコマンドで行う。

$ postmaster -i -S &

注:Shared Memory Errorに注意!
コマンドラインからだと"&"を入れないと、常駐しないので気を付けること。
エラーが無ければ成功!
一応、プロセスを確認する。

$ ps axw

PID TTY STAT TIME COMMAND
523 ? S 0:00 postmaster -i -S
18658 pts/0 S 0:00 -bash
18735 pts/0 R 0:00 ps -axw
18736 pts/0 R 0:00 -bash

後は、createuserでユーザを追加したり、createdbでデータベースを作ったり自由にやってくださいまし!


4.起動スクリプトを作る

毎回、postmasterを実行するのも何なので、起動スクリプトを作る。
/usr/local/etc/rc.dにpgsql.shファイルを作って、そこにスクリプトを書いても良いが、今回は/etc/rcに直書きを前提に説明する( 実は小生が直書きなので。。。(ーー;) )。

$ exit

# cd /etc

# vi rc

以下の項目を追加する。
-iパラメータを追加しないと、ネット越しのDBコネクトが出来ないので注意!

# Postgresql Start

rm -f /tmp/.s.PGSQL.5432
if [ -x /usr/local/pgsql/bin/postmaster ]; then
su postgres -c "/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data -S -i"
fi

注:正式には、以下のようなStart・StopShellScriptを個別に作って起動する方が望ましいが、小生はこれでやっている。ご承知願いたい!

■ FreeBSDの場合

# vi /usr/local/etc/rc.d/pgsql.sh
#!/bin/sh
case $1 in
start)
[ -d /usr/local/pgsql/lib ] && /sbin/ldconfig -m /usr/local/pgsql/lib
[ -x /usr/local/pgsql/bin/pg_ctl ] && {
if [ -f /tmp/.s.PGSQL.5432 ]; then
rm /tmp/.s.PGSQL.5432
fi
su - postgres -c \
'exec /usr/local/pgsql/bin/pg_ctl start -w -D /usr/local/pgsql/data -l /usr/local/pgsql/errlog'
echo -n 'pgsql'
}
;;

stop)
[ -x /usr/local/pgsql/bin/pg_ctl ] && {
su - postgres -c 'exec /usr/local/pgsql/bin/pg_ctl stop -W -D /usr/local/pgsql/data -m fast'
}
;;

status)
[ -x /usr/local/pgsql/bin/pg_ctl ] && {
su -l pgsql -c 'exec /usr/local/pgsql/bin/pg_ctl status -D /usr/local/pgsql/data'
}
;;

*)
echo "usage: `basename $0` {start|stop|status}" >&2
exit 64
;;
esac

■ Linux(RHL系)の場合

[VFS-root@web2 init.d]# vi pgsql
#! /bin/sh

# chkconfig: 2345 20 20
# description: Postgresql Script

# Source function library.
. /etc/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
prefix=/usr/local/pgsql
PGDATA="/usr/local/pgsql/data"
PGUSER=postgres
PGLOG="$PGDATA/serverlog"
DAEMON="$prefix/bin/pg_ctl"

if echo '\c' | grep -s c >/dev/null 2>&1 ; then
ECHO_N="echo -n"
ECHO_C=""
else
ECHO_N="echo"
ECHO_C='\c'
fi

set -e
test -f $DAEMON || exit 0

case $1 in
start)
if [ -f /tmp/.s.PGSQL.5432 ]; then
rm /tmp/.s.PGSQL.5432
fi
$ECHO_N "Starting PostgreSQL: "$ECHO_C
su - $PGUSER -c "$DAEMON start -D '$PGDATA' -s -l $PGLOG"
echo "ok"
;;
stop)
echo -n "Stopping PostgreSQL: "
su - $PGUSER -c "$DAEMON stop -D '$PGDATA' -s -m fast"
echo "ok"
;;
restart)
echo -n "Restarting PostgreSQL: "
su - $PGUSER -c "$DAEMON restart -D '$PGDATA' -s -m fast -l $PGLOG"
echo "ok"
;;
reload)
echo -n "Reload PostgreSQL: "
su - $PGUSER -c "$DAEMON reload -D '$PGDATA' -s"
echo "ok"
;;
status)
su - $PGUSER -c "$DAEMON status -D '$PGDATA'"
;;
*)
# Print help
echo "Usage: $0 {start|stop|restart|reload|status}" 1>&2
exit 1
;;
esac

exit 0

■ Linux(Debian系)の場合

[VFS-root@web2 init.d]# vi pgsql
#! /bin/sh

prefix=/usr/local/pgsql
PGDATA="/usr/local/pgsql/data"
PGUSER=postgres
DAEMON="$prefix/bin/postmaster"

if echo '\c' | grep -s c >/dev/null 2>&1 ; then
ECHO_N="echo -n"
ECHO_C=""
else
ECHO_N="echo"
ECHO_C='\c'
fi

set -e
test -f $DAEMON || exit 0

case $1 in
start)
if [ -f /tmp/.s.PGSQL.5432 ]; then
rm /tmp/.s.PGSQL.5432
fi
$ECHO_N "Starting PostgreSQL: "$ECHO_C
su - $PGUSER -c "$DAEMON -D '$PGDATA' -S -i"
echo "ok"
;;
stop)
echo -n "Stopping PostgreSQL: "
su - $PGUSER -c "killall $DAEMON"
echo "ok"
;;
restart)
echo -n "Restarting PostgreSQL: "
su - $PGUSER -c "killall $DAEMON"
sleep 5
su - $PGUSER -c "$DAEMON -D '$PGDATA' -S -i"
echo "ok"
;;
*)
# Print help
echo "Usage: $0 {start|stop|restart}" 1>&2
exit 1
;;
esac

exit 0


5.その他、これだけはやっておいた方が良いこと

起動まで出来たわけだが、今後のためにこれだけはやっておこう!

1)nobodyユーザの登録

WebベースのスクリプトからDBコネクトする場合に、nobodyユーザ権限でDBにアクセスするのでDBにユーザ登録を行う。postgresユーザ権限で、

$ createuser nobody

で問い合わせには、全て"no"で答える。

注:ApacheのユーザがWWWユーザの場合は、このユーザを作るようにする。

2)アクセス制御

PostgreSQLは、デフォルトで外部ホストからのアクセスを拒否する設定になっている。
したがって、ローカルアドレスのホストからのアクセスは許可してあげなければならない。
それには、以下のようにpg_hba.confで設定する。

$ cd /usr/local/pgsql/data

$ vi pg_hba.conf

例えば、ネットワークアドレス192.168.0.0に所属するホストを全てアクセス許可したければ、

host  all  192.168.0.0  255.255.255.0  trust

を追加してやればよい。

3)動作テストを行う!

最後に動作テストを行ってみよう!PostgreSQLには、regression testというのがある。
実行すると、自動的にテストを行ってくれる。以下に説明する。

$ cd /usr/local/src/postgresql-7.1.3/src/test/regress

$ make all runtest


途中略

test text ... ok
test int2 ... ok
test int4 ... ok
test int8 ... ok
test oid ... ok
test float4 ... ok
test float8 ... ok
test bit ... ok
test numeric ... ok
test strings ... ok
test numerology ... ok
test point ... ok
test lseg ... ok
test box ... ok
test path ... ok
test polygon ... ok
test circle ... ok
test date ... ok
test time ... ok
test timestamp ... ok
test interval ... ok
test abstime ... ok
test reltime ... ok
test tinterval ... ok
test inet ... ok
test comments ... ok
test oidjoins ... ok
test type_sanity ... ok
test opr_sanity ... ok
test geometry ... ok
test horology ... ok
test create_function_1 ... ok
test create_type ... ok
test create_table ... ok
test create_function_2 ... ok
test copy ... ok
test constraints ... ok
test triggers ... ok
test create_misc ... ok
test create_aggregate ... ok
test create_operator ... ok
test create_index ... ok
test inherit ... ok
test create_view ... ok
test sanity_check ... ok
test errors ... ok
test select ... ok
test select_into ... ok
test select_distinct ... ok
test select_distinct_on ... ok
test select_implicit ... ok
test select_having ... ok
test subselect ... ok
test union ... ok
test case ... ok
test join ... ok
test aggregates ... ok
test transactions ... ok
test random ... ok
test portals ... ok
test arrays ... ok
test btree_index ... ok
test hash_index ... ok
test misc ... ok
test select_views ... ok
test alter_table ... ok
test portals_p2 ... ok
test rules ... ok
test foreign_key ... ok
test limit ... ok
test plpgsql ... ok
test temp ... ok

======================
All 76 tests passed.
======================

rm regress.o

成功すると、上記のようなメッセージが出て終了する。

以上


 
 
 



Copyright 2007 Kozupon.com.