ページ更新: 2006-06-17 (土) (6126日前)

メモとかトラブルシューティングとか。

目次

[編集]

[エラー] cygserverをコマンドラインから起動すると「failed to create named pipe: is the daemon already running?」と表示される (2005-09-30) #

[教えて!goo] cygserverが起動しません・・(Cygwin)より。

cygserverがすでにNTサービスとして稼働しているとき、もう一つcygserverをコマンドラインから起動するとエラーが発生する。

Windows NT系(NT/2000/XPなど)で cygserver-configを実行すると、cygserverはサービスに登録される。 このサービスのスタートアップの種類は「自動」で登録されているため、OSを再起動するとcygserverはサービスとして起動する。

すでにcygserverが動作しているときに、もう1つcygserverを起動すると、このエラーが発生する。

[編集]

再現手順 #

cygserverサービスを起動し、次にcygserverをもう一つ実行する

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

$ /usr/sbin/cygserver.exe
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: Shutdown finished.   ★ctrl-Cで強制終了した

cygserverサービスを停止すると、cygserver.exeをちゃんと実行できるようになる。

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

$ /usr/sbin/cygserver.exe
cygserver: Initialization complete.  Waiting for requests.
cygserver: Shutdown finished.   ★ctrl-Cで強制終了した
[編集]

解決方法 #

次のいずれか

[編集]

[エラー] cygwin 1.5.18-1 + postgresql 7.4.5-1でpostmasterが起動できない(Segmentation faultが起きる) (2005-08-25) #

Cygwin なんでも掲示板 No.2996 [PostgreSQL]postmaster起動時のエラー対処方法についてより。

[編集]

障害内容 #

cygwin 1.5.18-1 + postgresql 7.4.5-1 にて、 postmasterを起動しようとするとSegmentation faultが発生し、postmasterが起動できない。

[編集]

情報と対処方法 #

このエラーはメーリングリストの次のメールで報告されている。

解決方法は同じく:

これによると、2005-Aug-06のCygwin Snapshotsで修正(対策)されたとのこと。

よって、次のいずれかの作業を行えばよいはず。

今回は、Cygwin Snapshotsでより新しいcygwin1.dllを入れることにした。 なぜなら古いcygwin1.dllではちゃんと動いていただろうから、わざわざ検証する意味も少ないので。 (もちろん古いcygwin1.dllを使った方がたぶん無難なので、あまりお勧めしないが)

もっとも、PostgreSQLをCygwinで動かさないってのもテかと (2005-10-25)

  • ''WindowsネイティブのPostgreSQL 8.X.X(出てから半年以上経った)に移行するとか、
  • VMware Workstationを1本買って、その上でLinux動かして、開発者はフリーのVMware Playerで実行させるとか。
[編集]

追試手順 #

Windows 2000 Professional SP4 (VMware上の環境) に、cygwinのデフォルトパッケージと postgresqlパッケージのみを入れて検証した。

インストール手順は省く。c:\cygwinにインストールした。

$ cygserver-config
: (略)

$ /usr/sbin/cygserver &
: (略)

$ export CYGWIN=server

$ ipcs
: (略)

$ mkdir pgdata

$ initdb --no-locale -D pgdata
: (略)

postmasterを起動すると、Segmentation faultが発生する。

$ postmaster -D pgdata
Segmentation fault (core dumped)

coreの解析も行うべきだろうが、省略。

[編集]

Cygwin Snapshotsを入れてみる #

現時点での最新版 2005-Aug-24 を試してみる。

[編集]

cygwin1.dllのみを入れ替えた場合 #

cygwin1-20050824.dll.bz2 をダウンロードする。

展開する。(オプションは -v:vervose -k:keep-file -d:decompress)

$ bunzip2 -vkd cygwin1-20050824.dll.bz2
  cygwin1-20050824.dll.bz2: done

$ ls
cygwin1-20050824.dll
cygwin1-20050824.dll.bz2

Cygwinのソフトウェア(bashやcygserverも)をすべて終了したのち、 エクスプローラーなどを使ってc:\cygwin\bin\cygwin1.dllに上書きコピーする。

再度、postmasterを起動すると、エラーは発生せず、起動できた。

(cygserverの起動、環境変数CYGWINの設定は省略)
$ postmaster -D pgdata
WARNING:  dup(0) failed after 3196 successes: Bad file descriptor
LOG:  database system was shut down at 2005-08-25 19:21:16
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
[編集]

cygwin1.dllとその周辺ファイルをすべて入れ替えた場合 #

cygwin-inst-20050824.tar.bz2 をダウンロードする。

展開する。展開先(-C)は/なので、既存のファイルを直接上書きしている。

$ tar jxvf cygwin-inst-20050824.tar.bz2 -C /
etc/
etc/defaults/
etc/defaults/etc/
etc/defaults/etc/cygserver.conf
usr/
usr/bin/
usr/bin/cygcheck.exe
usr/bin/cygpath.exe
usr/bin/cygserver-config
usr/bin/cygwin1.dll
tar: usr/bin/cygwin1.dll: Cannot open: File exists   ★bashやtarが使用中なので上書きできない
usr/bin/dumper.exe
usr/bin/getfacl.exe
usr/bin/ipcrm.exe
usr/bin/ipcs.exe
usr/bin/kill.exe
usr/bin/mkgroup.exe
usr/bin/mkpasswd.exe
usr/bin/mount.exe
usr/bin/passwd.exe
usr/bin/ps.exe
usr/bin/regtool.exe
usr/bin/setfacl.exe
usr/bin/ssp.exe
usr/bin/strace.exe
usr/bin/umount.exe
usr/include/
 : (略)
usr/share/man/man7/regex.7
tar: Error exit delayed from previous errors

cygwin1.dllだけを別途展開する。

$ tar jxvf cygwin-inst-20050824.tar.bz2 usr/bin/cygwin1.dll
usr/bin/cygwin1.dll

Cygwinのソフトウェア(bashやcygserverも)をすべて終了したのち、 エクスプローラーなどを使ってc:\cygwin\bin\cygwin1.dllに上書きコピーする。

再度、postmasterを起動すると、エラーは発生せず、起動できた。

 (cygserverの起動、環境変数CYGWINの設定は省略)
$ postmaster -D pgdata
WARNING:  dup(0) failed after 3196 successes: Bad file descriptor
LOG:  database system was shut down at 2005-08-25 20:00:32
LOG:  checkpoint record is at 0/9DE078
LOG:  redo record is at 0/9DE078; undo record is at 0/0; shutdown TRUE
LOG:  next transaction ID: 538; next OID: 17142
LOG:  database system is ready
[編集]

[メモ] cygserverをサービスから削除する (2005-01-28) #

サービスに登録されたcygserverをサービスから削除するには、cygrunsrv を使って次のようにする。

$ cygrunsrv -E cygserver  ★サービスを停止する。
$ cygrunsrv -Q cygserver  ★停止を確認する。
Service cygserver exists
Type                : Own Process
Current State       : Running
Controls Accepted   : Accept Stop

