TomnekoSoft.com

Backend blog for TomnekoSoft.com


PostgreSQL

PostgreSQL-7.0.2 のインストール

PostgreSQL-7.0.2 のインストール


一部加筆修正。(2000/11/06)

外部キーの実装されたフリーRDBMS PostgreSQL


 第一回目にうちにはLinuxマシンがないと書いてから半年以上が経ちました。この間に、我が家のPCは一台増えて3台となり、増えた一台はLaser5Linux6.0Rel2をインストールしてファイルサーバー(Samba-2.0.7)として運用するようになっています。また、Apache-1.3.9+PHP-3.0.14+PostgreSQL-6.5.2をインストール・設定済みで実験用として運用しています。


 PostgreSQLのバージョンが7.0になって、外部キーが使えるようになったことを知ってはいたのですが、しばらく面倒なのでほったらかしにしていました。日本PostgreSQLユーザー会のHPにて、最新バージョンを確認したところ、7.0.2がリリースされていたので、バージョンアップすることにしました。


RPMからインストールを試みる


 まず、コンパイル済みのバイナリパッケージがあるかどうか探してみました。rpmfind.netでpostgresqlを検索すると、RedHat7.0用のソースパッケージ(postgresql-7.0.2-17.src.rpm)があるので、これをダウンロードしてみました。ダウンロードしたファイルを、Linuxマシンの/usr/src/redhat/SRPMSにコピーして、rebuildしたのですが次のようなエラーメッセージが出てしまいます。


#rpm --rebuild postgresql-7.0.2-17.src.rpm
Installing postgresql-7.0.2-17.src.rpm
only packages with major numbers <= 3 are supported by this version of RPM

 rpmに-qilpオプションをつけて、パッケージの情報を得ようとするとやはり以下のようにエラーとなってしまいます。


#rpm -qilp postgresql-7.0.2-17.src.rpm
only packages with major numbers <= 3 are supported by this version of RPM
query of postgresql-7.0.2-17.src.rpm failed

 どうやら、RedHat7.0でRPMのバージョンがあがっているようです。www.redhat.comで、RPMについて調べてみるとrpm4.0-4がリリースされているようです。上記のpostgresql-7.0.2-17.src.rpmは、どうやらこのRPM4.0で作成されているようです。


 現在使用中のディストリビューションはLaser5の6.0Rel2で、rpmのバージョンは3.0.2です。Laser5のHPで確認したところ、6.2用に3.0.5のアップデートパッケージが提供されていますが、当然これでもまだ駄目ですね。RedHatから4.0のパッケージをダウンロードしてきて、RPMのバージョンをあげるのはちょっとハードルが高いので、別のパッケージで試してみることにしました。


 Mndrake Cooker用とRawHide1.0用があったのですが、RawHide用はやはりRPM4.0で作成されたものでした。Mandrake用SRPMをrpm -qilpとした結果は以下のとおりです。


#rpm -qilp postgresql-7.0.2-5mdk.src.rpm
Name : postgresql Relocations: (not relocateable)
Version : 7.0.2 Vendor: MandrakeSoft
Release : 5mdk Build Date: Sun 24 Sep 2000 02:25:27 PM JST
Install date: (not installed) Build Host: ke.mandrakesoft.com
Group : Databases Source RPM: (none)
Size : 6946788 License: BSD
Packager : Jean-Michel Dault
URL : http://www.postgresql.org/
Summary : PostgreSQL client programs and libraries.
Description :(以下省略)
[2000/11/06加筆]

 とりあえず、rpm --rebuild を実行してみました。


# rpm --rebuild postgresql-7.0.2-5mdk.src.rpm
Installing postgresql-7.0.2-5mdk.src.rpm
error: failed build dependencies:
python-devel is needed by postgresql-7.0.2-5mdk

 python-develというパッケージが不足しているようです。これを追加すればリビルド出来そうですが、面倒なのでこの方法はここまでにしておきます。


[加筆ここまで]
[以下削除]

 client programs and librariesとあるので、サーバーは含まれないかもしれません。確かめてみるためにとりあえずrpm -biとして、SRPMを展開してみました。すると次のようなエラーが出てしまいます。


#rpm -bi postgresql-7.0.2-5mdk.src.rpm
File contains non-printable characters(): /usr/src/redhat/SRPMS/postgresql-7.0.2-5mdk.src.rpm

 うーむ、Windows2000上のIE5.5でダウンロードしたせいかもしれません。Linuxマシンのtelnetプロンプトでftp ftp.rpmfind.netとして、該当するsrc.rpmファイルをgetしてみました。同じようにrpm -biしてみます。


#rpm -bi postgresql-7.0.2-5mdk.src.rpm
File contains non-printable characters(): /usr/src/redhat/SRPMS/postgresql-7.0.2-5mdk.src.rpm

 これもやはり駄目でした。


[削除ここまで]

