Ubuntu で PostgreSQL を使ってみよう(続編)

Ubuntu で PostgreSQL を使ってみよう(続編)

前回までで、Ubuntuに付属するPostgreSQLパッケージのインストールと使用方法を解説しました。 このページでは、Ubuntu独自のPostgreSQLパッケージの内容をもう少し詳しく説明し、 コミュニティ版との違いやデータベースの設定方法を解説します。

1. コミュニティ版との主な違い

Ubuntu では、PostgreSQLの設定方法がPostgreSQLのマニュアルにかかれているものとは若干違います。

1.1 initdb がない

PostgreSQLのプログラムをインストールした後でまず行わなければならないのは「データベースクラスタ」の初期化です。 データベースクラスタとは、PostgreSQLサーバが管理するデータベースの集まりのことで、 実際にはファイルシステムの指定した場所にデータベースを構成するファイルなどが格納されるようになっています。

このデータベースクラスタの中にいろいろなデータベースを作っていくことができるのです。 前回までの記事に書かれた手順を実行すると、データベースクラスタの初期化とPostgreSQLサーバの起動までが実行されます。 この後、createdb などのプログラムを作って実際にデータベースを作っていく訳です。

PostgreSQLのマニュアルによれば、これはinitdb プログラムを使って行うように書いてあります。 同じサーバマシンに複数のデータベースインスタンス(データベースクラスタ)を作成するにもこの initdb のプログラムが必要です。

ところが、Ubuntu の PostgreSQL パッケージをインストールしても、initdb が見つかりません (実際には別の場所にインストールしているのですが、これは後述します)。

1.2 pg_ctl がない

PostgreSQLのマニュアルに よれば、PostgreSQLサーバの起動や終了は pg_ctl プログラムを使って行うように書かれています。 しかし、UbuntuのPostgreSQL パッケージをインストールしても、pg_ctlが見あたりません。 (これも別の場所にインストールしてあります)。

1.3 実際の起動終了

UbuntuのPostgreSQLパッケージでは、PostgreSQLサーバの起動と終了は、 /etc/init.d に格納されている postrgresql-8.3 シェルスクリプトを用いて行います。 これは第3回 に紹介したとおりです。 ここでも pg_ctl は使われていませんし、このシェルスクリプトを見てもpg_ctlは呼び出されていません。

このように、Ubuntu の PostgreSQLパッケージの起動終了、初期化は PostgreSQL のマニュアルで書かれているものとはずいぶん違ったものになっています。

2. Ubuntu のPostgreSQL パッケージのアーキテクチャ

UbuntuのPostgreSQLパッケージのアーキテクチャは、インストールしたファイル /usr/share/doc/postgresql-common/architecture.html に解説してあります。 以降、この内容とUbuntuのPostgreSQLパッケージでのデータベースの初期化や開始終了のツール、PostgreSQL のマニュアルどおりの運転のしかたについて解説していきます。

上記のファイルによれば、Ubuntu では異なるバージョンのPostgreSQLのプログラムやデータベースが同居できるようになっていて、こうすることによってデータベースのバージョンアップが容易にできるようにしているということです。 PostgreSQL のバイナリのバージョンをメジャーアップグレードすると、データベースもそのままでは互換がないので、一旦古いバージョンのデータベースの内容を取り出して、その後新しいバージョンのデータベースにしなければならないのですが、これが簡単にできるようにしているのです。そのため、異なるバージョンのバイナリを同じ名前で呼べるようにし、PostgreSQLのバージョンに応じて実際に動作するプログラムを切り替えられるようにしています。

initdb と pg_ctl だけは、別なツールを使わなければなりませんが、それ以外のコマンドは、全て元のPostgreSQLと同じ名前になっています。 動作は次のとおりです。

  1. どのコマンドも、実体は pg_wrapper というコマンドです。
  2. ローカルなデータベースがターゲットの場合は、PGCLUSTER変数などを使ってPostgreSQLのクラスタとバージョンを決めます。詳細は、pg_wrapper のマニュアルを参照してください。
  3. これでバージョンとクラスタが決まったら、それぞれの実行モジュールを起動します。

実際にPostgreSQLを使用する際には、コマンド名などで困ることはないと思います。 手動でデータベースクラスタを作ったり、データベースの起動終了を行う場合には少し注意が必要です。

3. 使用するPostgreSQLのバージョン番号やデータベースクラスタ、データベース名の指定

3.1 user_clusters ファイル

これは、/etc/postgresql-common/user_clusters ファイルで指定します。このファイルはLinuxユーザが使うPostgreSQLデータベースの情報をユーザごとに1行で指定したファイルで、ユーザ 名、グループ名、PostgreSQLのバージョン番号、クラスタ名、データベース名を指定します。

例えば、デフォルトのデータベースの場合、 postgresユーザがpostgresグループでバージョン8.3のクラスタmainのデータベースpostgresを使うので、 これに対応する行は

