PostgreSQL関連情報

(2002/12/04号)

トップページ
PostgreSQLとは
PostgreSQLとWindows
PostgreSQLとMac OS X


PostgreSQLとMac OS X
Aqua版Tcl/TkでPgAccess

Mac OS Xがリリースされ、Mac OSもUNIX系OSの一員となりました。この結果、Macintosh上でもPostgreSQLが利用できるようになりました。PostgreSQLのサーバもクライアントも完全に動作します。

PostgreSQLはMac OS Xを公式にサポートしています。しかし、共有オブジェクトのファイル名が“.so”(Mac OS Xでは通常“.dylib”)になっていたり、実は全てスタティックリンクされているためにバイナリのサイズがやけにでかかったりと、まだまだ問題があります。

以下は、Mac OS X上でより良好にPostgreSQLを動作させるための情報です。

PostgreSQL 7.3用Mac OS X対応パッチ

PostgreSQLは公式にMac OS Xをサポートしているわけですが、上に記したようにまだいくつかの問題が残っています。そこで、これらを解消するパッチを作成しましたので、必要な方はダウンロードしてご利用ください。

これはPostgreSQL 7.3のソースに当てるパッチです。このパッチで以下の問題が修正されます。

  1. 共有オブジェクトのファイル名を“.so”から“.dylib”に変更
  2. 共有オブジェクトのファイル名に付加するバージョン番号の付け方をMac OS X流に変更
  3. ダイナミックライブラリとバンドルの正しい使い分け

パッチを当てるには、PostgreSQLのソースツリー内のもっとも親のディレクトリをカレントディレクトリとした上で、patchコマンドを次のように実行します。

patch -p1 < /tmp/postgresql-7.3-darwin.patch

/tmp/postgresql-7.3-darwin.patchはダウンロードしたパッチファイルです。実際のパスに置き換えてください。

Mac OS X版PostgreSQL 7.3のインストール手順

Mac OS XにPostgreSQLをインストールするには次の手順を実行します。

事前準備

ソースパッケージの展開とパッチの適用

% cd ~/src
% tar xvzf postgresql-7.3.tar.gz
% cd postgresql-7.3
% patch -p1 < ../postgersql-7.3-darwin.patch

PostgreSQLのコンパイルとインストール

% ./configure
make
sudo make install

もしも色々なライブラリをFinkを用いてインストールしているのなら、最初のconfigureは次のように行うと良いでしょう。Finkを利用するとreadlineやopensslが簡単に利用できます。

% env CPPFLAGS="-I/sw/include" LDFLAGS="-L/sw/lib" ./configure --with-openssl

もしもAqua版Tcl/Tkをインストールしているなら、configureは次のようになります。

% env CPPFLAGS="-I/sw/include -I/Library/Frameworks/Tcl.framework/Headers -I/Library/Frameworks/Tk.framework/Headers" LDFLAGS="-L/sw/lib" ./configure --with-tcl --with-tclconfig=/Library/Frameworks/Tcl.framework --with-tkconfig=/Library/Frameworks/Tk.framework

ちなみに、Aqua版Tcl/Tk上でもPgAccessは動きますが、一部表示がおかしかったり日本語が入力できなかったりします。

環境変数の設定

PostgreSQLを利用する上で必要となる環境変数を設定します。各自のホームディレクトリの.cshrcに設定しても良いのですが、ここでは全てのユーザに設定する方法を行います。

/etc/csh.cshrcと/etc/csh.loginに次の内容を追加します。

# for PostgreSQL
set path=($path /usr/local/pgsql/bin)
setenv PGDATA /usr/local/pgsql/data
if ( $?DYLD_LIBRARY_PATH ) then
	setenv DYLD_LIBRARY_PATH "${DYLD_LIBRARY_PATH}:/usr/local/pgsql/lib"
else
	setenv DYLD_LIBRARY_PATH /usr/local/pgsql/lib
endif
if ( $?MANPATH ) then
	setenv MANPATH "${MANPATH}:/usr/local/pgsql/man"
else
	setenv MANPATH :/usr/local/pgsql/man
endif

/etc/csh.cshrcと/etc/csh.loginの両方に設定するのは妙なのですが、場面場面で読み込まれるファイルが異なるため、面倒を避けるために両方に設定する方法を記しています。詳しくわかる方はもっとスマートに行ってください。

データベース領域の初期化

PostgreSQLサーバを実行するためのpostgresユーザを作成してから、次のような手順でデータベース領域を初期化します。

% sudo mkdir /usr/local/pgsql/data
% sudo chown postgres.staff /usr/local/pgsql/data
% sudo chmod 700 /usr/local/pgsql/data
% sudo su - postgres -c "initdb --encoding=EUC_JP --no-locale"

最後の行でinitdbに与えているオプション“--encoding=EUC_JP --no-locale”は、データベースで日本語を扱いたい場合に指定しておくと便利なオプションです。--no-localeはMac OS Xでは不要かもしれませんが、一応付けておきます。

