ページ更新: 2006-03-06 (月) (4516日前)

関連: ソフト/PostgreSQL, Windows/PostgreSQL

注意: Windows に正式対応した PostgreSQL 8.0 が 2005-01-19 にリリースされた。よって、今後は Cygwin の PostgreSQL を使う機会が減るはず。

本文書は 2004-06-11 にリリースされた Cygwinの postgresql-7.4.2-1 パッケージ の付属のREADMEに従った作業の手順である。

Cygwin 及び PostgreSQL パッケージのインストール作業については本文書の範囲外とする。Cygwin/インストールCygwin/PostgreSQL/メモ#postgresql と最小限のパッケージ を参照のこと。

より古い postgresql-7.3.4-2 (2003-09-02 リリース)postgresql-7.4.1-3 (2004-01-15 リリース) では手順が異なる。Cygwin/PostgreSQL/セットアップ(ipc-daemon2版) を参照のこと。

リリースについては Cygwin/PostgreSQL/パッケージ更新情報 を参照、エラーについては Cygwin/PostgreSQL/メモ を参照のこと。

  • 2006-03-06 補足
    2006-03-04に postgresqlパッケージ 8.0.7-1, 8.1.3-1 がリリースされた。(私はまだ触っていない)
  • 2005-11-12 補足
    2005-11-11に postgresqlパッケージ8.0.4-1と8.1.0-1 がリリースされた。
    • これまでとは少々手順が異なりそうなので、8.0.4-1をちょっとだけ試した→Cygwin/PostgreSQL/8.0.4-1
    • 8.1.0-1は現在はExp(experimental)(setup.iniによると[test]に入ってるので)。なので、setup.exeで「Curr」(current)ではなく「Exp」(experimental)に切り替えてインストールする。ちょっと試した→Cygwin/PostgreSQL/8.1.0-1
  • 2005-08-25 補足
  • 2004-09-30 補足
    now()を正常に動作させるための設定は Cygwin/PostgreSQL/メモ#v676ade9 を参照のこと。
  • 2004-09-05 補足
    • 2004-08-27postgresql-7.4.5-1 がリリースされた。 同じ手順でセットアップできる。
    • postmaster.exeに実行権限を与え忘れた。このときのトラブルシューティングは Cygwin/PostgreSQL/メモ#ac6a6449 を参照のこと。
  • 2004-06-23 補足
    2004-06-19 にリリースされた postgresql-7.4.3-1 も同じ手順で セットアップできる。 (Windows 2000 Professional SP4 on VMware 4.5.1 で確認)

目次

[編集]

Cygwin 付属の文書について #

[編集]

README #

Cygwin 上での設定手順は /usr/share/doc/Cygwin/postgresql-7.4.2.README に記載されている。(-7.4.2 の部分は当然、postgresqlのバージョンによって変わる)

この文書は postgresql パッケージを使う場合、必ず読むべき文書である。

  • 2005-11-12 補足
    postgresql-7.4.5までと、8.0.4-1以後では文書が違う。8.0.4-1ではREADMEの先頭部分の説明が大幅に増えている。

以下ではこの文書を単に「README」と記す。

この文書は、cygwin を C:\cygwin にインストールした場合、 C:\cygwin\usr\share\doc\Cygwin\postgresql-7.4.2.README にある。

なお、この文書の一部を翻訳したものを Cygwin/PostgreSQL/README(cygserver版) に置いてある。

[編集]

PostgreSQL 付属の文書 #

Cygwin のパッケージではなく、オリジナルの PostgreSQL に元々付属する文書は /usr/share/doc/postgresql-7.4.2/ 以下にインストールされる。

この文書は英語だが、マニュアル (html/以下) の 日本語版が 日本 PostgreSQL ユーザ会 から入手できる。

また、日本語を使う上での注意は PostgreSQL 付属文書 README.mb.jp に日本語で書かれている。

Cygwin に対する説明は FAQ_MSWIN FAQ_CYGWIN に 英語で記載されている。(この文書の日本語版は存在しないようだ)

  • 2004-08-25 補足
    postgresql 7.4.2-1 パッケージの FAQ_MSWIN は cygserver では なく ipc-daemon2 について書かれており、現状と食い違っていた。 (この文書が PostgreSQL 本家の由来であるためのタイムラグ)。
    2004-08-25 時点では、Web上の文章は cygserver を使ったものに差し替えられている。
[編集]

cygserver #

cygserver については /usr/share/doc/Cygwin/cygserver.README に記載されている。

User's Guide の以下のページと内容は同一である。(2004-08-08)
Cygwin User's Guide - Chapter 3. Using Cygwin - Cygserver

Cygwin Translation Library - Cygwin 文書図書館(翻訳館) (2004-11-26)

[編集]

バージョン確認方法 #

[編集]

Cygwin のバージョン確認 #

Cygwin のパージョンは uname コマンドを用いて次のようにして確認する。

$ uname -a
CYGWIN_NT-5.1 hostname 1.5.10(0.116/4/2) 2004-05-25 22:07 i686 unknown unknown Cygwin

上の例はWindows XP Professional SP1とCygwin 1.5.10-3を用いた場合。 'NT-5.1'がWindows XPであることを示し、 '1.5.10(0.116/4/2) 2004-05-25 22:07'がCygwinのバージョンを示している。

unameではバージョン末尾の数値 (1.5.10-3なら '-3')が判らないので、 さらにcygcheckコマンドを使ってcygwinパッケージのバージョンを確認するべき。

$ cygcheck -cd cygwin
Cygwin Package Information
Package              Version
cygwin               1.5.10-3
[編集]

postgresql パッケージのバージョン確認 #

