2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

Postgresql7からPostgresql8への移行!

Postgresql8は、約1年ぶりのメジャーバージョンアップでは、Windows版で言えばWin32ネイティブ対応、Windows版とUnix版両者で言えばテーブルスペースの実装、PITR(Point in Time Recovery)、バッファ管理アルゴリズムの改良などの新機能が追加されてるようだ。俺が察するところ構造的にもかなり改良が加えられてるのではないだろうか。それから、細かいところではSQLでのALTER TABLE命令がOLACLEが如く使いやすくなったこと等が俺の知っていることだ。詳しい事は、 ここ で日本語ドキュメントをダウンロードして一読することをおすすめする。ここでは、Postgresql8への移行方法を書いてみた。


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

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

2005-10-6現在で最新だった、postgresql-8.0.4.tar.gzをダウンロード。


2.インストール

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

必要な準備は、Postgresql7をインストールした段階で終わってる事として説明する。

2)ファイルの展開

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

# su – postgres

$ cd /usr/local/src

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

3)コンパイル

■ 本体のインストール

$ cd postgresql-8.0.4

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

–enable-syslogはsyslogでLOGを吐かせたい場合に付けるオプション。

———————————————————-
コンパイル中、zlibが無いとかreadlineが無いとかいわれたらソースからインストールした方が良いだろう。locateやfindで検索してバイナリのzlibやreadlineがすでにインストールしてあってもソースとバイナリのライブラリ構成が違うのでソース版のインスコをお勧めする。
☆zlib編
ソースゲットは、 ここ でゲットする。2005年10月現在でzlib-1.2.3.tar.gzであった。
# cd /usr/local/src
# tar zxvf zlib-1.2.3.tar.gz
# chown -R root.root zlib-1.2.3
# cd zlib-1.2.3
# ./configure
# make install

☆Debian zlib編
# apt-get install zlib-bin zlib1g zlib1g-dev

☆readline編
ソースは、 ここ でゲットする。2005年10月現在でreadline-5.0.tar.gzであった。
# cd /usr/local/src
# tar zxvf readline-5.0.tar.gz
# chown -R root.root readline-5.0
# cd readline-5.0
# ./configure
# make
# make install
ただし、上記のようにreadlineを入れても再びconfigureで「readlineが無い!」と言うようなエラーを吐く場合は、libreadlineライブラリが指定のライブラリフォルダに無いのが原因と考えられるため、以下のようにreadlineライブラリをコピーしてやろう。
# cp /lib/libreadline.so* /usr/lib/
# ls -al /usr/lib/libreadline.so*

lrwxrwxrwx 1 root root 16 Dec 21 12:10 /usr/lib/libreadline.so -> libreadline.so.5
-rw-r–r– 1 root root 176976 Dec 21 11:53 /usr/lib/libreadline.so.5
-rw-r–r– 1 root root 176976 Dec 21 11:53 /usr/lib/libreadline.so.5.0
これで、configureが通るだろう。

☆Debian readline 編
# apt-get install libreadline5-dev
———————————————————-

postgresqlのconfigureにエラーがなければ、

$ make all

エラーがなければ、

$ make install

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

$ cd doc

$ make install
注:FreeBSDの場合は、gmake install

4)旧Postgresqlデータフォルダの削除

$ initdb
initdb: directory “/usr/local/pgsql/data” exists but is not empty
If you want to create a new database system, either remove or empty
the directory “/usr/local/pgsql/data” or run initdb
with an argument other than “/usr/local/pgsql/data”.

/usr/local/pgsql/data にファイルが有るので消しなさい。
と言ってるので、必要なDBが有るならバックアップを取って、以下のごとくフォルダの中身を全消しする。

$ cd /usr/local/pgsql/data
$ rm -Rf *

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

$ cd ~/
$ vi .profile or .bash_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”
省略

$ 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


3.データベース起動

$ postmaster -i -S -D /usr/local/pgsql/data &

プロセス確認。

$ ps -ef

省略

PID TTY STAT TIME COMMAND
postgres 1230 1 0 Oct05 ? 00:00:00 /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
postgres 1232 1230 0 Oct05 ? 00:00:00 postgres: writer process
postgres 1233 1230 0 Oct05 ? 00:00:00 postgres: stats buffer process
postgres 1234 1233 0 Oct05 ? 00:00:00 postgres: stats collector process

省略


4.スタート・ストップ・リスタートスクリプト

俺の使ってるLinuxデスビはNature’s Linuxなので /etc/init.dフォルダにpgsqlというファイル名で以下の内容のシェルを作っている。

# cd /etc/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)
rm -f .s.PGSQL.5432
$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


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

1)アクセス制御

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

を追加してやればよい。

2)動作テストを行う!

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

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

$ make all runtest

途中略

test varchar … ok
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 timetz … ok
test timestamp … ok
test timestamptz … 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 insert … 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 vacuum … 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 update … ok
test namespace … ok
test privileges … ok
test misc … ok
test select_views … ok
test portals_p2 … ok
test rules … ok
test foreign_key … ok
test cluster … ok
test limit … ok
test plpgsql … ok
test copy2 … ok
test temp … ok
test domain … ok
test rangefuncs … ok
test prepare … ok
test without_oid … ok
test conversion … ok
test truncate … ok
test alter_table … ok
test sequence … ok
test polymorphism … ok
test rowtypes … ok
test stats … ok
test tablespace … ok

======================
All 96 tests passed.
======================

rm regress.o

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

3)デストリビューション別でのデータベースの文字化け

VineLinuxの場合、問題が発生した。
以下を行わないとDBをViewしたときスクリプトが化ける。SJISのスクリプトのため、データベースもSJISのエンコーディングでcreateしないとViewしたときの文字が化ける。

問題発生環境:VineLinux3.2 Kernel2.4.31 PHP5 Postgresql8

■まず、Postgresql8のDB Createの時にエンコードの設定を行う。

$ createdb –encoding=SQL_ASCII <データベース名>

でDBをCreateする。

■VineLinux自体のロケールの変更

Linuxのデストリビューションのデフォルトロケールは各種バラバラなので困る。
俺が知ってるだけでも、
FedraCore       UTF-8
VineLinux        日本語EUC
DebianLinux      Posix
WhiteBoxLinux     日本語EUC
というような感じ。

/etc/sysconfig/i18n のロケールを 「日本語EUC」から「 C 」へ変更する。

4)initdb時のFATAL

initdbをしたときに以下のようなエラーがでるときがある。

[postgres@school]$ initdb
The files belonging to this database system will be owned by user “postgres”.
This user must also own the server process.

The database cluster will be initialized with locale ja.

fixing permissions on existing directory /usr/local/pgsql/data… ok
creating directory /usr/local/pgsql/data/base… ok
creating directory /usr/local/pgsql/data/global… ok
creating directory /usr/local/pgsql/data/pg_xlog… ok
creating directory /usr/local/pgsql/data/pg_clog… ok
selecting default max_connections… 10
selecting default shared_buffers… 50
creating configuration files… ok
creating template1 database in /usr/local/pgsql/data/base/1… FATAL: XX000: failed to initialize l
c_messages to “”
LOCATION: InitializeGUCOptions, guc.c:1866

initdb: failed

こういう場合は、以下のように一時的にロケールを「C」にしてから再度initdbすると良い。

[postgres@school]$ LANG=C

[postgres@school]$ initdb

以上

コメント