YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

CygwinでPostgreSQL8.0を動かす

動機

研究に行き詰まってきたので打開策としてRDBMSを導入することにしてみた.

方法

参照

CygwinPostgreSQLをインストールするところから.これがまたはまりどころが多かった.やっぱりCygwinってWindowsで動いているだけあって結構面倒.

一番上のサイトは英語だけど,一番わかりやすかった.下二つのサイトは手順はわかりやすく書いてあるんだけど,失敗しなかった場合のストレートなやり方しか書いてない.

cygserverを走らせる
# cygserver-config
とにかくyes
# cygrunsrv -I cygserver -p /usr/sbin/cygservser.exe
# cygrunsrv -S cygserver

でもって,このあたりがWindows特有の作業.

ユーザpostgres関連
# net user postgres $password /add /fullname:postgres /comment:'PostgreSQL user accout' /homedir:"$(cygpath -w /home/postgres)"
# mkpasswd -l -u postgres >> /etc/passwd
# passwd postgres

これでWindowsにPostgreSQL用のユーザpostgresを作成できました.今度はPostgreSQLのデータ格納用スペースを確保.

# rm -rf /var/postgresql
# mkdir /var/postgresql
# mkdir /var/postgresql/data
# chown postgres /var/postgresql/data

でもって,一番ややこしいところ.ユーザpostgresでCygwinを立ち上げる.# で始まるコンソールは管理者権限ユーザの窓,$ で始まるコンソールはpostgresの窓.

# runas /user:postgres "C:\cygwin\bin\bash.exe --login -i"
$ export CYGWIN=server
$ /usr/sbin/initdb.exe -D /var/postgresql/data
invalid binary "/usr/sbin/initdb"
# chmod o+rX /usr/sbin/initdb /usr/sbin/postgres
$ /usr/sbin/initdb.exe -D /var/postgresql/data
(略)
Success. You can now start the database server using:

/usr/sbin/postmaster -D /var/postgresql/data 
or
/usr/sbin/pg_ctl -D /var/postgresql/data -l logfile
$ exit

postgreの窓は上記の作業のみ開くこと.そうしないと下手にバイナリ動かすとさわったファイルの権限を変更しちゃったりして面倒らしい.このあとはPostgreSQLをWindowsのサービスとして登録.

# cygrunsrv --install postmaster --path /usr/sbin/postmaster \
--args "-D /var/postgresql/data -i" --dep cygserver \
--user postgres --termsig INT -e "CYGWIN=server" --shutdown

# cygrunsrv --start postmaster
# cygrunsrv -Q postmaster
Service postmaster exists
Type                : Own Process
Current State       : Running 
Controls Accepted   : Accept Stop, Accept Shutdown 

上手く行くとこれで動く.自分の場合は一度しか成功しなかったけど.もし,下記の様なエラーが出た場合はscコマンドを用いて回避.

cygrunsrv: Error installing a service: OpenService:  Win32 error 1073:
指定されたサービスは既に開始されています。
# sc delete postmaster

しかしまたエラーが発生!

# cygrunsrv --start postmaster
cygrunsrv: Error starting a service: StartService:  Win32 error 1069:
ログオンに失敗したため、サービスを開始できませんでした。

とりあえず[コントロールパネル]-[管理ツール]-[サービス]-[postmaster]を選択.右クリックで[プロパティ]-[ログオン]-[ローカルシステムアカウント]とかに変更してみたけどやっぱりダメ.

結局pg_ctlで実行

仕方ないのでpg_ctlを使ってみたらあっさり稼働.

# /usr/sbin/pg_ctl.exe -D /var/postgresql/data -l logfile start

よくわからんなぁ.あとは一通りユーザを作ったり,データベース作ったりしてみる.途中でエラーが出る場合はたいていが権限関係だから適宜chmodとかchownとかで対処.

# createuser -U postgres YOUR_USER_NAME_ON_WINDOWS
# createdb -U postgres DB_NAME
# psql -U postgres DB_NAME
> create table TABLE_NAME (int id primary key, varchar(128) name not null, text nickname);

追記

違うマシンで同じようにインストールしたらどうもうまくいかない.上で「権限関係」とあっさり書いたところではまってしまった.LinuxやBSDで入れたときはこうはならなかったのに,Cygwinめぇ.
結局やけくそになって

# chmod -R 777 /var/postgresql/data

という荒技を使ったら解決.問題ありありだけどね.