$ cygrunsrv -R cygserver  ★サービスから削除する。

$ cygrunsrv -Q cygserver  ★削除したことを確認する。
cygrunsrv: Error querying a service: OpenService:  Win32 error 1060:
指定されたサービスはインストールされたサービスとして存在しません。
  • 2005-11-21 サービス停止を誤ってcygrunsrv -S と書いていた。修正。

cygrunsrvのこれらのオプションの説明を知りたいときは cygrunsrv --help を実行すれば 表示される。より詳しく知りたいときは /usr/share/doc/Cygwin/cygrunsrv.README を見ること。

なお、Windows XP Professionalの場合、付属の sc (Windows XP Professional のみ) を 使って同じことができる。

$ 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

$ sc stop cygserver

SERVICE_NAME: cygserver
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 3  STOP_PENDING
                                (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x2
        WAIT_HINT          : 0x5208

$ sc delete cygserver
[SC] DeleteService SUCCESS

$ sc query cygserver
[SC] EnumQueryServicesStatus:OpenService FAILED 1060:
[編集]

[エラー] Cygwin+PostgreSQLでWindowsハンドルの開放漏れ? (2004-12-21) #

http://ml.postgresql.jp/pipermail/pgsql-jp/2004-December/018061.html

http://ml.postgresql.jp/pipermail/pgsql-jp/2004-December/thread.html#18061

http://ml.postgresql.jp/pipermail/pgsql-jp/2004-December/018077.html

  • Tue, 21 Dec 2004 20:15:44 +0900 (JST) 時点では未解決のとのこと。
  • Cygwin 1.5.11-1と最新のSNAPSHOTで試したとのこと。
[編集]

追試 #

追試、とは言っても環境が違うけど。(Cygwin 1.5.12-1, cygserver 1.11, Windows XP SP1)

2004-12-22 時点の最新版 Cygwin 1.5.12-1 と cygserver の情報。

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

$ /usr/sbin/cygserver --version
cygserver: (cygwin) 1.11
API version 1.5.12(0.116/4/1)-(3.0.0.2) 2004-11-10 08:34
Copyright 2001, 2002, 2003 Red Hat, Inc.
Compiled on Nov 10 2004
Default configuration file is /etc/cygserver.conf

postgresql.confの内容。

max_connections = 40
shared_buffers = 1000		# min 16, at least max_connections*2, 8KB each
checkpoint_timeout = 30		# range 30-3600, in seconds
log_statement = true
lc_messages = 'C'		# locale for system error message strings
lc_monetary = 'C'		# locale for monetary formatting
lc_numeric = 'C'		# locale for number formatting
lc_time = 'C'			# locale for time formatting

cygserverとpostmasterはNTサービスとして実行。 コンピュータの管理→パフォーマンスログと警告→カウンタログに cygserverのログ設定を作り、ハンドル数をc:\PerfLogs\cygserverに出力するように したのち、ログ取得を開始。

tailでログを監視。

$ tail -f /c/PerfLogs/cygserver_20041223.tsv
"12/23/2004 00:08:18.699"       "84"
"12/23/2004 00:08:33.696"       "84"
"12/23/2004 00:08:48.693"       "84"
"12/23/2004 00:09:03.690"       "84"
"12/23/2004 00:09:18.687"       "84"
"12/23/2004 00:09:33.684"       "84"
"12/23/2004 00:09:48.681"       "84"
 : (略)
"12/23/2004 12:43:16.958"	"84"
"12/23/2004 12:43:31.958"	"85"
"12/23/2004 12:43:46.958"	"85"
 : (略)
"12/23/2004 18:52:01.418"	"85"
"12/23/2004 18:52:16.418"	"84"
"12/23/2004 18:52:31.418"	"84"
"12/23/2004 18:52:46.418"	"84"
"12/23/2004 18:53:01.418"	"84"
"12/23/2004 18:53:16.418"	"84"
[編集]

[エラー] now() の値が18時間ずれる (2004-09-30) #

直接関係ないが、「[pgsql-jp: 34019] PostgreSQLのnow() がシステムクロックとずれる現象」を見て、TZの設定について書いてなかったことに気がついたので。

今回もトラブルシューティングをかねて、ちまちまと周りから攻めてみる。

  • 補足 (2004-10-24)

postgresql.conf に timezone 設定があるね。しかも環境変数TZを見るって書いてあるし。

# - Locale and Formatting -
(中略)
#timezone = unknown		# actually, defaults to TZ environment setting

でも、Debian Sarge の postgresql-7.4.5-3 もここがコメントアウトされてるのだよな。

localeがまともに実装されているからかな? と思う。

[編集]

環境 #

Windows XP SP1 を使用。Cygwinのパッケージはこんなの。

$ cygcheck -cd cygwin postgresql
Cygwin Package Information
Package              Version
cygwin               1.5.11-1
postgresql           7.4.5-1
[編集]

psql では #

now()の結果がおかしい (18時間ずれる)

まずはbash上で環境変数を確認。どちらも未定義。

$ echo $TZ

$ echo $PGTZ

psqlでshow TimeZone;してみる。

$ psql -c 'show TimeZone;'
 TimeZone
-----------
 -09:00:00
(1 row)

psqlで now() してみる。 と、(24+1)-7 = 18時間ずれてる。 (18 = 9 x 2 な訳で、処理が2重に行われている?)

$ date; psql -c 'select now();'
Thu Sep 30 01:12:13     2004
             now
-----------------------------
 2004-09-29 07:12:13.6755-09
(1 row)

TZを定義してみる。改善せず。

$ date; TZ=JST-9 psql -c 'select now();'
Thu Sep 30 01:12:28     2004
             now
-----------------------------
 2004-09-29 07:12:28.1595-09
(1 row)

PGTZを定義してみる。OK。

$ date; PGTZ=JST-9 psql -c 'select now();'
Thu Sep 30 01:12:38     2004
             now
-----------------------------
 2004-09-30 01:12:38.6505+09
(1 row)
  • なお、Debian GNU/Linux (sarge) の postgresql-7.4.5-3 ではマトモ。
[編集]

CSE #

libpq.dll (PostgreSQL 6.5の) を使用。

同様。システム環境変数 PGTZ を設定すると、大丈夫。

[編集]

Java #

/usr/share/postgresql/java/postgresql.jar を使って、次のコードを実行。 あるいは PostgreSQL JDBC Driver の pg74.215.jdbc3.jar を使用。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class PostgreSQLTrial {
    public static void main(String[] args) {
        System.out.println(Calendar.getInstance().getTime());
        PostgreSQLTrial trial = new PostgreSQLTrial();
        try {
            trial.doProcess();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    void doProcess() throws Exception {
        Class.forName("org.postgresql.Driver");
        Connection c = DriverManager.getConnection("jdbc:postgresql:dbname", 
                           "postgres", "password");
        Statement s = c.createStatement();
        try {
            ResultSet rs = s.executeQuery("select now();");
            while(rs.next()) {
                String now = rs.getString("now");
                System.out.println("now='" + now + "'");
            }
        } finally {
            s.close();
            c.close();
        }
    }
}

結果 いずれのJDBCドライバでも、ずれている。

Thu Sep 30 01:26:06 JST 2004
now='2004-09-29 07:26:06.367125-09'

同様にずれている。PGTZ を定義しても直らず。

postmaster の起動オプション(cygrunsrvの--env)で TZ=GMT すると、 正しい値が出る。(1+24)-16 = 9。Time Zone が GMT (+00) だけど。

Thu Sep 30 01:42:50 JST 2004
now='2004-09-29 16:42:51.197875+00'

ということは、postmaster のTZの処理がおかしい?

そこで、システム環境変数 TZ に「JST-9」を指定、Windowsを再起動し (postmasterをNTサービスとして動かしているので)、試したところ、 正常になった。

Thu Sep 30 02:05:43 JST 2004
now='2004-09-30 02:05:44.67325+09'
[編集]

結局、 #

psql と CSE (libpq.dllを使う物)は 環境変数 PGTZ に「JST-9」を入れれば解決できる。

また、Javaを使うなら、PGTZ は定義せずに(しても良いかも知れないが試していない)、 TZに「JST-9」を設定する。

ちなみに、6.5のlibpq.dllだと、PGTZ を見ているようだ。

$ strings libpq.dll | grep -C 3 PGTZ
client_encoding
PGCLIENTENCODING
timezone
PGTZ
datestyle
PGDATESTYLE
Backend-Debug-Options

Cygwin の postgresql の pq.dll も同じ。

$ strings pq.dll | grep -C 3 PGTZ
SSL-Mode
PGDATESTYLE
datestyle
PGTZ
timezone
PGCLIENTENCODING
client_encoding
[編集]

[エラー] postmaster を動作させたまま initdb を実行すると、initdb が失敗する (2004-09-09) #

(作成中。)

$ uname -a
CYGWIN_NT-5.1 hostname 1.5.11(0.116/4/2) 2004-09-04 23:17 i686 unknown unknown Cygwin

$ cygcheck -cd cygwin postgresql
Cygwin Package Information
Package              Version
cygwin               1.5.11-1
postgresql           7.4.5-1

$ /usr/sbin/cygserver --version
cygserver: (cygwin) 1.10
API version 1.5.11(0.116/4/1)-(3.0.0.2) 2004-09-04 23:17
Copyright 2001, 2002, 2003 Red Hat, Inc.
Compiled on Sep  4 2004
Default configuration file is /etc/cygserver.conf
$ pwd
/home/username/tmp
$ initdb --no-locale -D ./a
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 ./a... ok
creating directory ./a/base... ok
creating directory ./a/global... ok
creating directory ./a/pg_xlog... ok
creating directory ./a/pg_clog... ok
selecting default max_connections... 10     ★あれ?
selecting default shared_buffers... 50      ★あれ?
creating configuration files... ok
creating template1 database in ./a/base/1... FATAL:  could not create semaphores
: No space left on device
DETAIL:  Failed system call was semget(1, 17, 03600).
HINT:  This error does *not* mean that you have run out of disk space.
        It occurs when either the system limit for the maximum number of semapho
re sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), woul
d be exceeded.  You need to raise the respective kernel parameter.  Alternativel
y, reduce PostgreSQL's consumption of semaphores by reducing its max_connections
 parameter (currently 10).
        The PostgreSQL documentation contains more information about configuring
 your system for PostgreSQL.

initdb: failed
initdb: removing data directory "./a"
$ net stop cygserver
CYGWIN cygserver サービスを停止中です.
CYGWIN cygserver サービスは正常に停止されました。

エラーメッセージに従い、SEMMNI か SEMMNS を増やしてみる。

/etc/cygserver.conf を編集。README にちょっと書いてあるので、 semmns を増やしてみる。

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

$ ipcs
Message Queues:
T     ID               KEY        MODE       OWNER    GROUP

Shared Memory:
T     ID               KEY        MODE       OWNER    GROUP

Semaphores:
T     ID               KEY        MODE       OWNER    GROUP
$ net start postmaster
CYGWIN PostgreSQL サービスを開始します.
CYGWIN PostgreSQL サービスは正常に開始されました。
$ ipcs
Message Queues:
T     ID               KEY        MODE       OWNER    GROUP

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

Semaphores:
T     ID               KEY        MODE       OWNER    GROUP
s  65536              5432001 --rw------- postgres     なし
s  65537              5432002 --rw------- postgres     なし
s  65538              5432003 --rw------- postgres     なし
$ initdb --no-locale -D ./c
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 ./c... ok
creating directory ./c/base... ok
creating directory ./c/global... ok
creating directory ./c/pg_xlog... ok
creating directory ./c/pg_clog... ok
selecting default max_connections... 50
selecting default shared_buffers... 1000
creating configuration files... ok
creating template1 database in ./c/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 ./c
or
    /usr/bin/pg_ctl -D ./c -l logfile start

$
[編集]

ipcs のオプション #

(作成中。Cygwin/cygserver に書いたほうがよいかも。)

$ ipcs -h
usage: ipcs [-abchmopqstuMQST]
ipcs prints information for IPC resources for which you have read access.
  -a   Show the maximum amount of information possible when displaying
       active semaphores, message queues and shared memory segments
       (This is shorthand for specifying -bcopt).
  -b   Show the maximum allowed sizes for active semaphores, message queues
       and shared memory segments.  The maximum allowed size is the maximum
       number of bytes in a message on a message queue, the size of a shared
       memory segment, or the number of semaphores in a set of semaphores.
  -c   Show the creator's name and group for active semaphores, message
       queues, and shared memory segments.
  -h   This help.
  -m   Display information about active shared memory segments.
  -o   Show outstanding usage for active message queues and shared memory
       segments.  The outstanding usage is the number of messages in a
       message queue, or the number of processes attached to a shared memory
       segment.
  -p   Show the process ID information for active semaphores, message queues
       and shared memory segments.  The process ID information is the last
       process to send a message to or receive a message from a message
       queue, the process that created a semaphore, or the last process to
       attach or detach a shared memory segment.
  -q   Display information about active message queues.
  -s   Display information about active semaphores.
  -t   Show access times for active semaphores, message queues and shared
  -u   Show system wide usage of IPC resources.  This information is added
       as a list after the appropriate shared memory, messages queue or
       semaphore information output
  -M   Display system information about shared memory.
  -Q   Display system information about messages queues.
  -S   Display system information about semaphores.
  -T   Display system information about shared memory, message queues and
       semaphores.

$
[編集]

[メモ] postgresql.conf で log_statement = true にしたときのログ (2004-08-25) #

postgresql.conf で log_statement = true にして、pgbench を実行したときのログ。

LOG:  statement: SET search_path = public
LOG:  statement: select count(*) from branches
LOG:  statement: vacuum branches
LOG:  statement: vacuum tellers
LOG:  statement: delete from history
LOG:  statement: vacuum history
LOG:  statement: SET search_path = public
LOG:  statement: begin
LOG:  statement: update accounts set abalance = abalance + 315 
where aid = 48941
	
LOG:  statement: select abalance from accounts where aid = 48941
LOG:  statement: update tellers set tbalance = tbalance + 315 
where tid = 5
	
LOG:  statement: update branches set bbalance = bbalance + 315 
where bid = 1
LOG:  statement: insert into history(tid,bid,aid,delta,mtime) 
values(5,1,48941,315,'now')
LOG:  statement: end
LOG:  statement: begin
LOG:  statement: update accounts set abalance = abalance + 212 
where aid = 90882
	
LOG:  statement: select abalance from accounts where aid = 90882
LOG:  statement: update tellers set tbalance = tbalance + 212 
where tid = 9
	
LOG:  statement: update branches set bbalance = bbalance + 212 
where bid = 1
LOG:  statement: insert into history(tid,bid,aid,delta,mtime) 
values(9,1,90882,212,'now')
LOG:  statement: end
(以後、略)

postgresql.conf については:
実行時の設定

[編集]

[メモ] PostgreSQL を OS の終了時に終了させる (2004-07-26) #

(この項、いまさらかな、とは思うけど。)

Windows NT 系(Windows 2000、Windows XP も含む)であれば、 サービスに登録すれば、OS の終了時には PostgreSQL も正常に終了される。

以下に、ちゃんと正常終了していることを確認したときの操作とログを示す。

以下の例の前提条件

  • PostgreSQL をサービスに登録してある
  • PostgreSQL のサービスは自動起動にしていないため、任意の時点に PostgreSQL を起動できる。
    (もちろん、自動起動にしてもよい)
  • 終了方法の種類はサービスの登録時に cygrunsrv のコマンドラインで指定する。 ここでは README のとおり「高速シャットダウン」(cygrunsrv で --termsig INT)を 使っている。(サービスである以上、終了に時間はかけられないし)
$ net start postmaster   ★PostgreSQL サービスを起動する
$ cat /var/log/postmaster.log   ★状態を見る。
WARNING:  dup(0) failed after 3195 successes: Bad file descriptor
LOG:  database system was shut down at 2004-07-26 00:00:00
LOG:  checkpoint record is at 0/4323330
LOG:  redo record is at 0/4323330; undo record is at 0/0; shutdown TRUE
LOG:  next transaction ID: 6032; next OID: 321673
LOG:  database system is ready   ★起動している。

ここでWindows を再起動し、ログを見ると正常に終了できていることがわかる。

$ cat /var/log/postmaster.log
(略)
LOG:  database system is ready    ★ここまでが起動時点のログ。
LOG:  received fast shutdown request  ★「高速シャットダウン」
LOG:  shutting down
LOG:  database system is shut down ★ちゃんと終了している。
[編集]

[エラー] postgresql パッケージのバージョンアップ後にサービスを起動すると「サービスはエラーを報告しませんでした」エラーで起動できない (2004-06-24) #

postgresql をサービスとして使っているときに、パッケージを入れ替えた後、 サービスを起動しようとすると、「サービスはエラーを報告しませんでした」エラーが出て起動できない。

このエラーのトラブルシューティングと解消手順について。

  1. ログ (/var/log/postmaster.log) に次にエラーメッセージが記録されているはずなので確認する。
    FATAL:  /usr/bin/postmaster: could not locate postgres executable
  2. エラーを解消するには /usr/bin/postmaster の権限を追加する。具体的には、Other に読み取り権限・実行権限を追加してやる。
    $ chmod o+rx /usr/bin/postgres.exe
  3. postmaster サービスを起動してログを調べ、ちゃんと動いてたら psqlで接続して動作を確認。
[編集]

トラブルシューティングの例 (2004-08-28) #

たとえば postgresql-7.4.3-1 をサービスに登録しているとき、 postmaster サービスを一旦停止し、postgresql-7.4.5-1 に入れ替えて、 再度 postmaster サービスを起動しようとすると、次のエラーがでて起動しない。

$ net start postmaster
Cygwin PostgreSQL サービスを開始します.
Cygwin PostgreSQL サービスを開始できませんでした。

サービスはエラーを報告しませんでした。

NET HELPMSG 3534 と入力すると、より詳しい説明が得られます。

エラー 3534 は「サービスはエラーを報告しませんでした」ということ。念のため、net helpmsg コマンドで確認する。

$ net helpmsg 3534

サービスはエラーを報告しませんでした。
[編集]

パッケージのチェック #

パッケージが正常にインストールされているかどうか調べる。
(もっとも、この作業はトラブルが出た時点ではなく、setup.exe で新しい postgresql パッケージをインストールした直後に行った方がよいだろう。)

最初に postgresql パッケージのみをチェックする。 (すぺてのパッケージをチェックすると、パッケージが多い場合時間がかかるので)。 問題なし。

$ cygcheck -c postgresql
Cygwin Package Information
Package              Version        Status
postgresql           7.4.5-1        OK

すべてのパッケージをチェックする。問題なし。
(補足。所要時間は、手元の Cygwin + CyGNOME で パッケージ数 630 の場合、18秒〜2分。)

$ cygcheck -c | grep -v OK
Cygwin Package Information
Package                 Version                     Status

2004-08-29 'grep -vi OK' を 'grep -v OK' に修正。パッケージ名が 'book' を含むものを調べられなかったため)

もし失敗していたら、setup.exe で 'reinstall' を選んで再インストールする。

[編集]

イベントログを調べる #

「サービスはエラーを報告しませんでした。」なので、 イベントログには「エラー」分類のログは残っていないだろう。 しかし、なんらかの情報があるかも知れないので確認してみる。

このときのイベントログの内容は:

$ cscript "c:\windows\system32\eventquery.vbs" /l application /fi "source eq po
stmaster" /r 5
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/08/27 23:53:16      postmaster        HOSTNAME  ★
 情報          0      2004/08/27 23:53:15      postmaster        HOSTNAME  ★
 情報          0      2004/08/25 1:22:32       postmaster        HOSTNAME
 情報          0      2004/08/25 1:22:21       postmaster        HOSTNAME
 情報          0      2004/08/25 1:22:08       postmaster        HOSTNAME

(ここでは結果をファイルに残すのが容易なため、イベントビューアではなく、 Eventquery.vbs を使って表示している。 Eventquery.vbs は Windows XP に添付されており、 Windowsのヘルプに説明がある。→ Google 検索: Eventquery.vbs

一番新しい2件(★)が、今回のエラー発生時のログ。

この2件を詳細表示すると:

$ cscript "c:\windows\system32\eventquery.vbs" /l application /fi "source eq po
stmaster" /r 2 /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/08/27 23:53:16
Source:       postmaster
ComputerName: HOSTNAME
Category:     なし
User:         HOSTNAME\postgres
Description:  postmaster : PID 2072 : `postmaster' service stopped, exit status:
 1

Type:         情報
Event:        0
Date Time:    2004/08/27 23:53:15
Source:       postmaster
ComputerName: HOSTNAME
Category:     なし
User:         HOSTNAME\postgres
Description:  postmaster : PID 2072 : `postmaster' service started

ここで得られた情報は:

  • postmaster が起動し、終了コード1で終了した。
  • postmaster プロセスがイベントログに書き込めること、つまり postmaster 自体がエラーを検出している。
    • 蛇足だが、サーバ監視時にイベントログから自動検出可能であり、運用時に役立つ。 とはいえ、Cygwin 版を実運用に使うつもりはないが。
    • このログはたぶん、PostgreSQL 自体がイベントログに書き込んでいるのではなく、Cygwin が syslog に対する出力をイベントログに書き込んでいるのだと思う。 よって、本家の Windows 版(PostgreSQL 8.0.0 beta)では挙動が異なるだろう。この件はは未調査である。
    • Type が「情報」(Information) なので、エラーのみ監視していた場合は検出できない。

ここから:

  • エラー処理が正常に行われているのだから、ログファイル (/var/log/postmaster.log) になんらかのメッセージが残っているかも知れない。
  • ログファイルにメッセージが残っていなかった場合でも、postmaster のデバッグレベル(-d 0-5) を上げれば、調べられるかも知れない。
[編集]

PostgreSQL のログファイルを調べる。 #

$ tail /var/log/postmaster.log
LOG:  statement: select abalance from accounts where aid = 92657
LOG:  statement: update tellers set tbalance = tbalance + 406 where tid = 8

LOG:  statement: update branches set bbalance = bbalance + 406 where bid = 1
LOG:  statement: insert into history(tid,bid,aid,delta,mtime) values(8,1,92657,4
06,'now')
LOG:  statement: end
LOG:  received fast shutdown request
LOG:  shutting down
LOG:  database system is shut down
FATAL:  /usr/bin/postmaster: could not locate postgres executable  ★

最後の行(★)で、FATAL(致命的なエラー)が発生していることがわかる。

エラーメッセージによると /usr/bin/postmaster が実行できないとのこと。 ファイルの状態を調べてみる。

$ ls -al /usr/bin/postmaster
lrwxrwxrwx    1 username  Users          12 Aug 27 23:52 /usr/bin/postmaster -> p
ostgres.exe

$ ls -al /usr/bin/postgres.exe
-rwxr-x---+   1 username  Users     2361344 Aug 26 21:40 /usr/bin/postgres.exe

Other に読み取り・実行権限がない。よってエラーの原因は、postmaster をサービスで動作させるときに使っている postgres アカウントで実行できないため、と推測される。
(なお、アクセス権の末尾に '+' があるので、ACL が設定されている。 ACL も getfacl コマンドで確認した方がよいかもしれないが、失念していたので……。)

そこで、次のようにして権限を追加してやる。(README にも書いてあるが)

$ chmod o+rx /usr/bin/postgres.exe

$ ls -al /usr/bin/postgres.exe
-rwxr-xr-x+   1 username  Users     2361344 Aug 26 21:40 /usr/bin/postgres.exe

この作業で、postmaster サービスが起動できるようになった。

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

[メモ] postgresql と最小限のパッケージ (2004-06-24) #

Cygwin の setup.exe で「Select Packages」画面にて、postgresql-7.4.3-1 を 選んだときにインストールされるパッケージの一覧を以下に示す。

これらのパッケージの内訳は次の4つである。

  • baseカテゴリのパッケージ
  • baseカテゴリのパッケージが依存するパッケージ
  • postgresql パッケージ
  • postgresql パッケージが依存するパッケージ
$ cygcheck -cd
Cygwin Package Information
Package              Version
_update-info-dir     00227-1
ash                  20040127-1
base-files           2.6-1
base-passwd          1.1-1
bash                 2.05b-16
bzip2                1.0.2-5
crypt                1.1-1
cygrunsrv            1.0-1
cygwin               1.5.10-3
diffutils            2.8.7-1
editrights           1.01-1
fileutils            4.1-2
findutils            4.1.7-4
gawk                 3.1.3-4
gdbm                 1.8.3-7
grep                 2.5-1
groff                1.18.1-2
gzip                 1.3.5-1
less                 381-1
libbz2_1             1.0.2-5
libgdbm              1.8.0-5
libgdbm-devel        1.8.3-7
libgdbm3             1.8.3-3
libgdbm4             1.8.3-7
libgettextpo0        0.12.1-3
libiconv2            1.9.1-3
libintl1             0.10.40-1
libintl2             0.12.1-3
libncurses5          5.2-1
libncurses6          5.2-8
libncurses7          5.3-4
libpcre              4.1-1
libpcre0             4.5-1
libreadline4         4.1-2
libreadline5         4.3-5
login                1.9-7
man                  1.5k-3
mktemp               1.5-3
ncurses              5.3-4
openssl              0.9.7d-1
postgresql           7.4.3-1
readline             4.3-5
sed                  4.0.9-2
sh-utils             2.0.15-4
tar                  1.13.25-5
termcap              20021106-2
terminfo             5.3_20030726-1
texinfo              4.2-4
textutils            2.0.21-1
which                1.5-2
zlib                 1.2.1-1
[編集]

所要時間とディスク容量など (2004-08-21) #

2004-08-21 に再度試して、所要時間とディスク容量を計測した。

環境

  • ADSL (12M)、リンク 約5Mbit/s
  • ftpサーバは ring-server (so-net)
  • Windows 2000 (on VMware 4.5.2 - WinXP)

所要時間

  • setup.exe でダウンロード開始後、約 5 分

setup.exe と、ring-server からダウンロードされたファイルの容量

  • サイズ:15.7 MB (16,477,167 バイト)
  • ディスク上のサイズ:15.8 MB (16,580,608 バイト)

c:\cygwin ディレクトリの使用量

  • サイズ:59.2 MB (62,087,021 バイト)
  • ディスク上のサイズ:73.6 MB (77,221,888 バイト)
[編集]

[エラー] postmaster サービスを起動できず、/var/log/postmaster.log も更新されない (2004-06-18) #

postmaster をサービスとして起動しようとして失敗し、しかも /var/log/postmaster.log が更新されない場合、postmaster.logのパーミッ ションが不適切であるかもしれない。

ようするに、postmaster プロセスを動作させているユーザ (postgres) から、 postmaster.log に書き込む権限がない、という可能性があること。

もし、そうであった場合は、ファイル /var/log/postmaster.log を削除する か、owner かパーミッションを修正して、postgres ユーザが書き込めるよう にすれば、解消できる。

[編集]

postmaster.log のパーミッションについて #

postmaster をサービスとして起動した場合、 postmaster.log の owner と パーミッション は通常、次のようになる。

$ ls -l /var/log/postmaster.log
-rw-r--r--    1 postgres なし          904 Jun 16 21:39 /var/log/postmaster.log

上記の意味は、ファイルの owner が postgres で、postgres ユーザにのみファイルの 書き込みが許可されている。(-rw-r--r--)

ところが、postgres ユーザ以外のユーザで起動すると、たとえば 'username' で起動して いた場合、次のようになる。

$ ls -l /var/log/postmaster.log
-rw-r--r--    1 username なし          338 Jun 16 21:39 /var/log/postmaster.log

上記の場合、postgres ユーザーにて、このファイルへ書き込みを行おうとすると、エラーが発生する。

これを確かめるために、以下ではbash.exeを「別のユーザーとして実行」で postgresユーザで実行して、bash 上で次のコマンドを実行してみる。

$ echo test >> /var/log/postmaster.log
bash: /var/log/postmaster.log: Permission denied

すると、"Permission denied" なり、ファイルに書き込めないことが確かめられた。

このようなとき、postmaster サービスを起動しようとすると、postmaster が ログファイルに書き込めないため、エラーが発生し、起動できない。

$ cygrunsrv -S postmaster
cygrunsrv: Error starting a service: QueryServiceStatus:  Win32 error 1062:
そのサービスを開始できませんでした。
$ net start postmaster
Cygwin PostgreSQL サービスを開始します.
Cygwin PostgreSQL サービスを開始できませんでした。

システム エラーが発生しました。

システム エラー 1067 が発生しました。

プロセスを途中で強制終了しました。

よって、この問題を解消するには、postgres ユーザ(で実行されるプロセス)が /var/log/postmaster.log に書き込めるように環境を整えてやればよい。

一番簡単なのは、postmaster.logを消去するなり、いったんリネームするなりしてから、再度postmasterを起動する。(2005-03-05)


pgsql-cygwin MLでも同じ話題があった

http://archives.postgresql.org/pgsql-cygwin/2004-06/threads.php#00012

http://archives.postgresql.org/pgsql-cygwin/2004-06/msg00042.php

[編集]

[メモ] ipc-daemon2 (cygipc) をサービスから削除する (2004-06-12) #

postgresql-7.4.2-1 以後のパッケージでは、PostgreSQL の稼動に必要な IPC は、ipc-daemon2 (cygipc パッケージ) のものではなく、 cygserver (cygwin パッケージ) を使う。

よって、他に ipc-daemon2 を使っているパッケージが存在しないなら、 ipc-daemon2 をサービスから削除しても良い。

手順は Cygwin/cygipc#ipc-daemon2 (cygipc) をサービスから削除する を参照のこと。

[編集]

[エラー] postgresql-7.4.2-1 以後のバージョンで、initdb 時に Signal 12 が発生し、失敗する (2004-06-12) #

postgresql-7.4.2-1 以後のパッケージでは、ipc-daemon2 (cygipc) ではなく cygserver を使う。

cygserver を使うプログラムを使うには、 cygserver がすでに起動されており、なおかつ、 環境変数 CYGWIN の値に文字列 "server" が含まれている必要がある。

以上のことは、postgresql-7.4.2.README に記載されている。

postgresql-7.4.2-1 の initdb の場合、cygserver が起動していない場合、あるいは cygserver が起動していても、環境変数 CYGWIN に "server" が含まれていない場合は、 以下のように 'Signal 12' が多量に表示され、実行も失敗する。

$ initdb --no-locale -D ~/postgresql/data
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 /home/username/postgresql/data... ok
creating directory /home/username/postgresql/data/base... ok
creating directory /home/username/postgresql/data/global... ok
creating directory /home/username/postgresql/data/pg_xlog... ok
creating directory /home/username/postgresql/data/pg_clog... ok
selecting default max_connections... Signal 12
Signal 12
Signal 12
Signal 12
Signal 12
Signal 12
10
selecting default shared_buffers... Signal 12
Signal 12
Signal 12
Signal 12
Signal 12
Signal 12
Signal 12
Signal 12
Signal 12
Signal 12
Signal 12
50
creating configuration files... ok
creating template1 database in /home/username/postgresql/data/base/1... Signal 12

initdb: failed
initdb: removing data directory "/home/username/postgresql/data"
[編集]

Signal 12 について (2004-06-18) #

cygwin ML の Igor Pechtchanski - Re: PostgreSQL: initdb fails with v7.4.2 - postmaster fork error with v7 を見て、自分でも試してみた。

Signal の番号と意味の対応は kill -l で調べることができる。 (LPIC の問題集で見かけたような気もする…)

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGEMT       8) SIGFPE
 9) SIGKILL     10) SIGBUS      11) SIGSEGV     12) SIGSYS
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGURG
17) SIGSTOP     18) SIGTSTP     19) SIGCONT     20) SIGCHLD
21) SIGTTIN     22) SIGTTOU     23) SIGIO       24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGLOST     30) SIGUSR1     31) SIGUSR2