postgres  postgres  8.3  main  postgres

となります。

Linuxユーザのホームディレクトリにファイル.postgresqlrc があると、こちらの内容を優先します。 ただし、ここで指定できるのは自分のユーザに関してだけです。

こうすることで、複数のPostgreSQLのサーバが同時に起動されていても、実際に使用するサーバを簡単に切り替えることができるようになります。

3.2 autovacuum.confファイル

このファイルは /etc/postgresql-common ディレクトリにあり、autovacuum の設定を決めるものですが、バージョン 8.1 以降では autovacuum がサーバ内部で実行されるようになり、この設定を postgresql.conf ファイルで行うようになったので、使用する必要はありません。

3.3 クラスタ毎の設定ファイル

クラスタ毎の設定ファイルは /etc/postgresql/ version / clusetername ディレクトリに格納されています。 ここで、version は PostgreSQL のバージョン番号、clustername はクラスタを格納するディレクトリの名前です。 たとえば、今回紹介している方法でインストールすると、version は 8.3, clustername は main になります。

このディレクトリには、postgresql.conf, pg_hba.conf, pg_ident.conf ファイルが格納されます。これらはそれぞれサーバの起動オプション、ユーザの認証方法、ユーザ名のマッピングを定義するファイルです。この設定方法は PostgreSQLのマニュアルを参照してください。

これ以外にもいくつかのファイルをこのディレクトリに格納することができます。

(1) start.conf ファイル

クラスタの起動方法を指定します。次のどれかの文字列を入れます。

auto: init.d のスクリプトでクラスタの起動終了を行います。

manual: init.d のスクリプトでは起動終了しません。pg_ctlcluster(後述) を使用します。

disabled: pg_ctlcluster の使用を禁止します。

(2) environment ファイル

PostgreSQLの起動時にサーバのpostmasterプロセス用に設定する環境変数を指定します。

(3) 運転ログへのシンボリックリンク

これ以外に、postmaster の運転ログへのシンボリックリンクが張られる場合があります。

3.4 バージョン毎のバイナリやシェルスクリプトなど

これらは次のディレクトリに格納されます。

(1) /usr/lib/postgresql/version

バージョン毎のバイナリプログラムやライブラリがここに格納されます。先ほど見つけられなかった initdb や pg_ctl もここにインストールされてます。

(2) /usr/share/postgresql/version

ここには、マニュアルやサンプルがインストールされています。

(3) /usr/share/doc/postgresql/postgresql-doc-version

文書類が格納されています。

4. Ubuntu 独自のプログラム

UbuntuのPostgreSQLが提供してる独自のプログラムを以下に紹介します。

(1) pg_wrapper

pg_wrapper - PostgreSQLのクライアントコマンドのラッパです。clusterdb, createdb, createlang, createuser, dropdb, droplang, dropuser, pg_dump, pg_dumpall, pg_restore, psql, reindexdb, vacuumdb のプログラムはすべて pg_wrapper へのシンボリックリンクになっていて、pg_wrapper がデータベースのバージョンやクラスタの判定を行い、対応するプログラムを起動するようにしているのです。

(2) pg_lsclusters

PostgreSQLのすべてのクラスタに関する情報を表示するプログラムです。 コミュニティ版のPostgreSQLではこれに対応するコマンドはありません。

(3) pg_createcluster

新たなPostgreSQLクラスタを作成します。これが initdb の代わりになります。

(4) pg_ctlcluster

PostgreSQL クラスタの開始/終了/再開/リロードを行います。 これがpg_ctlの代わりになります。

(5) pg_upgradecluster

既存のPostgreSQLクラスタを新しいメジャーバージョンにアップグレードするコマンドです。 コミュニティ版のPostgreSQLではこれに対応するコマンドはありません。

(6) pg_dropcluster

PostgreSQL のクラスタを完全に削除するプログラムです。コミュニティ版のPostgreSQLではこれに対応するコマンドはありません。

これらのツールのマニュアルも Ubuntu パッケージとしてインストールされますが、現在は英語だけなので、日本語版を資料編に示します。

5. マニュアル通りに使うには

ほとんどのPostgreSQLのコマンドは、/usr/bin ディレクトリにインストールされていますが、これらはpg_wrapper へのシンボリックリンクになっています。

本物のバイナリファイルは、次の2つのディレクトリに格納されています。

/usr/lib/postgresql/version/bin
ここには実行ファイルが格納されています。initdb もここにあります。
/usr/lib/postgresql/verison/lib
共有ライブラリが格納されています。

これら2つのディレクトリ上のプログラムやライブラリを直接使えるように PATH や LD_LIBRARY_PATH を設定すれば、PostgreSQL のコマンドを直接起動できるようになります。

3, 4 で説明した構成と矛盾しないように、接続用のポートは重複しないものを割り当てる必要があります。