phpPgAdmin:Web開発者向けのPostgresクライアントツール
phpPgAdminはPHPで書かれたWebベースアプリケーションであり、1つまたは複数のPostgreSQLデータベースを管理できる。しかも、PostgreSQLとは完全互換である。標準のデータ定義言語(DDL:Data Definition Language)およびデータ操作言語(DML:Data Manipulation Language)のすべてを実行できる。また、クラスタ全体のバックアップとリストア、Slonyによる複製クラスタの管理といった作業もすべて、わかりやすいインタフェース上で行える。
インストール
phpPgAdminのインストールを行うには、Postgres用の適切なPHP接続モジュールが組み込まれたPHP対応のWebサーバが必要になる。
phpPgAdminのインストールは難なく済ませることもできれば、相当な準備とプランニングが必要になることもある。それはインストールをどのように行うか ― ディストリビューションのパッケージマネージャを利用するのか、手作業で行うのか、はたまたインストール先をWindows環境にするのか ― 次第である。
DebianのAPTのようなツールを利用したディストリビューションベースのインストールでは、システムのセキュリティを高めるために設定ファイルの書き換えが行われることが多い。たとえば、ローカルにインストールされているPostgresサーバのURLが「http://localhost/path_to_phppgadmin」でも「http://127.0.0.1/path_to_phppgadmin」でもない場合には、Postgresサーバへの接続をWebサーバにブロックさせることができる。その場合はApacheの設定ファイルを編集する必要があるが、これについては追って説明する。
phpPgAdminをディストリビューションのパッケージリポジトリからではなく、同プロジェクトのWebサイトから入手すれば、最新かつフル機能の実装であることが保証される。ダウンロードしたファイルを展開したら、phpPgAdminのインストールを行う。具体的には、サーバのファイルパス(/var/log/www/phppgadmin)に直接コピーするか、あるいは業界の標準的なやり方に従って、スクリプトをサーバのファイルパス以外のディレクトリにコピーし、次のようなApacheディレクティブを用いるかのどちらかだ。
Alias /phppgadmin /usr/share/phppgadmin/ <DirectoryMatch /usr/share/phppgadmin/> Options +FollowSymLinks AllowOverride None order deny,allow deny from all allow from localhost </DirectoryMatch>
このディレクティブは、サーバが万一攻撃を受けた場合でも権限のない者によるphpPgAdminソースコードの編集を困難にするもので、結果としてセキュリティポリシーの強化につながる。
どのような方法でインストールを行おうと、phpPgAdminを適切に動作させるために重要なのはApacheとphpPgAdmin、それぞれの設定ファイルを正しく設定することである。
すべてのインストールをディストリビューションのパッケージマネージャ経由で行った場合は、やるべきことはほとんど済んでいる。もちろん、ここでの目標はWebサーバを同じホスト上に存在するPostgresサーバに接続することだ。しかし、すべての構築を自力で行う場合や、ほかのマシンからのアクセスを制御したい場合、あるいは複数のPostgresサーバを種類の異なるWebサーバ上で実行する場合には、設定ファイルに手を加える必要がある。また、デフォルトのIPアドレスを変更する場合やPostgresが標準でないポートで接続を待つ場合も同様だ。
phpPgAdminがうまく動作するかどうかは、その設定ファイルの内容と、インストールに用いたパッケージが使っているディストリビューション用にチューニングされたものだったか、あるいはSourceForge.netから入手したディストリビューションに依存しないバージョンだったかによって変わってくる。
なお、phpPgAdminはPHPスクリプトの集まりなので、設定ファイルに施した変更は直ちに反映され、ブラウザの表示を更新すればその結果を確認できる。
phpPgAdminの設定ファイル「/my_path_to/phppgadmin/conf/config.inc.php」(my_path_toは各自の環境に依存する部分)には、「myparameter=myvalue
」という形でパラメータ名と値を指定するペアを用いて動作が定義され、指定ペアごとにその意味を説明するコメントが付いている。
この設定ファイルの10~31行目は、ローカルホスト上に存在する単独のデータベースサーバに必要なパラメータ群である。複数サーバの識別と設定が必要な場合は、33~41行目を必要な数だけコピー・アンド・ペーストすればよい。ただし、各行のコメント記号を消すのと配列の添え字を1つずつ増やすのを忘れないこと。
42~101行目は、グローバル・パラメータを定義している。ほとんどの部分はそのまま使えるはずだが、64行目は‘false’を‘true’に変えて以下のようにするとよいだろう。こうすると、普通のユーザは自分の所有するデータベースしか参照できなくなる。
$conf['owned_only'] = true
Apacheの設定ファイル
たとえ「config.inc.php」を正しく設定しても、サーバに接続できない場合がある。phpPgAdminのDebianパッケージでは、ローカルホスト以外のホストからの接続をすべて禁止するApacheディレクティブが追加されるからだ。この問題は、「/etc/apache2/conf.d/phppgadm」ファイルを編集し、Webサーバを再起動すれば解決できるはずだ。たとえば、ネットワーク192.168.2.0に属するホストからの接続を許可するには、「deny from all
」という行の後ろに「allow from localhost 192.168.2
」という行を追加すればよい。
また、レポート生成機能を有効にするには、「/my_path_to/phppgadmin/conf/config.inc.php」内の変数「$conf['show_reports']
」を‘true’にしてスクリプト「reports-pgsql.sql」を実行する。レポートは基本的にはユーザによる定義が可能なスクリプトであり、SQL命令群で構成されている。このあたりはpsqlのスクリプトファイルと似ている。誰がレポートを生成できるかといった権限を設定するには、次のようなコマンドを用いる。
GRANT SELECT,INSERT,UPDATE,DELETE ON ppa_reports TO PUBLIC; GRANT SELECT,UPDATE ON ppa_reports_report_id_seq TO PUBLIC;
また、レポートの所有者でないユーザにもレポートの参照を許可するには、変数「$conf['owned_reports_only']
」の設定を変更する。
なお、既製のレポートスクリプトは用意されていない。phpPgAdminによるレポートの実装は、そのために特別に用意したデータベース内に置かれる、ユーザの定義したSQLスクリプトの生成と実行の各部分から成る。
ただし、データベース監視アクティビティ(詳細はFAQを参照)に関するレポート生成を行うには、PostgresのStatistics Collectorを有効にしておく必要がある。
phpPgAdminの使い方
簡単にphpPgAdminが使えるかどうかは、どの程度SQLとPostgresを理解しているかによる。DBA(データベース管理者)としての経験が豊富なほど、このクライアントを楽に使いこなせるだろう。
ここではphpPgAdminへのアクセス用URLを「http://localhost/custom_phppadmin」とするが、このURLはphpPgAdminスクリプトの最上位ディレクトリを起点とする限り、どこに設定しても構わない。
phpPgAdminのインターフェイスは2つのパネルに分かれている。左側のパネル、オブジェクトブラウザには定義されているエンティティ群が表示される。右側のパネルがメインパネルで、より詳細な情報が表示される。すべての管理作業はこちらのパネルで実行することになる。ログインするには、起動画面のメインパネル側にある「Servers」をクリックするか、オブジェクトブラウザ側のサーバアイコンをクリックする。ログインに成功すると、メインパネルにデータベースのリストが表示される。また、オブジェクトブラウザ内の‘+’をクリックすると、そのクラスタ内にあるすべてのデータベースが現われる。
メインパネルには、クラスタ全体のデータベース、ロール、テーブル空間、エクスポート、またはレポートの状況が表示される。ただし、最後のレポートは、それ以前にレポートスクリプトを実行していなければ表示されない。メインパネルまたはオブジェクトブラウザのどちらかで階層を掘り進むと、さらに別のオブジェクトの情報が得られる。また、オブジェクトブラウザとメインパネルはある程度独立して動作しているので、別のデータベースからテーブル定義を参照していても、メインパネルのテーブルにデータを挿入することができる。
phpPgAdminは堅牢性に優れている。その動作はWebブラウザとWebサーバの本来の特性に基づいたものなので、長いトランザクションの途中でフリーズするようなことはない。phpPgAdminのセキュリティは、SSLとWebサーバのセキュリティ・ディレクティブを利用することで必要なだけ高めることができる。不正なログインからデータベースを保護できるかどうかには、インストール方法が影響している。phpPgAdminがLinuxディストリビューション経由でインストールされた場合、phpPgAdminへのログインはローカルホストからのみに制限される。しかし、クライアントを自力でインストールして、Webサーバのファイル・ディレクティブを使ったセキュリティポリシーの設定が適切に行われなかった場合は、リモートホストからのログインが可能になる場合がある。設定ファイル「config.inc.php」ではUNIXドメインソケット経由でのPostgresサーバへの接続がデフォルトになっており、Postgresのデフォルトの認証ポリシーではUNIXドメインソケット経由の接続がパスワードを用いることなく誰にでも許可されているので注意すること。また、phpPgAdminはJavaScriptもAjaxも使用しないので、ブラウザではサーバのセッション管理のためにクッキーを有効にする必要がある。
phpPgAdminによる管理
phpPgAdminによる管理のすばらしい点は、さまざまなDDLおよびDMLの動作のためのページレイアウトにある。アクティビティを手際よく実行できるようになっているからだ。たとえば、テーブルへのデータの挿入は、キーボードからなるべく指を離したくないという人でも(つまりマウスなしでも)すばやく簡単に行える。またphpPgAdminには、ビューの作成など、お決まりの管理作業を簡単に済ませられるウィザードが用意されている。関数のソースコードも行番号付きで参照できるので、デバッグ用途にも問題なく使える。
ナビゲーション
サーバとその各種オブジェクトの表示は、オブジェクトブラウザ内のディレクトリツリーまたはメインパネル上に表示されるURLリンクをクリックするだけで簡単に切り替えられる。どちらかの領域で‘+’の記号をクリックすると、下位のオブジェクトが表示される。また、テーブルを管理するための便利なボタン群が存在し、テーブルの閲覧、SQLクエリの実行、データの挿入、データテーブルの消去、テーブルの削除、テーブルのバキューム処理といった操作がボタンで行える。
オブジェクトブラウザとメインパネルの動作は、ある程度独立している。そのため、メインパネルのテーブルへのデータ挿入と、別のデータベースからのテーブル定義の参照とを同時に行うことが可能だ。
関数の作成
phpPgAdminでは3種類の関数を作成できる。手続き型の組み込み関数PL/SQL、事前に作成されオブジェクトファイルとしてコンパイル済みの関数を呼び出す内部関数、そしてC言語の関数の3つだ。
関数を作成するには、対象のスキーマを画面に表示したうえでメインパネル上部の“function”リンクをクリックする。利用可能な手続き言語を選択すると、関数のソースコードへの入力が可能になる。
また、既存の関数のソースコードも参照できるが、行番号が表示されるのでデバッグ作業はかなり楽に行える。
データのエクスポート
データをエクスポートするには、Postgresサーバのユーティリティpg_dumpとpg_dumpallがWebサーバと同じホスト上にインストールされている必要がある。この点は、たとえ管理対象のPostgresサーバが別のホスト上に存在していても変わらない。以下に示すコードは、設定ファイル「config.inc.php」内でphpPgAdminによるPostgresサーバのダンプを可能にする部分である。
$conf['servers'][0]['pg_dump_path'] = '/usr/bin/pg_dump'; $conf['servers'][0]['pg_dumpall_path'] = '/usr/bin/pg_dumpall';
まとめ
phpPgAdminは使い勝手に優れ、簡単にプロダクション環境に組み込めるPostgreSQLクライアントだ。本稿を読んでも得心が行かないという人は、phpPgAdminプロジェクトのFAQを読むとよいだろう。そこには、詳しいインストール手順も記されている。
Robert BernierはPostgreSQL専門のコンサルタント兼トレーナ。Sys-Admin、Hakin9、PHP Magazine、PHP Solutions、O'Reilly Networkで執筆活動を行う。Postgresを中心に据えたLinuxライブCDディストリビューションpg_liveのメンテナでもある(pg_liveは世界各地の展示会、カンファレンス、研修センタで利用されている)。