postgresqlパッケージのバージョンはcygcheckコマンドを用いて確認する。

$ cygcheck -cd ash crypt cygrunsrv libncurses7 libreadline5 openssl zlib postgresql
Cygwin Package Information
Package              Version
ash                  20040127-1
crypt                1.1-1
cygrunsrv            1.0-1
libncurses7          5.3-4
libreadline5         4.3-5
openssl              0.9.7d-1
postgresql           7.4.2-1
zlib                 1.2.1-1

ここで調べているパッケージはpostgresqlパッケージと、その依存パッケージ。 依存パッケージはCygwinのsetup.exeが使うsetup.iniのrequires欄に記載されている。 (この例では、2004.06.12時点のsetup.iniに記載されていた物を使った)

[編集]

動作確認環境 #

次の3つの環境を用いた。

[編集]

Windows XP Professional SP1 + Cygwin 1.5.10-3 #

$ uname -a
CYGWIN_NT-5.1 hostname 1.5.10(0.116/4/2) 2004-05-25 22:07 i686 unknown unknown Cygwin

$ cygcheck -cd cygwin
Cygwin Package Information
Package              Version
cygwin               1.5.10-3

$ cygcheck -cd ash crypt cygrunsrv libncurses7 libreadline5 openssl zlib postgresql
Cygwin Package Information
Package              Version
ash                  20040127-1
crypt                1.1-1
cygrunsrv            1.0-1
libncurses7          5.3-4
libreadline5         4.3-5
openssl              0.9.7d-1
postgresql           7.4.2-1
zlib                 1.2.1-1
[編集]

Windows XP Professional SP1 + Cygwin 1.5.9-1 #

$ uname -a
CYGWIN_NT-5.1 hostname 1.5.9(0.112/4/2) 2004-03-18 23:05 i686 unknown unknown Cygwin

$ cygcheck -cd cygwin
Cygwin Package Information
Package              Version
cygwin               1.5.9-1

$ cygcheck -cd ash crypt cygrunsrv libncurses7 libreadline5 openssl zlib postgresql
Cygwin Package Information
Package              Version
ash                  20040127-1
crypt                1.1-1
cygrunsrv            1.0-1
libncurses7          5.3-4
libreadline5         4.3-5
openssl              0.9.7d-1
postgresql           7.4.2-1
zlib                 1.2.1-1
[編集]

Windows 2000 Professional SP4 + Cygwin 1.5.10-3 (2004-06-24) #

$ uname -a
CYGWIN_NT-5.0 hostname 1.5.10(0.116/4/2) 2004-05-25 22:07 i686 unknown unknown Cygwin

$ cygcheck -cd cygwin
Cygwin Package Information
Package              Version
cygwin               1.5.10-3

$ cygcheck -cd ash crypt cygrunsrv libncurses7 libreadline5 openssl zlib postgresql
Cygwin Package Information
Package              Version
ash                  20040127-1
crypt                1.1-1
cygrunsrv            1.0-1
libncurses7          5.3-4
libreadline5         4.3-5
openssl              0.9.7d-1
postgresql           7.4.3-1
zlib                 1.2.1-1
[編集]

作業を行う前に #

(2004-08-28 文章を再修正)

(この項目は README には存在しない。)

本文書では、説明の簡素化やトラブルの防止のために、次の設定が行われていると仮定している。

  • PCのホスト名には漢字記号空白が含まれていないこと。
    (なお、本文書ではPCのホスト名は hostname あるいは HOSTNAME と記す)
  • 作業を行うユーザ名には 漢字記号空白が含まれていないこと。
    (なお、本文書では、このユーザを username と記す)
  • ユーザ username は Administrators グループに所属している こと。
  • Cygwin の setup.exe は 漢字記号空白が含まれていない ディレクトリに置かれていること。
    (なお、本文書では、c:\setup\cygwin ディレクトリが作成され、そこに setup.exe が置かれていることと仮定する)
  • Cygwin の パッケージの格納先は setup.exe が置かれているディレクトリを使う (デフォルト)。
    (なお、本文書では、c:\setup\cygwin ディレクトリに格納するものとする)
  • Cygwin の Root Directory は C:\cygwin にする(デフォルト)。
  • Windows の システム環境変数 Path に C:\cygwin\bin を追加する。
    (サービスとして動作させる場合はたぶん必須。DLLをサービスが見つけられるようにするため。
    代わりに、cygwin1.dll を %windir%\system32 にコピーしても動作するかもしれないが、cygwin パッケージをアップデートするたびにコピー作業が必要になるので推奨しない。コピーし忘れたときのトラブルシューティングもやりにくいだろうし。
    cygrunsrv のオプション --env で設定しても良いだろうが、試したことがない。 )
  • Windowsのシステム環境変数 CYGWIN に、文字列 "server" を追加する。
    これまで CYGWIN を定義していないのであれば新たに環境変数を作って、その値に server を設定する。
    あるいは、cygrunsrv のオプション --env で設定しても良い(試したことはないが)
    (詳しくは Cygwin 付属の文書 /usr/share/doc/cygwin/cygserver.README を見ること。)
    (なお、この作業はpostmasterをサービスとして起動しないのなら必須ではない。でも設定を忘れがちなので、やっておいた方がよいと思う)。
  • システム環境変数を追加・修正した後は、いったん、Windows を再起動している。
    (サービスに登録するとき必須。READMEに記載あり。Cygwin に限ったことではない。)
[編集]

動かしてみる #

(原題: The following is the basic Cygwin PostgreSQL installation procedure)

README の「The following is the basic Cygwin PostgreSQL installation procedure」の手順に従って作業する。

