YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

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

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

UNIX magazine 2008年1月号


季刊なってから逆に毎号毎号楽しく読めるようになった気がする.まあ季刊になる前はOSとかアーキテクチャに全くと言っていいほど関心なかったことも関係してるんだけど.
今号はファイルシステム大特集.様々なファイルシステムに関してかなり詳しいところまで書いてあって読み応え有り.書き方も概論から各論という形になっているので,概論だけ先に読んで各ファイルシステムの違いをざっと理解するのもいいし,ZFSみたいな気になるファイルシステムのところだけ読んでいても楽しい.特に各論は絵がかなりわかりやすいと思う.

libpqxx & gcc で遊んでみる

上記サイトからlibpqxx2.6.9.tar.gzを落としてきて展開しビルド.

# tar xzf libpqxx-2.6.9
# ./configure --prefix=/usr
# make
# make install
# pkg-config --libs libpqxx
-lpqxx

これでzuzaraにあるコードでテストしてみる.

#include <iostream>
#include <pqxx/pqxx>

using namespace std;
using namespace pqxx;

int main() 
{
    try {
        connection conn("dbname=testdb");
        work T(conn);
        result R(T.exec("select * from test"));
        for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
            cout << c[0].as(string()) << "\t" << c[1].as(string()) << endl;
        }
        T.commit();
        conn.disconnect();
    }
    catch (const exception &e) {
        cerr << e.what() << endl;
        return 1;
    }
    return 0;
}

オンラインチュートリアルとDoxygenによるリファレンスはここ.

またおいおい書いていこう.