PostgreSQL >=V6.1 のためのよくある質問(FAQ)

Anderw C.R. Martin

martin@biochem.ucl.ac.uk

桑村 潤 - 日本語訳

juk@rccm.co.jp

Jun 19 1998


訳注: この文書の最新版は、 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. PostgreSQL のコンパイル

  2. 附属プログラムのコンパイル

  3. 実行時の問題

1. PostgreSQL のコンパイル
1.1. src/Makefile.globalsrc/Makefile.custom には何を変更すればよいでしょうか、また、その他に必要な変更は ありますか?
1.2. libreadline が見つからないという問題はなぜ起こりますか?
1.3. [REDHAT] libdldlfcn.h が見つからないという問題はなぜ起こりますか?
1.4. [SLACKWARE 3.1] libdldlfcn.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] cursestermcap はどこにありますか?
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_LIBlibsocketlibnsl への参照は 何ですか?
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 のコンパイル

このこと自身が、コンパイルの最後のフェーズで dlopen() dlclose() などのような関数とリンクできないことを 明示しています。

libdl ライブラリは ユーザ提供関数として実行時に 動的結合されま す。いくつかの理由のためにこのライブラリは Redhat の配給から洩 れました。最近の RedHat 4.0(Colgate) では直っています。

今は、新しい ld.so の RPM パッケージが RedHat の FTP サイトに あります。簡単に入手するには:

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 の質問と同じ問題を直すかのどちらをしても構いま せん。ただし後者方法は、自分でやっていることがおわかりでなけれ ばやらないで下さい。

このこと自身が、コンパイルの最後のフェーズで 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 をしなければならないでしょう。

SuSE-Linux 4.2 に ncurses はありますが curses はありません。 4.4 には両方あります。SuSE-Linux の termcap ライブラリもまた /usr/lib の中ではなく /usr/lib/termcap の中にあります。

実際のメッセージは以下のようなものです:

  -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 にあります。

3. 実行時の問題

この事例が幾つか報告されていますが、それは INSTALL ドキュメトの提案に従って /etc/inittab から PostgreSQL を走らせた結果の ように見受けられます。

ですので、postmasterrc スクリプトから始動することをお勧め します。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

(sgml conversion, y.senda, ysenda@pop01.odn.ne.jp, 2001/09)