PostgreSQLサーバの設定

/usr/local/pgsql/data/postgresql.confに次の設定を追加します(設定内容は一例です)。

tcpip_socket = true
shared_buffers = 256
wal_sync_method = fsync
syslog = 1

共有バッファサイズ(shared_buffers)を256に設定していますが、PostgreSQLのパフォーマンスを考えればもっと大きな数値すべきです。しかしMac OS X 10.1.5では、OSの共有メモリサイズが小さい上に拡張もできないため、256程度が最大値になります。Mac OS X 10.2では共有メモリサイズの変更が可能なので、もっと大きな値が設定できます(OS側の設定も必要)。

wal_sync_methodは、Mac OS Xではfsyncとopen_syncが指定できますが、パフォーマンスはどちらもさほどかわらないようです。

自動起動設定

フォルダ/Library/StartupItems/PostgreSQLを作成します。

% mkdir -p /Library/StartupItems/PostgreSQL

次に/Library/StartupItems/PostgreSQL/PostgreSQLを次の内容で作成します。

#!/bin/sh

##
# PostgreSQL RDBMS Server
##

. /etc/rc.common

PATH=${PATH}:/usr/local/pgsql/bin
export PATH

[ -f /usr/local/pgsql/bin/postmaster ] || exit 0

StartService ()
{
    if [ "${POSTGRESQLSERVER:=-NO-}" = "-YES-" ]; then
        ConsoleMessage "Starting PostgreSQL RDBMS server"
        su - postgres -c "pg_ctl -D /usr/local/pgsql/data start -w -s"
    fi
}

StopService ()
{
    ConsoleMessage "Stopping PostgreSQL RDBMS server"
    su - postgres -c "pg_ctl -D /usr/local/pgsql/data stop -m fast"
}

RestartService ()
{
    StopService
    StartService
}

# for Mac OS X 10.1
StartService
# for Mac OS X 10.2
#RunService "$1"

最後の4行の部分は、お使いのOSのバージョンにあわせて調整してください。

ファイルを作成したら、実行パーミッションを与えます。

% chmod a+x /Library/StartupItems/PostgreSQL/PostgreSQL

次に/Library/StartupItems/PostgreSQL/StartupParameters.plistを次の内容で作成します。

{
  Description     = "PostgreSQL RDBMS server";
  Provides        = ("PostgreSQL Server");
  Requires        = ("Disks", "Resolver");
  Uses            = ("NFS", "Network Time");
  OrderPreference = "None";
  Messages =
  {
    start = "Starting PostgreSQL RDBMS server";
    stop  = "Stopping PostgreSQL RDBMS server";
  };
}

このファイルはプロパティリストなので、プロパティリストエディタでも編集できます。

2つのファイルを作成したらパーミッションなどを整えます。

% chgrp -R admin /Library/StartupItems/PostgreSQL
% chmod -R g+w /Library/StartupItems/PostgreSQL

次回のマシンブート時より自動起動が有効になるように、/etc/hostconfigファイルに以下の行を追加します。

POSTGRESQLSERVER=-YES-

ちなみに上記内容の“-YES-”の部分を“-NO-”にすると、自動起動は行われなくなります。

PostgreSQLの起動

さて、準備はできました。PostgreSQLサーバを起動してみましょう。

やり方はいろいろありますが、自動起動のテストをかねた方法を試すなら、Mac OS X 10.2未満では次のようにします。

% sudo /Library/StartupItems/PostgreSQL/PostgreSQL

Mac OS X 10.2以降では次のようにします。

% sudo SystemStarter start "PostgreSQL server"

もちろん、一般的なpg_ctlを用いた方法も使えます。

% sudo su - postgres -c "pg_ctl start -w"

PostgreSQLの終了

念のため、pg_ctlを使った終了方法を記しておきます。

% sudo su - postgres -c "pg_ctl stop -m f"

Mac OS X 10.2未満での問題点

インストール手順でも述べましたが、Mac OS X 10.2未満の共有メモリサイズは小さすぎます。そのため、PostgreSQLの共有バッファサイズが十分に大きくできず、最良のパフォーマンスを得ることができません。

Mac OS X 10.2未満のOSのシャットダウンプロセスにも問題があります。このため、データベースが正しく閉じられないことがあります。プロダクションレベルで利用するつもりなら、10.2以上の使用をお勧めします。

その他

ここで公開しているものはすべて無保証です。しかし、このページで紹介している情報そのものに関して、何かお気づきの点などがありましたらお知らせください。

質問などは、情報を共有するためにも日本の PostgreSQL メーリングリストへ投稿してください。可能な範囲で対応したいと思います。ちなみにこのページを書いたのは 片岡 裕生 <kataoka@interwiz.jp> です。

関係サイトへのリンク

ホームページ最新情報インターウィズ!?サービス紹介ソフトウェア工房メーリングリストNetSmile