よって、12 は SIGSYS。

次に、ヘッダファイルの定義を見てみる。

$ grep SIGSYS /usr/include/sys/signal.h
#define SIGSYS  12      /* bad argument to system call */

SIGSYS の意味は以下のページにもある。

以下の announce によると、「cygserver 関連のシステムコールを呼んだときに cygserver が動いていなかったとき、発生する」とだけ書いてある。でも、 CYGWIN=serverではないときも同様なのかもしれない。

Christopher Faylor - Updated: cygwin-1.5.6-1

  • Changes since 1.5.5-1:
    • Raise SIGSYS if cygserver is not running for some cygserver-specific calls. (Christopher Faylor)
[編集]

[エラー] postgresql-7.4.2-1 以後のバージョンで、postmaster を起動すると、Bad system call と表示され、起動できない (2004-06-12) #

postgresql-7.4.2-1 では、ipc-daemon2 の代わりに cygserver を使う。

cygrunsrv を使うプログラムを使うには、環境変数 CYGWIN の値に 文字列 "server" が 含まれている必要がある。

以上のことは、postgresql-7.4.2.README に記載されている。

で、postgresql-7.4.2-1 は環境変数 CYGWIN に "server" が含まれていない場合にどうういうエラーが起こるかというと。

以下のように 'Bad system call' になり、起動できない。