tarボールからのインストール


 仕方ないのでtarボールからビルドインストールすることにします。まず、日本PostgreSQLユーザー会のHPから postgresql-7.0.2-patched.tar.gz をgetしました。これは常に最新版のパッチ済みtarボールに張られているリンクなので、現時点ではpostgresql-7.0.2-20000921.tar.gzをダウンロードすることになります。


 まず、ユーザーpostgresでコンパイル、インストールを行うので/usr/local/srcをchown postgres.postgres /usr/local/srcとして所有者を変更しておきます。同様に/usr/local/pgsqlがなければ、これを作成して所有者をpostgres.postgresにしておきます。


 su - postgres としてユーザーを変更してから、/usr/local/srcへ移動してtarボールを展開してみます。


$cd /usr/local/src
$tar xvzf tarボールのあるディレクトリ/poastgresql-7.0.2-patched-20000921.tar.gz

 とりあえず、docディレクトリにあるファイルに目を通します。README.mb.jpにしたがって、--enable-multibyte=EUC_JPとしてマルチバイト文字サポートを有効にしておきます。


 次はコンパイルのためのコンフィギュレーションです。まず、ソースディレクトリへ移動します。


$cd postgresql-7.0.2/src
$./configure --enable-multibyte=EUC_JP


$make all


All of PostgreSQL is successfully made. Ready to install.

 上記のように表示されればコンパイルは正常に終了しています。MMXPentium200MHzで約12分くらいかかりました。


RPMでインストールされている6.5.2をアンインストールする


 続いて、make installといきたいところですが、その前に6.5.2をアンインストールしなくてはなりません。その前に、/etc/rc.d/init.d/postgresqlというシェルスクリプトを別のディレクトリにコピーしておきます。これは、rpmで提供されているpostgresqlの起動スクリプトで、便利なのでちょっとだけ書き換えて再利用したいと思います。


 さて、rootになって、rpm -e postgresqlとすると、依存関係がいろいろあるので削除できません。しかたないので、ひとつずつ削除しました。


# /etc/rc.d/init.d/postgresql stop
Stopping postgresql service: [OK]
# rpm -e postgresql
error: removing these packages would break dependencies:
postgresql = 6.5.2 is needed by postgresql-devel-6.5.2-1LL2
postgresql = 6.5.2 is needed by postgresql-jdbc-6.5.2-1LL2
postgresql = 6.5.2 is needed by postgresql-odbc-6.5.2-1LL2
postgresql = 6.5.2 is needed by postgresql-perl-6.5.2-1LL2
postgresql = 6.5.2 is needed by postgresql-python-6.5.2-1LL2
postgresql = 6.5.2 is needed by postgresql-server-6.5.2-1LL2
postgresql = 6.5.2 is needed by postgresql-tcl-6.5.2-1LL2
postgresql = 6.5.2 is needed by postgresql-test-6.5.2-1LL2
libpq.so.2.0 is needed by postgresql-perl-6.5.2-1LL2
libpq.so.2.0 is needed by postgresql-python-6.5.2-1LL2
libpq.so.2.0 is needed by postgresql-server-6.5.2-1LL2
libpq.so.2.0 is needed by postgresql-tcl-6.5.2-1LL2
# rpm -e postgresql-devel
# rpm -e postgresql-jdbc
# rpm -e postgresql-odbc
# rpm -e postgresql-perl
# rpm -e postgresql-python
# rpm -e postgresql-tcl
# rpm -e postgresql-test
cannot remove /usr/lib/pgsql/test/regress - directory not empty
# rpm -e postgresql
error: removing these packages would break dependencies:
postgresql = 6.5.2 is needed by postgresql-server-6.5.2-1LL2
libpq.so.2.0 is needed by postgresql-server-6.5.2-1LL2

 posgresqlのデータベースサーバーパッケージはpostgresql-serverでした。これも、削除しておきます。


# rpm -e postgresql-server
cannot remove /var/lib/pgsql - directory not empty
# rpm -e postgresql

 これで、全部削除できたできたと思います。では、make installしてみます。


Thank you for choosing PostgreSQL, the most advanced open source database engine.

 大丈夫ですね。ついでにドキュメントもインストールしておきます。


$ cd ../doc
$ make install

 さて、次にコマンドサーチパスを設定してあげることになるんですが、次のようにします。ユーザーpostgresのホームディレクトリにある、.bashrc に以下を追加します。


PATH="$PATH":/usr/local/pgsql/bin

 さて、しかし、どうやらrpmを削除する時に組み込みアカウントのpostgresも削除されてしまったようです。/usr/localでls -lを実行すると以下のように表示されてしまいます。


drwxr-xr-x 7 40 233 1024 Oct 25 09:53 pgsql/
drwxr-xr-x 16 40 233 1024 Oct 23 15:10 src/

 しょうがないので、もういちどアカウントpostgresを作り直しました。useradd postgresを実行してから、/etc/passwdと/etc/groupを編集して、UIDを40、GIDを233に変更しておきます。さらに、/home/postgresの所有権をchown postgres.postgresに変更します。rpmを最初に削除しておかなかったために、余計な手間がかかりました。ちなみに、組み込みアカウントpostgresのホームディレクトリは/var/lib/pgsqlでした。必要ないので、これは削除してしまいます。


 さて、/home/postgres/.bashrcにさらに、次の環境変数を追加します。


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 .bashrcを実行して変更を反映させます。echoで確認してみます。


