PostgreSQL >=V6.1 のためのよくある質問(FAQ) Anderw C.R. Martin martin@biochem.ucl.ac.uk 桑村潤 - 日本語訳 juk@rccm.co.jp Jun 19 1998 PostgreSQL の FAQ Linux 特定版 - 通常の FAQ と併せてお読み下さい。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 訳注: この文書の最新版は、 http://www.biochem.ucl.ac.uk/~martin/ pgsql/linux.faq にあります。日本語版は、 http://www.rccm.co.jp/~juk /pgsql/faq-linux-j.shtml にあります。 Changes in this version (* = modified, + = new, - = removed): ・ +1.23) コンパイルが F_BOOLIN, F_BOOLOUT および F_BYTEAIN が未定義で あるとのメッセージで失敗するのはなぜですか? このファイルはおおよそ次のように別れています: 1. PostgreSQL のコンパイル 2. 附属プログラムのコンパイル 3. 実行時の問題 1. PostgreSQL のコンパイル 1.1. src/Makefile.global や src/Makefile.custom には何を変更すれば よいでしょうか、また、その他に必要な変更はありますか? 1.2. libreadline が見つからないという問題はなぜ起こりますか? 1.3. [REDHAT] libdl と dlfcn.h が見つからないという問題はなぜ起こり ますか? 1.4. [SLACKWARE 3.1] libdl と dlfcn.h が見つからないという問題はな ぜ起こりますか? 1.5. backend のコンパイルがインクルードファイル dlfcn.h が見つから ないということで終ります。 1.6. GCC がオプション -fpic を無視したとぼやきます。 1.7. 次のような警告を受け取ります: warning: cast from pointer to integer of different size 1.8. [SuSE-Linux 4.2-4.4] curses と termcap はどこにありますか? 1.9. ld.so で問題が出るのはなぜでしょう? 1.10. 'yy_flush_buffer undefined' というエラーが出るのはなぜでしょ う? 1.11. a.out システムでは PostgreSQL をどのようにコンパイルしますか ? 1.12. 次のように make が失敗するのはなぜですか: yacc -d /disk2/ PostgreSQL/src/backend/parser/gram.y make: /usr/bin/make: cannot execute binary file 1.13. src/Makefile.global の中で X11_LIB の libsocket と libnsl へ の参照は何ですか? 1.14. [DEBIAN] libtermcap はどこにありますか? 1.15. [REDHAT] RPM での PostgreSQL は手に入りますか? 1.16. Linux で開発バージョンをコンパイルしようとしたら、次のような メッセージで失敗しました: In file included from /usr/include/ sys/sem.h:8, from ipc.c:37: /usr/include/asm/bitops.h:32: warning: no previous prototype for Set_bit' .... make: *** [ipc.o] Error 1 1.17. postgres をコンパイルするとき、gcc が signal 11 を出して落っ こちました。 gcc: Internal compiler error: program cc1 got fatal signal 11 1.18. MkLinux で 6.1.1 をインストールできますか? 1.19. メイクが終ったり、クラッシュするのはどうして? 1.20. 486 や Pentium プロセッサ用の最適化はどのようにするのですか? 1.21. 時間を印刷しようとするとどうして変な結果になるのですか (例え ば、 regression テストの 'timespan)?時間は、'5 hours' のかわり に ' 4 hours 59 mins 60.00 secs' のようになります。 1.22. 6.3.2 をコンパイルした時に libpq のための共有ライブラリができ ないのはなぜですか? 1.23. コンパイルが F_BOOLIN, F_BOOLOUT および F_BYTEAIN が未定義で あるとのメッセージで失敗するのはなぜですか? 2. 附属プログラムのコンパイル 2.1. pgtclsh をコンパイルする時、リンカが libX11 を捜せません。 3. 実行時の問題 3.1. createuser などのスクリプトを走らせる時、 _fUnKy_POSTPORT_sTuFf_ が未定義とのエラー報告を受け取ります。 3.2. postmaster を走らせた後、システムが ' Bad system call(Core dumped)' と言います。 3.3. postmaster を走らせようとする時、次のようなエラーを受け取るの はなぜですか? ┌──────────────────────────────────┐ │ Failed Assertion("!(file != 0):(null)", File: │ │ "/usr/local/PostgreSQL/src/backend/storage/file/fd.c", Line: 257) │ │ !(file != 0) (0) │ │ initdb: could not create template database │ │ initdb: cleaning up. │ └──────────────────────────────────┘ 3.4. createuser が動かないのはなぜですか? 3.5. 次のようなエラーを受け取るのはなぜですか: ┌──────────────────────────────┐ │ IpcMemoryCreate: memKey=155356396 , size=760632 , │ │ permission=384IpcMemoryCreate: shmget(..., create, ...) │ │ failed: Invalid argument │ └──────────────────────────────┘ 3.6. どうして、psql が次のように失敗するのですか: 'psql: can't load library 'libpq.so.1' 3.7. その他の奇妙な振舞。 3.8. PostgreSQL が走っている時にシステムをシャットダウンすると、 Linux はリブートの時にいつもディスクを fsck します。 3.9. regression テストの問い合わせ 32 にとても時間がかかるのはなぜ ですか? 3.10. ある date/time の演算で、以下のような妙な丸めとなるのはなぜで すか? 1. PostgreSQL のコンパイル 1.1. src/Makefile.global や src/Makefile.custom には何を変更すればよい でしょうか、また、その他に必要な変更はありますか? makefile 等への変更は、Makefile.custom を書き出す customize シェルスク リプトを src ディレクトリで走らせることにより最も簡単にできます。 [訳注: customize コマンドは 6.1 以降なくなりました。 ] その他にやらなくてはならない変更は、もし Flex のバージョンがよく知られ ているバグのある 2.5.3 の場合は、createuser が失敗する(質問3.4 を参照 )ので、それを置き換えることです。 もし、makefile等を手で編集するのであれば、★必ず★次の変数をセットしな くてはなりません: ┌──────────────────────────────────┐ │ PORTNAME= linux │ └──────────────────────────────────┘ また、次の変数もあなたのインストールを行なう場所に変更する必要がありま す: ┌──────────────────────────────────┐ │ POSTGRESDIR │ └──────────────────────────────────┘ USE_TCL オプションを生かすならば、以下の変数をセットする必要があります : ┌──────────────────────────────────┐ │ TCL_INCDIR= │ │ TCL_LIBDIR= │ │ TCL_LIB= │ │ TK_INCDIR= │ │ TK_LIBDIR= │ │ TK_LIB= │ │ X11_INCDIR= │ │ X11_LIBDIR= │ │ X11_LIB= │ └──────────────────────────────────┘ 筆者の Slackware3.0 システムでは、それらは: ┌──────────────────────────────────┐ │ TCL_INCDIR= /usr/include/tcl │ │ TCL_LIBDIR= /usr/lib │ │ TCL_LIB= -ltcl │ │ TK_INCDIR= /usr/include/tcl │ │ TK_LIBDIR= /usr/lib │ │ TK_LIB= -ltk │ │ X11_INCDIR= /usr/include/X11 │ │ X11_LIBDIR= /usr/X386/lib │ │ X11_LIB= -lX11 │ └──────────────────────────────────┘ INSTALL ファイルと Makefile.global ファイルにあるドキュメントに従ってそ の他に必要な変更をしても構いません。 1.2. libreadline が見つからないという問題はなぜ起こりますか? Linux システムは一般的にインストール済みの GNU readline ライブラリを含 んでいません。GNU readline ライブラリをインストールするか、または、src/ Makefile.global あるいは src/Makefile.custom で readline オプションを活 性化しないようにしましょう。 Debian Linux では(FreeBSD のように) readline がインストールされて来るこ とをここに記しておきます。 1.3. [REDHAT] libdl と dlfcn.h が見つからないという問題はなぜ起こります か? このこと自身が、コンパイルの最後のフェーズで dlopen() や dlclose() など のような関数とリンクできないことを明示しています。 libdl ライブラリはユーザ提供関数として実行時に動的結合されます。いくつ かの理由のためにこのライブラリは Redhat の配給から洩れました。最近の RedHat 4.0(Colgate) では直っています。 今は、新しい ld.so の RPM パッケージが RedHat の FTP サイトにあります。 簡単に入手するには: ・ ftp://ftp.redhat.com/pub/redhat/devel/i386/RedHat/RPMS/ ld.so-1.7.14-4.i386.rpm RPM ファイルを普通にインストールしてやり直してみて下さい。 注意!ライブラリのインストールの後に再コンパイルを行なう前に、 configure を走らせ直して make clean をしなければならないでしょう。 これらのライブラリを更新しているときにアクセスするプログラムのためにシ ステムが落ちたと言う報告が一つありました(驚くことではありませんが)。し たがって、新しいライブラリをインストールする前にシステムを再起動するの は良い考えで、なるべく更新中は走らせるものを少なくしましょう。シングル ユーザ・モードになるのが良いでしょう。 もし、それを難しい方法でしたいのであれば、次の場所からライブラリとヘッ ダを取得することもできます: ・ ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ld.so-1.7.14.tar.gz コンパイル済のバイナリを distributions/debian/buzz/binary-i386/base/ ld.so-1.7.14-4.deb 同じサイトで見つけるか、または、初期のころの Slackware パッケージでは 1.2 の質問と同じ問題を直すかのどちらをしても構 いません。ただし後者方法は、自分でやっていることがおわかりでなければや らないで下さい。 1.4. [SLACKWARE 3.1] libdl と dlfcn.h が見つからないという問題はなぜ起 こりますか? このこと自身が、コンパイルの最後のフェーズで dlopen() や dlclose() など のような関数とリンクできないことを明示しています。 質問 1.3 の回答を御覧下さい。バージョン 3.0 までの Slackware はこのライ ブラリとインクルードファイルが提供されましたが、初期の 3.1 のリリース (1996年9月9日より前)では無くなってました。そして、多くの CD-ROM のバー ジョンがその最初の 3.1 のリリースを入れているでしょう。 これらのライブラリを更新しているときにアクセスするプログラムのためにシ ステムが落ちたと言う報告が一つありました(驚くことではありませんが)。し たがって、新しいライブラリをインストールする前にシステムを再起動するの は良い考えで、なるべく更新中は走らせるものを少なくしましょう。シングル ユーザ・モードになるのが良いでしょう。 最も簡単な修正は ldso.tgz を最新の Slackware 3.1 の配給の a4 disk から 取り出してファイルをルート(/)ディレクトリから展開して、そして、 ┌──────────────────────────────────┐ │ sh install/doinst.sh │ └──────────────────────────────────┘ をしてインストールを完了して下さい。それに続けて、 ┌──────────────────────────────────┐ │ ldconfig │ └──────────────────────────────────┘ 注意!ライブラリのインストールの後に再コンパイルを行なう前に、 configure を走らせ直して make clean をしなければならないでしょう。 をします。もし、手でインストールしたければ、まず最初に dlfcn.h ファイル を /usr/include にインストールします。 次に、libdl.so.1.7.14 (あるいは、同様の最新のリリース)を /lib にインス トールし、そして、 ┌──────────────────────────────────┐ │ cd /lib │ │ ln -sf libdl.so.1.7.14 libdl.so.1 │ │ ln -sf libdl.so.1 libdl.so │ └──────────────────────────────────┘ を行ないます。あるシステム(GCC の設定によります)では、次のことを行なう 必要があります: ┌──────────────────────────────────┐ │ cd /usr/lib │ │ ln -sf /lib/libdl.so . │ └──────────────────────────────────┘ 最後に、 ┌──────────────────────────────────┐ │ ldconfig │ └──────────────────────────────────┘ します。 注意!ライブラリのインストールの後に再コンパイルを行なう前に、 configure を走らせ直して make clean をしなければならないでしょう。 1.5. backend のコンパイルがインクルードファイル dlfcn.h が見つからない ということで終ります。 質問 1.3/1.4 の回答を御覧下さい。もし、a.out のシステムをお使いでしたら 、dlfcn.h を持つために、まず始めに dld パッケージ(ほとんどの a.out の システムに附属してない)をインストールしなくてはならないことをお忘れに ならないように。質問 1.11 を御覧下さい。 1.6. GCC がオプション -fpic を無視したとぼやきます。 GCC の初期バージョンは、-fpic か -fPIC かのどちらかを受け入れます。より 最近のバージョン (V2.7.2?) では -fPIC を要求します。 ELF バージョンの Linux をお使いの場合は、-fPIC が既定値となりますので、このことは無視し ても大丈夫です。これは、src/Makefile.global を編集し、 CFLAGS_SL を変更 することで訂正できます。 1.7. 次のような警告を受け取ります: warning: cast from pointer to integer of different size これらは Postgres95 の初期バージョンで見受けられましたが、無視しても大 丈夫です。PostgreSQL V6.0 では、システムヘッダーファイルに関する警告( これらも安全に無視できます)以外は、警告無しにコンパイルできるはずです 。 1.8. [SuSE-Linux 4.2-4.4] curses と termcap はどこにありますか? SuSE-Linux 4.2 に ncurses はありますが curses はありません。 4.4 には両 方あります。SuSE-Linux の termcap ライブラリもまた /usr/lib の中ではな く /usr/lib/termcap の中にあります。 ・ PostgreSQL (up to V6.0) src/Makefile.custom の中で CURSES_LIB の値に -lncurses を設定します (あるいはカスタマイズスクリプトを通して行ないます)。次の行を src/ Makefile.custom に加えます: ┌────────────────────────────┐ │ LDADD_BE+= -L/usr/lib/termcap │ └────────────────────────────┘ src/bin/psql/Makefile を編集して次の ┌────────────────────────────┐ │ ifeq ($(PORTNAME), linux) │ │ LD_ADD+= │ └────────────────────────────┘ を ┌────────────────────────────┐ │ ifeq ($(PORTNAME), linux) │ │ LD_ADD+= -ltermcap │ └────────────────────────────┘ に変更します。 ・ PostgreSQL (V6.1) configure スクリプトは termcap ライブラリを /usr/lib/termcap の中に 捜す術を知りませんので、捜索する追加ディレクトリを尋ねられたときに 、このディレクトリを指定するディレクトリの一つに含めるべきです。 もし、これでうまくゆかなければ(著者はそれを確かめるための SuSE を 持っていません)、configure を走らせた後に、 src/Makefile.global を 編集して LDFLAGS の行(-lreadline の後ろ) に -ltermcap を加えます。 (あるいは、 configure を走らせる前に、 src/Makefile.custom を修正 することもできます。) -lcurses を -lncurses に変えて、むしろ curses の代わりにあえて ncurses を使いたいと願うかも知れません SuSE のいくつかのバージョン では ncurses のみしか提供されませんので、-lcurses を -lncurses に変 えて curses の代わりに ncurses を使う必要があるかもしれません。 (SuSE 5.1 ではまさにそのことが報告されてます。) 1.9. ld.so で問題が出るのはなぜでしょう? ld.so で問題があれば、ELF の下でダイナミックローディングのために別のラ イブラリが要求されます。それは、Linux のインストールか(それに近い)ア ップグレードで変にしてしまったのです。 質問 1.3/1.4 の回答を御覧下さい。ld.so.x.y.z を /lib にインストールして ldconfig を走らせる必要があるかも知れません。最も最近の ld のパッケージ は 1.7.14 です。これを書いている時点で ld の 1.8.x バージョンは実験版で す。 1.10. 'yy_flush_buffer undefined' というエラーが出るのはなぜでしょう? これは本当に Linux に限ったことではありませんが、古い Linux のインスト ーレションでは良くあります。PostgreSQL をコンパイルするのに flex の最新 版(2.5.2以降)を持っている必要があります。ただし、flex 2.5.3 はバグがあ ります:質問 3.4 を参照下さい。 1.11. a.out システムでは PostgreSQL をどのようにコンパイルしますか? 最初に、dld ライブラリをインストールしなくてはなりません。これは、 Sunsite: LINUX/libs/dld.3.2.7.tar.gz ・ ftp://sunsite.unc.edu/pub/Linux/libs/dld.3.2.7.tar.gz から入手できます。 第二に、次の行: ┌──────────────────────────────────┐ │ LINUX_ELF= │ └──────────────────────────────────┘ を src/Makefile.custom に加えます。(あるいはカスタマイズスクリプトを使 います) 1.12. 次のように make が失敗するのはなぜですか: yacc -d /disk2/ PostgreSQL/src/backend/parser/gram.y make: /usr/bin/make: cannot execute binary file これは、Postgres95 の初期バージョンの問題でした。PostgreSQL のための既 定値は yacc ではなく bison -y を使うようになってます。 yacc は一般的に bison -y によって起動されるスクリプトとして実装されています。ある理由で (make のあるバージョン?bash のあるバージョン?)make がこのスクリプト ファイルを実行できません。 これを直すには、単純に src/mk/port/postgres.mk.linux を編集して、そのフ ァイルの終りの ┌──────────────────────────────────┐ │ # YACC = bison -y │ └──────────────────────────────────┘ を ┌──────────────────────────────────┐ │ YACC = bison -y │ └──────────────────────────────────┘ に変更します。 1.13. src/Makefile.global の中で X11_LIB の libsocket と libnsl への参 照は何ですか? これは 1.08 での(Sun Solaris に特有の)問題でした。1.09 と 6.0では直っ ています。 1.14. [DEBIAN] libtermcap はどこにありますか? Debian Linux には termcap ライブラリは付いてこなくて、(その代わりに terminfo を使う) ncurses を使います。Debian は(SuSE-Linux とは違い --- 質問 1.8 を御覧下さい) libncurses から libcurses へのリンクを用意 してますので src/bin/psql/Makefile の中の CURSES_LIB 変数は変更する必要 はありません。 src/bin/psql/Makefile を編集して、 ┌──────────────────────────────────┐ │ ifeq ($(PORTNAME), linux) │ │ LD_ADD+= -ltermcap │ └──────────────────────────────────┘ から ┌──────────────────────────────────┐ │ ifeq ($(PORTNAME), linux) │ │ LD_ADD+= │ └──────────────────────────────────┘ へ変更をコメントで外す必要があるかもしれません。 1.15. [REDHAT] RPM での PostgreSQL は手に入りますか? あります。Michal Mosiewicz さんが (http://www.pdi.lodz.pl/~mimo) Intel 版の PostgreSQL V6.0 をご親切に RPM にまとめてくれました。そして、 ・ ftp://ftp.redhat.org/pub/Incoming/Postgres-6.0-1.i386.rpm にアップロードされています。 これは、コンパイル済バージョンで、そこにあるソースの RPM は著者が書きま した。 1.16. Linux で開発バージョンをコンパイルしようとしたら、次のようなメッ セージで失敗しました: In file included from /usr/include/sys/sem.h:8, from ipc.c:37: /usr/include/asm/bitops.h:32: warning: no previous prototype for Set_bit' .... make: *** [ipc.o] Error 1 問題は Linux がこれらのインライン関数のためのプロトタイプを用意していな いことです。解決策は .../src/backend/storage/ipc ディレクトリに行って Makefile を編集することです。 次の行、 ┌──────────────────────────────────┐ │ CFLAGS+=$(INCLUDE_OPT) │ └──────────────────────────────────┘ を ┌──────────────────────────────────┐ │ CFLAGS+=$(INCLUDE_OPT) -Wno-error │ └──────────────────────────────────┘ に変更します。 ../src/backend/storage/lmgr ディレクトリについても同様にします。 1.17. postgres をコンパイルするとき、gcc が signal 11 を出して落っこち ました。 gcc: Internal compiler error: program cc1 got fatal signal 11 これは、ハードウェア/メモリの問題です。PostgreSQL は大きなプログラムで すので、(PostgreSQL を構築したり、カーネルを構築したりするような)巨大 な gcc のコンパイルにおいては、他の幾つかのプログラムのようにメモリを圧 迫し、その結果通常操作では起きないエラーに終ります。より小さな基本ソフ トでもありますが、このような度合にまではハードウェアを圧迫しませんので 、DOS/Windows の下ではこのような問題に合うことは無いかも知れません。 より詳細な情報は: ・ http://www.bitwizard.nl/sig11 にあります。 この Sig11 FAQ によると、Cyrix プロセッサ上での Redhad 5.0 gcc を走らせ る時の特別な問題があるようです。詳細は上記の URL を御覧下さい。 1.18. MkLinux で 6.1.1 をインストールできますか? 石井達夫さんが MkLinux DR2.1 update2 以降で行ないました。小さなパッチは : ・ ftp://ftp.sra.co.jp/pub/cmd/postgres/6.1.1/mklinux.patch.gz から入手できます。 [訳注 6.2 からはパッチは必要なくなりました。 ] 1.19. メイクが終ったり、クラッシュするのはどうして? gmake が早々に終ったり領域侵害で落ちたりすることが幾つか報告されていま す。後者の問題は gmake 3.74 で報告されたもので、3.76.1 にアップグレード することで解決されました。ところが、3.74 は他の人々のセットアップでは正 常に動いていることが知られています。とりあえずは、この問題について報告 を行なう前に、gmake を最新版にアップグレードしてみてください。 1.20. 486 や Pentium プロセッサ用の最適化はどのようにするのですか? デフォルトのコンパイラ・フラグでは 486 や Pentium プロセッサーのための 最適化は行ないません。このような最適化を加えるには、 Makefile.custom を 編集して: ┌──────────────────────────────────┐ │ CFLAGS+= -m486 │ └──────────────────────────────────┘ または、(まだ、あまり走らせている人のいない新しいコンパイラでは) ┌──────────────────────────────────┐ │ CFLAGS+= -mpentium │ └──────────────────────────────────┘ または ┌──────────────────────────────────┐ │ CFLAGS+= -mpentiumpro │ └──────────────────────────────────┘ を加えます。 1.21. 時間を印刷しようとするとどうして変な結果になるのですか (例えば、 regression テストの 'timespan)?時間は、'5 hours' のかわりに ' 4 hours 59 mins 60.00 secs' のようになります。 この問題は Redhat 5.0 に含まれてくる glibc2 での問題です。glibc を最新 の v5.0/hurricane の RedHat バージョンにアップデートして下さい。 glibc-2.0.7 より前のものは問題がよくあるようです。 1.22. 6.3.2 をコンパイルした時に libpq のための共有ライブラリができない のはなぜですか? v6.3.2 のための Linux コンフィグレーションは終る寸前で離脱をおこしてま した。ftp://postgresql.org/pub/patches/ に linux_elf パッチを含む幾つか の修正が上がっていますので見て下さい。 1.23. コンパイルが F_BOOLIN, F_BOOLOUT および F_BYTEAIN が未定義である とのメッセージで失敗するのはなぜですか? 実際のメッセージは以下のようなものです: ┌───────────────────────────────────┐ │ -I/usr/include/readline -O2 -Wall -Wmissing-prototypes -I.. │ │ -Wno-error -c bootstrap.c -o bootstrap.o │ │ bootstrap.c:160: `F_BOOLIN' undeclared here (not in a function) │ │ bootstrap.c:160: initializer element for `Procid[0].inproc' is not │ │ constant │ │ bootstrap.c:160: `F_BOOLOUT' undeclared here (not in a function) │ │ bootstrap.c:160: initializer element for `Procid[0].outproc' is not │ │ constant │ │ bootstrap.c:161: `F_BYTEAIN' undeclared here (not in a function) │ │ bootstrap.c:161: initializer element for `Procid[1].inproc' is not │ │ constant │ └───────────────────────────────────┘ これらの定数はどこにも定義されていそうも無いので、なぜそれが起こるかを 知らなければ、これは奇妙なことです。 その答えは、メイクを始める前に cpp がパスにあることを確認することです。 Redhat 5.1 では、cpp は /usr/lib/gcc-lib/i386-redhat-linux/2.7.2.3 にあ ります。 2. 附属プログラムのコンパイル 2.1. pgtclsh をコンパイルする時、リンカが libX11 を捜せません。 次の行を src/Makefile.custom に加えて下さい。 ┌──────────────────────────────────┐ │ X11_LIBDIR = /usr/X11R6/lib │ └──────────────────────────────────┘ 3. 実行時の問題 3.1. createuser などのスクリプトを走らせる時、 _fUnKy_POSTPORT_sTuFf_ が未定義とのエラー報告を受け取ります。 これは、Postgres の V1.06-V1.07 でのバグで V1.08 以上では直っています。 3.2. postmaster を走らせた後、システムが ' Bad system call(Core dumped) ' と言います。 これは、共有メモリのサポートを組み込まないでカーネルのコンパイルをして しまったことを示します。Linux カーネルにこの機能を組み込んでコンパイル し直す必要があります。 3.3. postmaster を走らせようとする時、次のようなエラーを受け取るのはな ぜですか? ┌──────────────────────────────────┐ │ Failed Assertion("!(file != 0):(null)", File: │ │ "/usr/local/PostgreSQL/src/backend/storage/file/fd.c", Line: 257) │ │ !(file != 0) (0) │ │ initdb: could not create template database │ │ initdb: cleaning up. │ └──────────────────────────────────┘ /dev/null ファイルのアクセス権が間違っています。 ls -l /dev/null で次のように: ┌──────────────────────────────────┐ │ crw-rw-rw- 1 root wheel 2, 2 Oct 8 18:41 /dev/null │ └──────────────────────────────────┘ 表示されるべきです。 次のコマンドで: ┌──────────────────────────────────┐ │ chmod a+rw /dev/null │ └──────────────────────────────────┘ アクセス権を訂正してください。 3.4. createuser が動かないのはなぜですか? GNU flex のバージョン 2.5.3 と createuser で問題があります。 V2.5.2 に ダウングレードするか、V2.5.4 にアップグレードするか、あるいは、V2.5.3 に doc/README.flex で提供されるパッチを施して下さい。V2.5.4 は: ・ ftp://prep.ai.mit.edu/pub/gnu/flex-2.5.4.tar.gz から入手できます。 3.5. 次のようなエラーを受け取るのはなぜですか: ┌──────────────────────────────────┐ │ IpcMemoryCreate: memKey=155356396 , size=760632 , │ │ permission=384IpcMemoryCreate: shmget(..., create, ...) │ │ failed: Invalid argument │ └──────────────────────────────────┘ Linux カーネルに IPC サポートの組み込みをしていません。このオプションを 生かして、カーネルを構築し直す必要があるでしょう。 3.6. どうして、psql が次のように失敗するのですか: 'psql: can't load library 'libpq.so.1' psql は libpq ライブラリに動的に結合するようにコンパイルされています。 これを解決するには、root でログインして、ファイル ┌──────────────────────────────────┐ │ /etc/ld.so.conf │ └──────────────────────────────────┘ を編集します。PostgreSQL ライブラリのディレクトリ(PostgreSQL をインスト ールしたところの lib サブディレクトリ) の名前をそのファイルの終りに一行 加えます。そうして、 ┌──────────────────────────────────┐ │ /sbin/ldconfig -v │ └──────────────────────────────────┘ を走らせます。 あるいは、(もし、root になれなければ)、LD_LIBRARY_PATH 環境変数を使って も構いません。 LD_LIBRARY_PATH 環境変数は、共有ライブラリが捜されるパスをコロンで区切 ったたリストです。このリストは、ldconfig により指定されたライブラリの前 に捜されます。 この指定は、bash では: ┌──────────────────────────────────┐ │ export LD_LIBRARY_PATH='PathToPGSQL'/lib │ └──────────────────────────────────┘ のようにし、また、tcsh を使っている場合は: ┌──────────────────────────────────┐ │ setenv LD_LIBRARY_PATH 'PathToPGSQL'/lib │ └──────────────────────────────────┘ として、'PathToPGSQL' を適切な PostgreSQL の最上部のパスに置き換えます 。 ldd コマンドは動的結合の実行モジュールにその実行モジュールが依存してい るすべての共有ライブラリのパスをリストするのに使うことができることに注 意して下さい。 3.7. その他の奇妙な振舞。 全く動作しない時以外にどんな兆候となるかはわかりませんが、動的ローダが libpq ライブラリの正しいバージョンをロードすることに注意を払う必要があ ることだけは明らかです。もし、古いバージョンがライブラリパス(例えば、/ usr/lib)のどこかにあると、ロードするつもりの新しいバージョンのかわりに ロードされてしまうかもしれません。古いバージョンがパスにないのを確かめ るとともに、Q3.6 のライブラリのロードについての詳細を見て下さい。 3.8. PostgreSQL が走っている時にシステムをシャットダウンすると、 Linux はリブートの時にいつもディスクを fsck します。 この事例が幾つか報告されていますが、それは INSTALL ドキュメトの提案に従 って /etc/inittab から PostgreSQL を走らせた結果のように見受けられます 。 ですので、postmaster を rc スクリプトから始動することをお勧めします。 Slackware系のリリースでは、 /etc/rc.d/rc.local を修正して postmaster を 始動すると良いでしょう。 RedHat系のリリースでは、 SysV スタイルのスクリ プトを /etc/rc.d/init.d 枠組ファイルを基に /etc/rc.d/rc3.d に作るべきで す。 ファイルの例が contrib/linux/postgres.init にあります。 ここにも、必要に応じて修正すべきですが、John Robinson が提供する、もう 一つのファイルの例があります。 ┌─────────────────────────────────────┐ │ #!/bin/sh │ │ # │ │ # postgreSQL.init This shell script takes care of starting and stopping │ │ # the PostgreSQL postmaster. │ │ # │ │ │ │ # Source function library. │ │ . /etc/rc.d/init.d/functions │ │ │ │ # Source networking configuration. │ │ . /etc/sysconfig/network │ │ │ │ # Check that networking is up. │ │ [ ${NETWORKING} = "no" ] && exit 0 │ │ │ │ # See how we were called. │ │ case "$1" in │ │ start) │ │ # Start daemons. │ │ echo -n "Starting postgres Postmaster daemon:" │ │ if [ -z "`pidofproc postmaster`" ] │ │ then │ │ su postgres -c "/usr/local/pgsql/bin/postmaster \ │ │ -D /home/postgreSQL/data -p 5432 &" │ │ echo -n " postmaster" │ │ else │ │ echo -n " (already running)" │ │ fi │ │ echo │ │ touch /var/lock/subsys/postgres │ │ ;; │ │ stop) │ │ # Stop daemons. │ │ echo -n "Shutting down postgres Postmaster daemon: " │ │ killall -TERM postmaster 2>/dev/null │ │ killall -TERM postgres 2>/dev/null │ │ echo │ │ rm -f /var/lock/subsys/postgres │ │ ;; │ │ *) │ │ echo "Usage: postgres {start|stop}" │ │ exit 1 │ │ esac │ │ │ │ exit 0 │ └─────────────────────────────────────┘ 3.9. regression テストの問い合わせ 32 にとても時間がかかるのはなぜです か? これは、linux マシンでのみ起きる regression スクリプトのバグによるもの です。私の知る限りでは、(石井達夫さんからの情報によると): 1. regress.sh の中で次の: ┌─────────────────────────────┐ │ time postgres -texecutor -tplanner -Q bench < bench.sql │ └─────────────────────────────┘ を ┌────────────────────────────┐ │ postgres -texecutor -tplanner -Q bench < bench.sql │ └────────────────────────────┘ に変える。 2. テストを走らせた後で、bench.out の終りに近い、たとえば次のような行: ┌────────────────────────────────────────┐ │ 85.86user 114.47system 4:49.20elapsed 69%CPU (0avgtext+0avgdata 0maxresident)k│ └────────────────────────────────────────┘ を取り除いてから、 ┌────────────────────────────┐ │ sh ./perquery < bench.out > & bench.out.perquery │ └────────────────────────────┘ を実行します。 3.10. ある date/time の演算で、以下のような妙な丸めとなるのはなぜですか ? 2.0.7 よりも前の新 glibc2 を走らせていますね。ライブラリをアップデート して下さい。 (sgml conversion, y.senda, ysenda@pop01.odn.ne.jp, 2001/09)