$ postmaster -D /home/username/postgresql/data
Bad system call
[編集]

[メモ] postgresql パッケージが依存するパッケージ (2004-06-10) #

postgresqlパッケージが依存しているパッケージを調べる方法について。

/usr/share/doc/Cygwin/postgresql-7.4.1.READMEにも記載されているが、 cygwinのsetup.exeの設定ファイル setup.ini にも依存パッケージが書いてある。

これはテキストエディタなどで確認できるが、次のようにして抜き出すこともできる。

$ ls
release/  setup.ini*

$ grep -A10 '@ postgresql' setup.ini | grep requires
requires: ash crypt cygipc cygwin libncurses7 libreadline5 openssl zlib

さらに、cygcheckでこれらのパッケージのバージョンも確かめてみた。

$ cygcheck -cd `grep -A10 '@ postgresql' setup.ini | grep requires | gawk '{$1="";print}'`
Cygwin Package Information
Package              Version
ash                  20040127-1
crypt                1.1-1
cygipc               2.03-2
cygwin               1.5.9-1
libncurses7          5.3-4
libreadline5         4.3-5
openssl              0.9.7d-1
zlib                 1.2.1-1

なお、この手順は、postgresqlパッケージに限らず、他のパッケージでも使える

[編集]

postgresql-7.4.3-1の依存パッケージ (2004-07-22) #