[編集]

1. cygserver をインストールと設定を行う #

(原題: Install and configure cygserver)

表題には「install」とあるが、cygserver は cygwin パッケージに含まれているため、 すでにインストールされているはずである。

そこで、ここでは cygserver-config の実行のみ行う。

[編集]

/etc/cygserver.conf の生成 #

cygserver の設定を行うには、cygserver-config スクリプトを 実行する。

$ cygserver-config
Generating /etc/cygserver.conf file


Warning: The following function requires administrator privileges!

Do you want to install cygserver as service?
(Say "no" if it's already installed as service) (yes/no) no          ★サービスに登録しないので、no

Further configuration options are available by editing the configuration
file /etc/cygserver.conf.  Please read the inline information in that
file carefully. The best option for the start is to just leave it alone.

Please keep in mind, that a client application which wants to use
the services provided by cygserver *must* have the environment variable
CYGWIN set so that it contains the word "server".  So, if you don't
need any other special CYGWIN setting, just set it to "server".

It is advisable to add this setting to the Windows system environment.

Basic Cygserver configuration finished. Have fun!

これで、cygserver.conf が生成された。

なお、すでに /etc/cygserver.conf が存在するときに cygserver-config を実行すると、 次のように、上書きするかどうか聞いてくる。

$ cygserver-config
Overwrite existing /etc/cygserver.conf file? (yes/no)

また、cygserver が動作しているときは、次のように表示され、cygserver.conf は 生成できない。(すでにcygserver.confが生成されており、それを使ってcygserverが動作中)。
再度 cygserver.conf を生成したいのなら、cygserver を停止すること。

$ cygserver-config

There is a cygserver already running. Nothing to do, apparently.

なお、cygserver.conf の kern.ipc.semmns の値を変更する必要があるかも知れない。 (postgresql-7.4.3-1 以後の README を参照のこと)

  • 補足 2006-01-02 2005-09-30
    cygserver-configの実行時、「Do you want to install cygserver as service」にyesと答えると、NTサービスに登録される (cygserver サービス登録の確認)。 このサービスのスタートアップの種類は「自動」で登録されているため、OSを再起動するとcygserverはサービスとして動作する。
    サービスの制御方法は Cygwin PostgreSQL を サービスにする のcygserverに関する部分を参照のこと。
    cygserverをサービスから削除する手順は cygserverをサービスから削除する を参照のこと。
[編集]

環境変数 CYGWIN の設定確認 #

cygserver-config の実行時の注意書きに書かれているように、cygserver を 使うプログラムを実行するときには、 環境変数 CYGWIN に "server" が含まれている必要がある。

そこで、ipcs や initdb や postmaster を実行する前に設定しておき、この時点で確認する。

$ echo $CYGWIN
server
  • 補足 (2004-09-05)

    /.bashrc や /etc/profile.d/、あるいは pg_ctl や postmaster を起動する スクリプトを書いて、そこで定義しても良い。
    ちょっと試すだけなら次のようにしても良いと思う。

    $ export CYGWIN=server
    $ initdb ...(略)
    $ postmaster ...(略)
$ CYGWIN=server initdb ...(略)
$ CYGWIN=server postmaster ...(略)
[編集]

2. cygserver を起動する #

(原題: Start cygserver)

[編集]

cygserver プロセスを起動する #

cygserver を起動する。

/usr/sbin にはパスを通していないので絶対パスで指定する。また、バックグラウンドプロセスとして起動している。

$ /usr/sbin/cygserver &
[1] 3228

cygserver: Initialization complete.  Waiting for requests.

$ jobs        ★起動確認
[1]+  Running                 /usr/sbin/cygserver &

$ ps -a | grep cygserver  ★起動確認
     2896    3908    2896       4024  con 1003 00:34:47 /usr/sbin/cygserver
  • 2006-01-02 補足
    なお、すでにcygwerverが起動されているとき (WindowsNT系(NT/2000/XP)でcygserver-configを実行するとサービスに登録される。その後で1度でもOSを再起動していると、すでにcygwerverが動作中になる)は 次のメッセージが表示される。
$ /usr/sbin/cygserver &
[1] 3176

$ cygserver: Initialization complete.  Waiting for requests.
cygserver: failed to create named pipe: is the daemon already running?
cygserver: fatal error on IPC transport: closing down

この場合、cygserverをコマンドラインから起動する必要はない。

[編集]

System V IPC の確認 #

ipcs コマンドを使って、System V IPC の動作を確認する。

$ ipcs  ★IPCの状態を確認 (2004-07-10)
Message Queues:
T     ID               KEY        MODE       OWNER    GROUP

Shared Memory:
T     ID               KEY        MODE       OWNER    GROUP

Semaphores:
T     ID               KEY        MODE       OWNER    GROUP
[編集]

3. PostgreSQL を初期化する #

(原題: Initialize PostgreSQL)

次に、initdb を実行してデータベースクラスタを作成する。 日本語を扱うつもりなので、--no-locale を追加している。

$ initdb --no-locale -D /var/postgresql/data  ★ --no-locale を追加
The files belonging to this database system will be owned by user "username".
This user must also own the server process.

The database cluster will be initialized with locale C.

creating directory /var/postgresql/data... ok
creating directory /var/postgresql/data/base... ok
creating directory /var/postgresql/data/global... ok
creating directory /var/postgresql/data/pg_xlog... ok
creating directory /var/postgresql/data/pg_clog... ok
selecting default max_connections... 40
selecting default shared_buffers... 1000
creating configuration files... ok
creating template1 database in /var/postgresql/data/base/1... ok
initializing pg_shadow... ok
enabling unlimited row size for system tables... ok
initializing pg_depend... ok
creating system views... ok
loading pg_description... ok
creating conversions... ok
setting privileges on built-in objects... ok
creating information schema... ok
vacuuming database template1... ok
copying template1 to template0... ok

Success. You can now start the database server using:

    /usr/bin/postmaster -D /var/postgresql/data
or
    /usr/bin/pg_ctl -D /var/postgresql/data -l logfile start
  • 補足 (2004-08-29)
    環境変数 PGDATA を使えば、initdb で '-D /var/postgresql/data' を省略することができる。しかし、本項目は postgresql をまず動かしてみることが目標であるため、 PGDATA は使用していない。
[編集]

4. PostgreSQL の postmaster を起動する #

(原題: Start the PostgreSQL postmaster)

[編集]

postmaster を直接、起動する #

postmaster を直接起動する。 あとで postmaster をサービスにするなら、この方法に慣れた方がよい。

$ postmaster -D /var/postgresql/data &    ★postmasterを常駐
[1] 2032
$
WARNING:  dup(0) failed after 3196 successes: Bad file descriptor 
LOG:  database system was shut down at 2004-06-12 13:38:50
LOG:  checkpoint record is at 0/9DDFA0
LOG:  redo record is at 0/9DDFA0; undo record is at 0/0; shutdown TRUE
LOG:  next transaction ID: 536; next OID: 17142
LOG:  database system is ready

$ jobs    ★起動確認
[1]+  Running                 postmaster -D /var/postgresql/data &
[編集]

pg_ctl を使って起動する #

(この項はREADMEには存在しない。)

postmaster を直接実行する代わりに、PostgreSQL 付属の pg_ctl スクリプトを使って起動してもよい。postmaster をサービスにしないのであれば、この方法に慣れるのがよいだろう。

$ /usr/bin/pg_ctl -D /var/postgresql/data -l /var/log/postmaster.log start
postmaster successfully started
[編集]

5. PostgreSQL に接続する #

(原題: Connect to PostgreSQL)

これで PostgreSQL のサーバプロセスが稼働したので、試しに DB に接続してみる。

$ psql template1
Welcome to psql 7.4.2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

template1=# \q  ★ '\q' リターン、でpsqlを終了させる。
  • 補足 (2004-09-05)
    ここでは UNIX Domain Socket で接続している。以前 (2002-10あたりの cygwin の postgresql 7.2.X あたり?) では、Cygwin では UNIX Domain Socket を使えなかった。 現在 (Cygwin 1.5.X)では、Cygwin がエミュレートしている。
    エミューレートであるため、Cygwin のパッケージ以外からはこの手段では接続できない。
    他のツールから接続する場合は、サーバ・クライアントとも、TCP/IP接続の設定が必要である。 (サーバの設定は、postgresql.conf へ設定、postmaster の -i オプション、pg_ctl の -o -i オプションのいずれか。クライアントについては略。)
[編集]

6. PosstgreSQL を停止する #

(注意:この項は README には存在しない。)

PostgreSQL サーバプロセスを停止する。

[編集]

kill を使って停止する #

kill コマンドを使う場合は、PostgreSQL サーバプロセスのプロセスIDを指定する。

プロセスIDが不明の時は次のようにして調べ、

$ cat /var/postgresql/data/postmaster.pid
3032          ★これがプロセスID
/var/postgresql/data
  5432001     65536

次のようにして、サーバプロセスを停止する。

$ kill 3032   ★PostgreSQLを停止 (SIGTERMシグナルを使っている)
LOG:  received smart shutdown request
LOG:  shutting down
LOG:  database system is shut down
[1]+  Done                    postmaster -D /var/postgresql/data

もちろん、まとめて次のようにしてもよい。

$ kill `head -1 /var/postgresql/data/postmaster.pid`

postmaster を kill コマンドで止める場合のシグナルについては、マニュアルの以下の部分を参照のこと。

[編集]

pg_ctl を使って停止する #

pg_ctl スクリプトを使う場合は、stop モードを使う。

$ pg_ctl stop -D /var/postgresql/data
waiting for postmaster to shut down......done
postmaster successfully shut down
[編集]

7. cygserver を停止する #

(注意:この項は README には存在しない。)

続いて cygserver を止める。(止めなくても良いだろうが)

[編集]

kill を使う #

$ ps -a | grep cygserver    ★プロセスIDを調べる
     3452    3908    3452       3732  con 1003 00:37:52 /usr/sbin/cygserver
     ↑プロセスID

$ kill 3452         ★cygserverを停止
cygserver: Shutdown finished.
[1]+  Done                    /usr/sbin/cygserver
[編集]

--shutdown オプションを使う #

(2004-09-20)

cygserver の --shutdown オプションを試してみた。
Cygwin 1.5.11-1 の cygserver (1.10, API version 1.5.11(0.116/4/1)-(3.0.0.2) 2004-09-04 23:17) では、Segmentation fault が発生し、停止できなかった。

$ /usr/sbin/cygserver --shutdown
Segmentation fault (core dumped)

また、これより古い cygserver では試したことがない。よって、以前の動作は不明。

[編集]

Cygwin PostgreSQL を サービスにする #

(原題: NT services Cygwin PostgreSQL insallation)

なお、本文書の一部の手順は README とは変えてある。

変更した手順と、その理由は:

  1. cygserver をサービスに登録後、すぐに実行している。(この段階で失敗しているとinitdb や postmaster を実行できないため)
  2. サービス登録をコマンドラインではなく、シェルスクリプトで行っている。(再現しやすい、proftpd の README に倣った)
  3. データベースクラスタを initdb コマンドに作らせている(省力化)
[編集]

1. cygserver をインストールし、NTサービスとして設定する #

(原題: Install and configure cygserver as a NT service)

[編集]

/etc/cygserver.conf の生成 #

cygserver の設定を行うには、cygserver-config スクリプトを 実行する。

$ cygserver-config
Generating /etc/cygserver.conf file


Warning: The following function requires administrator privileges!

Do you want to install cygserver as service?
(Say "no" if it's already installed as service) (yes/no) yes         ★サービスに登録するので、yes

The service has been installed under LocalSystem account.
To start it, call `net start cygserver' or `cygrunsrv -S cygserver'.

Further configuration options are available by editing the configuration
file /etc/cygserver.conf.  Please read the inline information in that
file carefully. The best option for the start is to just leave it alone.

Please keep in mind, that a client application which wants to use
the services provided by cygserver *must* have the environment variable
CYGWIN set so that it contains the word "server".  So, if you don't
need any other special CYGWIN setting, just set it to "server".

It is advisable to add this setting to the Windows system environment.

Basic Cygserver configuration finished. Have fun!

これで、cygserver.conf が生成された。

なお、すでに /etc/cygserver.conf が存在するときに cygserver-config を実行すると、 次のように、上書きするかどうか聞いてくる。

$ cygserver-config
Overwrite existing /etc/cygserver.conf file? (yes/no)

また、cygserver が動作しているときは、次のように表示され、cygserver.conf は 生成できない。再度 cygserver.conf を生成するときは、cygserver を停止すること。

$ cygserver-config

There is a cygserver already running. Nothing to do, apparently.

なお、cygserver.conf の kern.ipc.semmns の値を変更する必要があるかも知れない。 (READMEを参照のこと) (postgresql-7.4.3-1 以後の README を参照のこと)

[編集]

cygserver サービス登録の確認 #

cygserver は cygserver-config を実行したときにサービスとして登録されている。念のため確認する。

$ cygrunsrv -Q cygserver
Service cygserver exists
Type                : Own Process
Current State       : Stopped
Controls Accepted   :

Windows XP Professional であれば、かわりに sc を使っても良い。(2004-08-29)

$ sc query cygserver

SERVICE_NAME: cygserver
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
                                (NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

参考: Cygwin/PostgreSQL/メモ#cygserverをサービスから削除する

[編集]

環境変数 CYGWIN の設定確認 #

cygserver-config の実行時の注意書きに書かれているように、cygserver を 使うプログラムを実行するときには、 環境変数 CYGWIN に "server" が含まれている必要がある。

そこで、あらかじめ設定しておき、この時点で確認する。

$ echo $CYGWIN
server

今回は postmaster をサービスとして起動するので、その前には 用意されている必要がある。また、ipcs でも この環境変数を使う。 よって、この時点でシステム環境変数に設定していないときは、設定してから Windows を再起動しておくこと。

[編集]

cygserver をサービスとして起動する #

READMEの手順とは違うが、ここで cygserver を サービスとして起動しておく。

$ cygrunsrv -S cygserver   ★起動して

$ cygrunsrv -Q cygserver   ★確認
Service cygserver exists
Type                : Own Process
Current State       : Running   ★動作中!
Controls Accepted   : Accept Stop
 
$ cat /var/log/cygserver.log  ★ログを確認
$                             ★エラーなし。

cygrunsrv の代わりに、net と sc (Windows XP Professional のみ) を使っても良い。(2004-08-29)

$ net start cygserver
CYGWIN cygserver サービスを開始します.
CYGWIN cygserver サービスは正常に開始されました。

$ sc query cygserver

SERVICE_NAME: cygserver
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

$ cat /var/log/cygserver.log  ★ログを確認
$                             ★エラーなし。

必要であれば、cygserverのスタートアップの種類を「自動」にする。(Windowsの「コンピュータの管理」で設定しておく)

[編集]

System V IPC の確認 #

ipcs コマンドを使って、System V IPC の動作を確認する。(2004-07-10)

$ ipcs
Message Queues:
T     ID               KEY        MODE       OWNER    GROUP

Shared Memory:
T     ID               KEY        MODE       OWNER    GROUP

Semaphores:
T     ID               KEY        MODE       OWNER    GROUP

ちなみに、cygserver が動いていないとき、 あるいは環境変数 CYGWIN にserverが指定されていないときに、 ipcs を実行すると、次のエラーが発生する。(2004-07-10)

$ ipcs
Bad system call
[編集]

2. "postgres" ユーザアカウントを作成する #

(原題: Create the "postgres" user account)

[編集]

ユーザアカウントの作成 #

Windowsにユーザ postgres を追加する。ここでは、Windows付属のnet userコマンドを使った。
(この操作の代わりに、Windowsのコントロールパネルから追加してもよい。)

「パスワード」部分にはこのユーザに付加するパスワードを入力すること。

$ net user postgres パスワード /add /fullname:postgres \
/comment:'PostgreSQL user account' /homedir:"$(cygpath -w /home/postgres)"
コマンドは正常に終了しました。
[編集]

/etc/passwd の更新 #

/etc/passwd に、postgres ユーザの情報を追加し、確認する。

$ mkpasswd -l -u postgres >> /etc/passwd     ★追加
$ tail -1 /etc/passwd                        ★確認(最後の1行を表示)
postgres:unused_by_nt/2000/xp:1014:513:postgres,U-HOSTNAME\postgres,S-1-5-21-4363740
69-688789844-839522115-1014:/home/postgres:/bin/bash

もし、/etc/passwd をすべて作り直しても良いなら、次のようにする。(2004-08-29)

$ mkpasswd -l > /etc/passwd
[編集]

3. "postgres" ユーザに "サービスとしてログイン" 権限を許可する #

(原題: Grant the "postgres" user the "Log on as a service" user right)

postgresユーザに「サービスとしてログイン」する権限を割り当てる。 次のようにして、「ローカル セキュリティ設定」を起動する。

$ cmd /c secpol.msc
postgres_secpol.png

「postgres」ユーザに「サービスとしてログイン」を許可する。

  • 補足 (2004-08-29)
    Windows XP Home の場合は代わりに Cygwin の editrights を使うが、未検証。手元にXP Homeがないので。 操作はREADMEを参照のこと。editrights自体はCygwin/editrightsを参照。こちらも未検証。
[編集]

4. postmaster を NTサービスとしてインストールする #

(原題: Install postmaster as a NT service)

この項は、READMEとは異なる手順で作業している。

[編集]

postmaster をサービスに登録する #

サービスを登録するときに、コマンドラインから cygrunsrv を実行する代わりに、以下のスクリプトを作って実行する。(ちなみに、このスクリプトをこのページからコピー→Cygwinのコマンドラインにペーストしても動くけど)

このスクリプトでは、サービス登録時の設定は次のようにしている:

  • 動作確認なので、「--type manual」、つまり起動方法を手動にしている。必要であればあとからWindowsの「コンピュータの管理」を使って「自動」にすること。
  • 終了方法は「--termsig INT」、つまり「高速シャットダウン」にしている。
  • 依存するサービスは「--dep cygserver」、つまり cygserver にしている。よって、 postmaster サービスを起動すると、cygserver が起動していない場合は自動的に起動される。(ただし、postmaster を終了しても cygserver は終了しないが、特に問題はないだろう)
  • postmaster に渡す引数は、データベースクラスタのディレクトリ (-D) と、TCP/IP 接続の許可 (-i) の2つ。TCP/IP 接続を許可しているのは、cygwin 以外のプログラムからは UNIX Domain Socket を扱えない(Cygwin がエミュレートしている)ため。
#!/bin/sh
# File: postgresql-cygserver-config.sh
# Purpose: Installs postgresql daemon as a Windows service
cygrunsrv \
--install postmaster \
--disp 'Cygwin PostgreSQL' \
--path /usr/bin/postmaster \
--args "-D /var/postgresql/data -i" \
--dep cygserver \
--termsig INT \
--user postgres \
--shutdown \
--type manual

スクリプトに実行権限を付ける。(2004-06-17)

$ chmod +x postgresql-cygserver-config.sh

スクリプトを実行する。

$ ./postgresql-cygserver-config.sh
Enter password of user `HOST\postgres': ★ "postgres"ユーザのパスワードを入力
Reenter, please: ★もう一度入力。
[編集]

サービスの登録内容を確認する #

登録内容を cygrunsrv で確認する。

$ cygrunsrv -Q postmaster
Service postmaster exists       ★サービスに登録されている
Type                : Own Process
Current State       : Stopped
Controls Accepted   :

かわりに sc (Windows XP Professional のみ) を使っても良い。(2004-08-29)

$ sc query postmaster

SERVICE_NAME: postmaster
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
                                (NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
[編集]

5. PostgreSQL のデータディレクトリを作成する #

(原題: Create the PostgreSQL data directory)

この項は、READMEの手順とは異なる。

わざわざディレクトリを作るのは面倒なので initdb に作成させることにした。 よって、ここではなにもしない。

ちなみに、README では次のようにしている。

# mkdir -p /var/postgresql/data
[編集]

6. PostgreSQL のデータディレクトリの所有者を変更する #

(原題: Change ownership of the PostgreSQL data directory)

この項は、READMEの手順とは異なる。

わざわざディレクトリの所有者を変更するのは面倒なので、 initdb を postgres ユーザーで実行することにした。 よって、ここではなにもしない。

ちなみに、README では次のようにしている。

# chown postgres /var/postgresql/data
[編集]

7. cygserver を起動する #

(原題: Start cygserver)

この項は、READMEの手順とは異なる。

すでに cygserver を起動しているので、ここではなにもしない。

[編集]

8. PostgreSQL の初期化を行う #

(原題: Initialize PostgreSQL)

この項は、READMEの手順とは異なる。

まず、/var/postgresql/data がすでに存在する場合は、 消すなり、pg_dumpでバックアップを取るなりする。(2004-06-17)

次に、initdb を postgres ユーザ−で実行するために、 /usr/bin/postgres.exe を postgres ユーザーで実行できるよう権限を追加する。

$ ls -l /usr/bin/postgres   ★権限を確認
-rwxr-x---+   1 username  Users     2360320 Jun 11 23:36 /usr/bin/postgres

$ chmod o+rx /usr/bin/postgres.exe  
★ r(read) と x(execute) を追加 (2004.06.14 o=rx ではなく o+rx に修正)

$ ls -l /usr/bin/postgres   ★権限を確認
-rwxr-xr-x+   1 username  Users     2360320 Jun 11 23:36 /usr/bin/postgres

runasを使って、bash.exeをpostgresユーザで起動する。 (postgres ユーザーでログオンする方法 を参照)(2004-07-24)

  • 2005-11-26 補足 bashの中ではなく、コマンドプロンプトでrunasを実行するときはシングルクォートではなくダブルクォートを使うこと。
$ whoami  ★現在のユーザーを確認。
username
$ runas /user:postgres 'c:\cygwin\bin\bash.exe'
postgres のパスワードを入力してください:
c:\cygwin\bin\bash.exe をユーザー "HOSTNAME\postgres" として開始しています...

新しく開いたbashのコンソールで initdb を実行してデータベースクラスタを作成する。日本語を扱うつもりなので、--no-locale を追加している。

$ whoami   ★この bash が postgres ユーザーで実行されていることを確認
postgres

$ echo $CYGWIN   ★環境変数 CYGWIN に 'server' が入っていることを確認
server

$ initdb --no-locale -D /var/postgresql/data
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 C.

creating directory /var/postgresql/data... ok
creating directory /var/postgresql/data/base... ok
creating directory /var/postgresql/data/global... ok
creating directory /var/postgresql/data/pg_xlog... ok
creating directory /var/postgresql/data/pg_clog... ok
selecting default max_connections... 40
selecting default shared_buffers... 1000
creating configuration files... ok
creating template1 database in /var/postgresql/data/base/1... ok
initializing pg_shadow... ok
enabling unlimited row size for system tables... ok
initializing pg_depend... ok
creating system views... ok
loading pg_description... ok
creating conversions... ok
setting privileges on built-in objects... ok
creating information schema... ok
vacuuming database template1... ok
copying template1 to template0... ok
Success. You can now start the database server using:

    /usr/bin/postmaster -D /var/postgresql/data
or
    /usr/bin/pg_ctl -D /var/postgresql/data -l logfile start

なお、このとき作成された /var/postgresql/data の所有者とパーミッションは 次のようになった。(2005-03-02)

$ ls -ald /var /var/postgresql /var/postgresql/data
drwxrwx---+ 19 username Users 0 Nov 15 03:28 /var
drwx------+  2 postgres なし  0 Jun 12  2004 /var/postgresql
drwx------+  2 postgres なし  0 Dec 23 00:17 /var/postgresql/data
[編集]

9. postmaster を起動する #

(原題: Start postmaster)

postmasterは/var/log/postmaster.logにログを出力する。 今回はpostmasterを'postgres'ユーザの権限で起動するので、postmaster.logの所有者がpostgresでない場合 (過去に'postgres'ユーザ以外のユーザでpostmasterを起動した事がある場合)、 あらかじめ消去しておく事。postmaster サービスを起動できず、/var/log/postmaster.log も更新されないも参照。(2005-03-05)

次に、cygrunsrv コマンドを使って起動する。(2005-11-13 注意:今回作った'postgres'ユーザでは実行できないと思う。試していないが。サービスを起動/終了するにはAdministrator権限が必要だと思うので、そういうユーザを使うこと。PowerUserで出来るかどうか判らん。これも試していないので。)

$ cygrunsrv -S postmaster

$

あるいは、Windows の net コマンドや sc コマンド (Windows XP のみ) を 使っても良い。

$ net start postmaster
Cygwin PostgreSQL サービスを開始します.
Cygwin PostgreSQL サービスは正常に開始されました。
$ sc start postmaster

SERVICE_NAME: postmaster
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x2
        WAIT_HINT          : 0x1388
        PID                : 1424
        FLAGS              :
[編集]

10. postmaster が動作していることを確かめる #

(原題: Verify postmaster is running)

[編集]

サービスの稼働を確認 #

cygrunsrv コマンドを使って、サービスが動いていることを確かめる。

$ cygrunsrv -Q postmaster
Service postmaster exists
Type                : Own Process
Current State       : Running  ★稼働中
Controls Accepted   : Accept Stop, Accept Shutdown

あるいは、sc を使っても良い。(Windows XP Professonal のみ)(2004-08-29)

$ sc query postmaster

SERVICE_NAME: postmaster
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING   ★稼働中
                                (STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
[編集]

イベントログを確認 (2004-09-04) #

(注意:postgresql-7.4.5-1 で確認)

イベントビューアなどでログを確認する。

ここでは結果をファイルに残すのが容易なため、イベントビューアではなく Eventquery.vbs を使って表示している。 (Eventquery.vbs は Windows XP に添付されている。イベントログを調べるも参照のこと。)

$ cscript "c:\windows\system32\eventquery.vbs" /l application /fi "source eq po
stmaster" /r 1
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.


------------------------------------------------------------------------------
ホスト 'HOSTNAME' の 'application' ログのイベントを一覧表示しています。
------------------------------------------------------------------------------
 Type          Event  Date Time                Source            ComputerName
 ------------- ------ ------------------------ ----------------- --------------
 情報          0      2004/09/04 11:09:54      postmaster        HOSTNAME  ★
$ cscript "c:\windows\system32\eventquery.vbs" /l application /fi "source eq po
stmaster" /r 1 /fo list /v
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.


------------------------------------------------------------------------------
ホスト 'HOSTNAME' の 'application' ログのイベントを一覧表示しています。
------------------------------------------------------------------------------
Type:         情報
Event:        0
Date Time:    2004/09/04 11:09:54
Source:       postmaster
ComputerName: HOSTNAME
Category:     なし
User:         HOSTNAME\postgres
Description:  postmaster : PID 2724 : `postmaster' service started  ★
[編集]

postmaster のログを確認 #

ログの内容を確認する。

$ cat /var/log/postmaster.log
WARNING:  dup(0) failed after 3195 successes: Bad file descriptor
LOG:  database system was shut down at 2004-06-12 14:37:20
LOG:  checkpoint record is at 0/9DDFA0
LOG:  redo record is at 0/9DDFA0; undo record is at 0/0; shutdown TRUE
LOG:  next transaction ID: 536; next OID: 17142
LOG:  database system is ready
[編集]

UNIX System V IPC の使用状況を確認 #

IPCの使用状況を確認する。(2004-06-15)

$ ipcs
Message Queues:
T     ID               KEY        MODE       OWNER    GROUP

Shared Memory:
T     ID               KEY        MODE       OWNER    GROUP
m 131072              5432001 --rw------- postgres     なし

Semaphores:
T     ID               KEY        MODE       OWNER    GROUP
s 131072              5432001 --rw------- postgres     なし
s 131073              5432002 --rw------- postgres     なし
s 131074              5432003 --rw------- postgres     なし
[編集]

UNIX DOMAIN Socket を確認 #

UNIX DOMAIN Socket を確認する。 *1

$ ls -l /tmp/.s.PGSQL.5432*
srwxrwxrwx    1 postgres なし           51 Sep  2 00:23 /tmp/.s.PGSQL.5432
-rw-------    1 postgres なし           26 Sep  2 00:23 /tmp/.s.PGSQL.5432.lock
[編集]

TCP のポートを確認 #

TCP/IP接続も許可 (postmaster -i) しているので、ポートの使用状況を確認する。(2004-06-15)

$ netstat -a -n | grep 5432
  TCP    0.0.0.0:5432           0.0.0.0:0              LISTENING
[編集]

11. PostgreSQL に接続する #

(原題: Connect to PostgreSQL)

[編集]

UNIX Domain Socket で接続 #

デフォルトの UNIX Domain Socket 経由で接続してみる。

$ psql -U postgres template1
Welcome to psql 7.4.2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

template1=# \q
[編集]

TCP/IP で接続 #

この項はREADMEには存在しない。

TCP/IP接続を有効 (postmaster -i) にしており、localhost からの接続は許可されている

$ psql -h localhost -U postgres template1  ★ -h localhost を追加。
Welcome to psql 7.4.2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

template1=# \q

ちなみに、/var/postgresql/data/pg_hba.conf の該当個所はこうなっている。 pg_hba.conf は postgres ユーザしか見ることができないので、 runasを使って、bash.exeをpostgresユーザで起動して確認する。 (postgres ユーザーでログオンする方法 を参照)

# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD

local   all         all                                             trust
# IPv4-style local connections:
host    all         all         127.0.0.1         255.255.255.255   trust
# IPv6-style local connections:
#host    all         all         ::1              ffff:ffff:ffff:ffff:fff
f:ffff:ffff:ffff        trust
  • 補足 (2004-07-25)
    TCP/IP経由の接続の確認は、例えば Java (JDBC Type 4) とか CSE(「Common SQL Environment) から 使う場合の確認手段としても有用。
[編集]

12. PostgreSQL を停止する (2004-06-15) #

この項は、READMEには存在しない

PostgreSQL を停止し、正常に停止すること確認しておく。

cygrunsrv コマンドを使って停止する。

$ cygrunsrv -E postmaster

$

あるいは、Windows の net コマンドや sc コマンド (Windows XP のみ) を使って停止する。(2004-08-29)

$ net stop postmaster
Cygwin PostgreSQL サービスを停止中です.
Cygwin PostgreSQL サービスは正常に停止されました。

$ sc stop postmaster

SERVICE_NAME: postmaster
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 3  STOP_PENDING
                                (STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x2
        WAIT_HINT          : 0x5208
[編集]

ログを確認 #

postmaster のログを確認する。

$ tail /var/log/postmaster.log
    :(略)
LOG:  database system is ready
LOG:  received fast shutdown request  ★ここで「高速シャットダウン」要求を受信
LOG:  shutting down
LOG:  database system is shut down  ★停止したようだ
[編集]

イベントログを確認 (2004-09-04) #

イベントログを確認する。イベントビューアでもよいが、ここでは Eventquery.vbs (Windows XP に添付)を使った。

一覧

$ cscript "c:\windows\system32\eventquery.vbs" /l application /fi "source eq po
stmaster" /r 1
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.


------------------------------------------------------------------------------
ホスト 'HOSTNAME' の 'application' ログのイベントを一覧表示しています。
------------------------------------------------------------------------------
 Type          Event  Date Time                Source            ComputerName
------------- ------ ------------------------ ----------------- --------------
 情報          0      2004/09/04 11:12:29      postmaster        HOSTNAME

詳細

$ cscript "c:\windows\system32\eventquery.vbs" /l application /fi "source eq po
stmaster" /r 1 /fo list /v
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.


------------------------------------------------------------------------------
ホスト 'HOSTNAME' の 'application' ログのイベントを一覧表示しています。
------------------------------------------------------------------------------
Type:         情報
Event:        0
Date Time:    2004/09/04 11:12:29
Source:       postmaster
ComputerName: HOSTNAME
Category:     なし
User:         HOSTNAME\postgres
Description:  postmaster : PID 2724 : `postmaster' service stopped, exit status:
 0
[編集]

System V IPC を確認 #

IPCを確認。ちゃんと無くなっている。

$ ipcs
Message Queues:
T     ID               KEY        MODE       OWNER    GROUP

Shared Memory:
T     ID               KEY        MODE       OWNER    GROUP

Semaphores:
T     ID               KEY        MODE       OWNER    GROUP
[編集]

UNIX DOMAIN socket を確認 #

UNIX DOMAIN socket を確認。無くなっている。

$ ls -l /tmp/.s.PGSQL.5432*
ls: /tmp/.s.PGSQL.5432*: No such file or directory
[編集]

TCP/IP のポートを確認 #

TCP/IPのポートを確認。ポートも未使用になった。

$ netstat -a -n | grep 5432
*1 訂正 2004-09-02 間違って「ls -lF」の結果を載せていたので訂正しました。(「/tmp/.s.PGSQL.5432=」→「/tmp/.s.PGSQL.5432」)ご指摘感謝します。