$echo $PGDATA
/usr/local/pgsql/data

 OKですね。


 さて、次はデータベースの初期化です。これはinitdbを実行するだけです。


$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 database system directory /usr/local/pgsql/data
Creating database system directory /usr/local/pgsql/data/base
Creating database XLOG directory /usr/local/pgsql/data/pg_xlog
Creating template database in /usr/local/pgsql/data/base/template1
Creating global relations in /usr/local/pgsql/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 /usr/local/pgsql/data
or
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data start

RPM版起動スクリプトを再利用する


 つぎに、postmasterを起動するんですが、ここで先ほどコピーしてとっておいた/etc/rc.d/init.d/postgresファイルを変更して再利用してみたいと思います。


------------------------------------------------------------------------------------------
#! /bin/sh
# postgresql This is the init script for starting up the PostgreSQL
# server
# Version 7.0.2 Tomneko 2000/10/25
# Modified for PostgreSQL-7.0.2 tar.gz instalation
#
# Version 6.5.2-0.2lo Lamar Owen
# Added code to determine if PGDATA exists, whether it is current version
# or not, and initdb if no PGDATA (initdb will not overwrite a database).
# chkconfig: 345 85 15
# description: Starts and stops the PostgreSQL backend daemon that handles \
# all database requests.
# processname: postmaster
# pidfile: /var/run/postmaster.pid
#
# Source function library.
. /etc/rc.d/init.d/functions
# Get config.
. /etc/sysconfig/network
# Check that networking is up.
# Pretty much need it for postmaster.
[ ${NETWORKING} = "no" ] && exit 0
[ -f /usr/local/pgsql/bin/postmaster ] || exit 0
# This script is slightly unusual in that the name of the daemon (postmaster)
# is not the same as the name of the subsystem (postgresql)
# See how we were called.
case "$1" in
start)
echo -n "Checking postgresql installation: "
# Check for the PGDATA structure
if [ -f /usr/local/pgsql/data/PG_VERSION ] && [ -d /usr/local/pgsql/data/base/template1 ]
then
# Check version of existing PGDATA
if [ `cat /usr/local/pgsql/data/PG_VERSION` != '7.0' ]
then
echo "old version. Need to Upgrade."
exit 1
else
echo "looks good!"
fi
# No existing PGDATA! Initdb it.
else
echo "no database files found."
if [ ! -d /usr/local/pgsql ]
then
mkdir -p /usr/local/pgsql/data
chown postgres.postgres /usr/local/pgsql/data
fi
su -l postgres -c '/usr/local/pgsql/bin/initdb --pglib=/usr/local/pgsql/lib --pgdata=/usr/local/pgsql/data'
fi
# Check for postmaster already running...
pid=`pidof postmaster`
if [ $pid ]
then
echo "Postmaster already running."
else
#all systems go -- remove any stale lock files
rm -f /tmp/.s.PGSQL.* > /dev/null
echo -n "Starting postgresql service: "
su -l postgres -c '/usr/local/pgsql/bin/postmaster -i -S -D/usr/local/pgsql/data'
sleep 1
pid=`pidof postmaster`
if [ $pid ]
then
echo -n "postmaster [$pid]"
touch /var/lock/subsys/postgresql
echo $pid > /var/run/postmaster.pid
echo
else
echo "failed."
fi
fi
;;
stop)
echo -n "Stopping postgresql service: "
killproc postmaster
sleep 2
rm -f /var/run/postmaster.pid
rm -f /var/lock/subsys/postgresql
echo
;;
status)
status postmaster
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: postgresql {start|stop|status|restart}"
exit 1
esac
exit 0
----------------------------------------------------------------------------------------

 変更したのは、実行ファイルのパスとバージョン番号チェックのところです。「このドキュメントを読んでね」というところは削除してしまいました。#./postgresqlとすると、ちゃんと起動するようです。うまく動いたら、/etc/rc.d/init.dにコピーしておきます。


インストールの最後にテストを実行する


 postmasterは-iオプションをつけて起動するとTCP/IPでの通信を受け付けるようになりますが、初期設定ではlocalhost以外からの接続を受け付けないようになっています。これは、/usr/local/pgsql/data/pg_hba.conf に次の行を追加します。実験機なのですべのホストからの接続を受け入れるようにしても構わないでしょう。この辺は、普通はセキュリティを考えて設定するようにします。


host all 0.0.0.0 0.0.0.0 trust

 さて、最後にregression testを行ってみましょう。postmasterが起動している状態で、以下のようにします。


$ cd /usr/local/src/postgres-7.0.2/src/test/regress
$ make all runtest


ACTUAL RESULTS OF REGRESSION TEST ARE NOW IN FILE regress.out
To run the optional big test(s) too, type 'make bigtest'
These big tests can take over an hour to complete
These actually are: numeric_big

 これで、PostgreSQL-7.0.2のインストールは完了です。


To Be Continued

2000年10月29日 23:00 | PostgreSQL | tomneko |