PostgreSQL を使うだけなら、以下のパッケージだけでできるかもしれない。

$ grep -A10 '@ postgresql' setup.ini | grep requires
requires: ash crypt cygrunsrv cygwin libncurses7 libreadline5 openssl zlib

$ grep -A10 '@ ash' setup.ini | grep requires
requires: cygwin

$ grep -A10 '@ crypt' setup.ini | grep requires
requires: cygwin

$ grep -A10 '@ cygrunsrv' setup.ini | grep requires
requires: cygwin

$ grep -A10 '@ libncurses7' setup.ini | grep requires
requires: cygwin terminfo

$ grep -A10 '@ terminfo' setup.ini | grep requires

$ grep -A10 '@ libreadline5' setup.ini | grep requires
requires: cygwin libncurses7

$ grep -A10 '@ openssl' setup.ini | grep requires
requires: cygwin

$ grep -A10 '@ zlib' setup.ini | grep requires
requires: cygwin

$ grep -A10 '@ postgresql' setup.ini | grep requires | cut '-d ' -f2-
ash crypt cygrunsrv cygwin libncurses7 libreadline5 openssl zlib

$ cygcheck -cd postgresql ash crypt cygrunsrv libncurses7 terminfo libreadline5
openssl zilb cygwin
Cygwin Package Information
Package              Version
ash                  20040127-1
crypt                1.1-1
cygrunsrv            1.0-1
cygwin               1.5.10-3
libncurses7          5.3-4
libreadline5         4.3-5
openssl              0.9.7d-1
postgresql           7.4.3-1
terminfo             5.3_20030726-1
[編集]

[メモ] postgres ユーザーでログオンする方法 (2004-03-20) #

「サービス」へ登録した後の作業では、一部postgresユーザーで作業する必要がある。

Windowsからログオフすればユーザーを切り替えられるが、頻繁にユーザーを切り替えるのは面倒なので、いくつか回避手段を述べる。

[編集]

runas.exe を使う (2004-07-24) #

Windows XP Professional と Windows 2000 Professional にはこの機能がある。

実行例 *1

$ runas /user:postgres 'c:\cygwin\bin\bash.exe'
postgres のパスワードを入力してください:
c:\cygwin\bin\bash.exe をユーザー "HOSTNAME\postgres" として開始しています...

runas コマンドの使い方は、「runas /?」 を実行すれば表示される。

Windows XP Professional の場合、使い方は 「スタート」→「ヘルプ」で「runas」を検索して 「Runas」項目を見ること。

Windows 2000 Professional の場合、同じく 「スタート」→「ヘルプ」で「runas」を検索して 「runas コマンド パラメータを使うショートカットを作成する」 →ページ末尾の「関連項目」→「Runas」。

  • 補足 (2004-09-02)
    bash への入力では、\ はエスケープ文字と見なされる。 そのため、windows の表記(例:c:\cygwin\bin\bash.exe)を コマンドに渡す場合、「c:\cygwin\bin\bash.exe」ではなく、 「'c:\cygwin\bin\bash.exe'」あるいは「c:\\cygwin\\bin\\bash.exe」と する必要がある。
    あるいはcygpathを使って「$ runas /user:postgres `cygpath -w /bin/bash`」 としてもよいけど。
  • 余談 (2004-09-02)
    runas の /env オプションを使うと環境を引き継ぐので、便利かも知れない。 効果をあまり把握していないのけど…。
[編集]

別のユーザーとして実行 #

Windows XP Professional と Windows 2000 Professional にはこの機能がある。

エクスプローラーなどで「c:\cygwin\bin\bash.exe」の上で右クリック→「別のユーザーとして実行(A)...」を使う(Windows 2000なら、Shift + 右クリック)。手順は「スタート」→「ヘルプ」で、「別のユーザーとして実行」を検索すると見つかる。

また、こちらも参考になる。

Windows TIPS -- TIPS:一時的にほかのユーザー権限でプログラムを実行する方法 (ショートカット・メニューを利用する方法)

なお、「Cygwin Bash Shell」ショートカットはバッチファイルを指しているため、使えない。bash.exeのショートカットを作れば使える。

また、ショートカットのプロパティにも同じ機能(Windows2000では「別のユーザーとして実行」、Windows XPでは「別の資格情報で実行する」)があるので、頻繁に作業を行う場合は設定しておくとよい。

[編集]

ユーザーの簡易切り替え #

Windows XP Professionalには「ユーザーの簡易切り替え」がある。

手順は「スタート」→「ヘルプ」で「ユーザーの簡易切り替え」を検索すること。

[編集]

telnetdやsshd を使う #

telnetdやsshdの設定を行っているなら、telnetかsshでlocalhostにログインしてもいい。また、未確認だがService for UNIXを入れていて telnet サーバを動作させているなら、そっちからでも良いし。

[編集]

[エラー] LANG=ja_JP.SJIS の場合、initdb が失敗 #

環境変数LANGをja_JP.SJISに設定しているとinitdbに失敗し、以下のエラーが発生する。

$ initdb -D /var/postgresql/data
  : (略)
creating template1 database in /var/postgresql/data/base/1... 
FATAL:  invalid value for parameter "lc_messages": "ja_JP.SJIS"
initdb: failed
initdb: removing data directory "/var/postgresql/data"

これを回避するには、localeを無視するために "--no-locale" オプションを指定すること。

ここらへんのことは ''/usr/share/doc/postgresql-X.X.X/README.mb.jp に書いてある。''

以下引用。

■initdb/createdb/create database におけるエンコーディングの指定について

(中略)

なお,PostgreSQL 7.3以降ロケールサポートが必ず有効になっていますが,

これは日本語などを使用する際には何のメッリトもないばかりでなく,障害

の原因になったり,LIKE検索や正規表現検索でインデックスが有効にならな

いなどの問題を引き起こすので,無効にしておくことをおすすめします.ロ

ケールサポートを無効にするためには,

--no-locale

オプションを指定します.

[編集]

[エラー] initdb や postmaster の実行で、FATAL: /usr/bin/postgres: could not locate postgres executable が発生する #

ユーザ postgres にてinitdb を実行すると、次のエラーが発生することがある。 (正確には、Cygwinをインストールしたときのユーザとは別のユーザで実行したときに発生する)

initializing pg_shadow... FATAL:  /usr/bin/postgres: could not locate postgres executable
initdb: failed

これは、PostgreSQLの実行ファイルの権限が不適切であるため。 この場合、このエラーを回避するために、/usr/bin/postgres に権限(o+rx)を付加する。

$ ls -l /usr/bin/postgres
-rwxr-x---+   1 username  Users     2397184 Nov 20 01:23 /usr/bin/postgres*
$ chmod o+rx /usr/bin/postgres.exe
$ ls -l /usr/bin/postgres
-rwxr-xr-x+   1 username  Users     2397184 Nov 20 01:23 /usr/bin/postgres*

また、このエラーが出たときはデータファイルが消去されないので、次のようにして手動で消去する。

$ rm -rf /var/postgresql/data/*

また、サービスを起動したときに次のエラーが表示された場合で、

$ cygrunsrv -S postmaster
cygrunsrv: Error starting a service: QueryServiceStatus:  Win32 error 1062:
そのサービスを開始できませんでした。

次のようにpostmaster.logに同じエラーが記録されているときも、

$ cat /var/log/postmaster.log
FATAL:  /usr/bin/postmaster: could not locate postgres executable

同じ対処で回避できる。

[編集]

[メモ] データベースクラスタ,データベース作成時にエンコーディングにEUC_JPを指定したときの注意 (2004-02-11) #

データベースクラスタ作成(initdb)やデータベース作成(createdb)で、initdb -E EUC_JP の用にEUC_JPを指定したとき、文字化けする原因と対策について。

[編集]

WindowsのコンソールはEUC_JPを表示できない #

Cygwinに特有の原因ではなく、データベースクラスタの漢字コードと端末(psql)の漢字コードが異なっていることが原因。

Windows上でpsqlコマンドを使用するときは、「WindowsのコンソールはEUC_JPを表示できない」ため「文字化け」する。

そこで、psqlコマンドを起動した後、\encodingコマンドで以下のようにクライアント(=psql)のエンコーディングを変更する。:

username-# \encoding             ★現在のエンコーディングを確認
EUC_JP
username-# \encoding SJIS        ★エンコーディングを変更
username-# \encoding             ★現在のエンコーディングを確認
SJIS

          ★試しにテーブルを作って、日本語の値を入れて、表示してみる。
username=# create table sample (id integer, name varchar);
CREATE TABLE
username=# insert into sample values (0, 'サンプル');
INSERT 17148 1
username=# select * from sample;
 id |   name
----+----------
  0 | サンプル
(1 row)

\encoding SJIS については、/usr/share/doc/postgresql-X.X.X/''/usr/share/doc/postgresql-X.X.X/README.mb.jp

「■フロントエンドとバックエンドの自動エンコーディング変換について」に書いてある。(2004-06-27)

また、マニュアルでは次の個所に記載されている。

PostgreSQL 7.4.1 文書 - II. PostgreSQL クライアントアプリケーション - psql -- PostgreSQL 対話的ターミナル

\encoding の設定は、~/.psqlrc にでも書いておけばよいかと。(2004-06-27)

select version(); ★おまけ。pgsql-jp で最近話題になった。
\encoding SJIS   ★設定して
\encoding        ★確認する

実行例。

$ psql
Welcome to psql 7.4.3, 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

                                       version

-------------------------------------------------------------------------
PostgreSQL 7.4.3 on i686-pc-cygwin, compiled by GCC gcc (GCC) 3.3.1 (cygming special)
(1 row)

SJIS
username=#
[編集]

漢字の入力→変換→確定で文字化けする #

これはPostgreSQLに限ったことではないが、漢字の入力→変換→確定で文字化けする場合、bashの設定を疑う。

(psqlをbashではなくWindowsの「コマンドプロンプト」で起動してみれば、 また、bashを起動し、psqlを起動する前に漢字を入力してみれば 切り分けられる)

/.inputrcは次のようにするらしい。(手元では設定済みなので追試してない)

set convert-meta off
set input-meta on
set output-meta on

手元ではbashは 2.05a-jp-1 (Cygwin+JE本の日本語化パッチ版) を使用している ので、さらに

set kanji-code sjis

も設定している。

[編集]

psqlが使用するreadlineライブラリの影響 #

readlineライブラリがいったん入力を処理するので、ここで文字化けする可能性もある。 (未経験だけど)。

psqlでは、

$ psql -?
This is psql 7.4.1, the PostgreSQL interactive terminal.
  : (略)
  -n              disable enhanced command line editing (readline)

のように、-n オプションでreadlineの機能を停止できる。

なお、このオプションは、

http://www.postgresql.jp/document/pg74doc/html/app-psql.html

には載っていない。このオプションがオフィシャル版のpsqlに載っているかどうかは不明。(ソースコードは調べてないし)

Debian GNU/Linux 3.0 (woody) の postgresql パッケージ (7.2.1-2woody4) や RedHat 9.0 の postgresqlパッケージ (7.3.4-3.rh19) にも同じオプションがあったので、 オフィシャルなオプションだと考えられる。

[編集]

[メモ] postmaster への TCP/IP 接続のオプション #

「サービスへの登録」では、postmasterプログラムにオプション -D と -i を指定している。
オプション-Dははデータディレクトリの指定。
オプション-iはtcp/ip接続を使用することを指定。(デフォルトでは unix domain接続のみ許可)

  • i と同等の 設定が /var/postgresql/data/postgresql.conf の tcpip_socket である。 これを true にすると -i と同等。なお、tcpip_socketのデフォルトはfalseである。
#---------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#---------------------------------------------------------------------------

# - Connection Settings -
tcpip_socket = true

また、tcp/ip接続元を限定するには、/var/postgresql/data/pg_hba.confを設定する。デフォルトでは、localhostからのアクセスのみ許可されている。

[編集]

[メモ] データベースの権限 #

デフォルトでは、postgresユーザ以外のユーザには、PostgreSQLの操作権限はない。

そこで、postgresの操作をいろいろ試す場合は、普段使うユーザにデータベース作成権限とユーザ作成権限を付けておくと便利である。

この作業は postgres ユーザで行う。これは、この時点では権限を持っているのは postgres ユーザだけであるため。

[postgres]$ createuser username
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) y
CREATE USER

また、psqlコマンドでちょっと試すには、普段使うユーザ username と同名のDBを作成して置くと、psqlコマンドの起動時にユーザ名とデータベース名の指定を省略できる。 これは、psqlはデフォルトでユーザ名と同じ名前のデータベースを使うため。

$ createdb --encoding=EUC_JP -U username username
CREATE DATABASE
[編集]

[メモ] cygrunsrv 0.98-1で追加された --neverexits オプション (2004-02-17) #

cygrunsrv 0.98-1 では --neverexitsオプションが追加された。 このオプションの機能(Service should never exit by itself.)が ちょっと気になるので、そのうち調べたい。

*1 訂正 (2004-09-02) runas コマンドの実行例がコマンドプロンプトを使ったものになっていたため、bash 上の実行例に差し替えました。ご指摘感謝します。