第4回 Apache+PostgreSQL+Rubyで作るWebアプリケーションサーバ
その2:PostgreSQLのインストール
2002/05/18作成
2004/12/17更新
続いてPostgreSQLのインストールです。
Apacheに比べると段違いに難易度が高いです。ていうかめんどくさいです。
ちなみにPostgreSQLの読み方ですが、ポストグレ・エスキューエルと読んだりポストグレス・キューエルと読んだりします。
省略するときはポストグレスと言います。PostgreSQLの昔の名前がpostgresと言われていたことがあることから由来しています。
(2004/12/17追加)
作業メモのつもりで書いたのですが、かなり使いづらいコンテンツになっていたことに気づきました。
SQL文の書き方を追加したので、これでいちいちリファレンス見なくても済みそうです。
データ型とかWHERE文の書き方とかサブクエリの使い方はさすがにリファレンス見ないとダメですけど。
1.カーネルの再構築
PostgreSQLではSYSTEMV共有メモリとセマフォというのを利用しているらしく、FreeBSDではデフォルトで使えるようにはなっていますが最適にするためカーネルを調整します。
Linux、Solaris、HP-UX、IRIXなどはそれぞれで対処法が違うのでPostgreSQLのドキュメントを読んで確認してください。
FreeBSDではGENERICカーネルでもある程度までは動きますが、データベースが重くなったりすると動かなくなる可能性があります。うちも以前FreeBSD4.4のGENERICで動かしていたらある日突然動かなくなりました。
カーネルの再構築は現在使っているカーネルソースをコピーして編集します。
GENERICカーネルの場合、だいたい51行目くらいにSYSV関連の設定が書いてあります。
そこを以下のように変更します。
options SYSVSHM
options SHMMAXPGS=4096
options SHMSEG=256
options SYSVSEM
options SEMMNI=256
options SEMMNS=512
options SEMMNU=256
options SEMMAP=256
あとはいつものように、configしてmake depend,make,make installします。
2.gmakeのインストール
カーネルの再構築が済んだら次はインストールです。
ところが、PostgreSQLをインストールするためにはgmakeが必要になります。
とりあえずgmakeが入っているか確認します。
# gmake --version
バージョンが3.76.1以上だったら問題ありません。
それ以下のバージョンだったりgmakeが入っていなかったらインストールします。
インストール方法はいろいろありますが、ここではPostgreSQLのインストールがメインなので詳しくは説明しませんが、gmakeはメジャーなソフトなので/stand/sysinstallやportsコレクションから簡単にインストールできると思います。
3.PostgreSQLのインストール
ようやくインストールです。
ソースは日本だとSRAか日本PostgreSQLユーザ会あたりから入手できます。
ソースを展開します。
% tar zxvf postgresql-7.2.tar.gz
続いてconfigureしますが、オプションがたくさんあります。
詳しくはこちらのドキュメントを読んでください。ドキュメントはPostgreSQL7.1.3ですが、7.2でも問題ないです。
日本語で使うことがある場合はmultibyteオプションは有効にした方がいいと思います。
また、あとで入れるruby-postgresがCのライブラリを使うので--with-CXXも有効にしたほうがいいかもしれません。
% cd postgresql-7.2
% ./configure --enable-multibyte --with-CXX
あとはmakeに入りますが、makeはgmakeを使うので、こんな感じです。
% gmake
% gmake check
% su
password
# gmake install
これでインストールは完了です。
4.PostgreSQLユーザの作成
PostgreSQLのオペレーションをするときはなるべく専用のユーザを使うようにします。
一般的なのは"postgres"か"pgsql"のようです。今回は"postgres"ユーザを作成することにします。
以下はFreeBSDの場合です。Linuxの人はそれぞれマニュアル読んでください。
# pw groupadd postgres -g 5432
# pw useradd postgres -g 5432 -u 5432 -d /usr/local/pgsql -s /bin/csh
postgresユーザを作ったらpgsqlフォルダをpostgresに譲ります。
chownの-Rオプションは子ディレクトリも含めて一括で変更を加えることができます。
chmodでも同様に使えます。
# chown -R postgres:postgres /usr/local/pgsql
5.データベースの準備
続いてデータベースを準備します。
PostgreSQLがソフトウェアとして動作するための実行ファイルやライブラリなどがあるディレクトリは
/usr/local/pgsqlですが、データベースのファイルは別におくことにします。
データベースは比較的アクセスが集中し、更新が頻繁に行われるので、
/var/pgsql/dataフォルダにおくことにします。
# mkdir -p /var/pgsql/data
# chown -R postgres:postgres /var/pgsql
今度はpostgresユーザになってDBを作成します。
initdbでデータベースを初期化して、initlocationでデータベースを初期化します。
# su postgres
% initdb -D /var/pgsql/dat
% initlocation /var/pgsql/data
これでデータを格納する準備ができました。
次の作業をするためにはPostgreSQLを起動しなければいけないのでさっそく起動しましょう。
6.postmasterの起動
PostgreSQLの起動方法は2種類あります。直接postmasterを起動する方法と、pg_ctl経由で起動する方法です。
どちらの方法も、PostgreSQLの管理ユーザが起動させるので、suを使って起動します。
rootで起動できそうな気もするのですが、rootでは起動することができません。
pg_ctlはpostmasterを起動したり停止したり再起動したりできる便利なツールなのですが、rubyのライブラリからデータベースにアクセスしようとしたとき、socketが使えないといけないのでpostmasterに"-i"オプションが必要になります。
デフォルトでは"-i"オプションが有効では無いので、オプションの付け方がよくわからなかった私は最初のころ手動でpostmasterを起動していました。
ちなみにSendmailなどのMTAでもpostmasterというのが出てきますが、これは別のものです。間違えて恥をかかないようにしましょう。
# su postgres -c '/usr/local/pgsql/bin/postmaster -i -D /var/pgsql/data &'
でも、これだとあまりよろしくないので、以下のコマンドでpg_ctlから起動するといいと思います。
# su postgres -c '/usr/local/pgsql/bin/pg_ctl start -o -i -D /var/pgsql/data '
ホスト起動時に自動的に起動させるためには上記のコマンドをrc.localなどに書いておきます。
"&"を忘れるとコンソールが固まってしまうので忘れずに入れてください。
先日Redhat Linuxに入れたときですが、/etc/rc.d/init.d/postgresqlがデフォルトで"-i"オプションがたたないようになっています。
ファイル自体はshスクリプトなので手動で直せます。"-o -i"を加えてあげてください。
もし、起動しなかったらinitdbしてみてください。
そのとき、/var/pgsql/dataにゴミがあると怒られるので事前に消しておきましょう。
% rm -rf /var/pgsql/data/*
% initdb -D /var/pgsql/data
7.データベースの作成
createdbでデータベースを作成します。ちなみにcreatedbをするためにはpostmasterが動いていないとダメです。
何も付けないとデフォルトのディレクトリにデータベースが作成されますが、-Dオプションを指定するとデータベースを作る場所を明示することができます。
% createdb -D /var/pgsql/data testdb
と、昔はこれで通ったのですが、6.4からは"-D"の絶対パス指定がダメになりました。
なので、こう入れろと本に書いてあります。(cshの場合)
% setenv DBDATA /var/pgsql/data
% createdb -D DBDATA testdb
しかし、これでもダメです。
絶対パスがダメなら相対パスでどうだということで試してみたのですが、これもダメ。
結局全部ダメじゃないですか。
ということで、"-D"オプションを付けるのをやめました。
% createdb testdb
とりあえずこれでデータベースの準備はできました。
あとは任意にテーブルを作って遊んでください。
テーブルの作成や操作方法はここでは割愛します。
8.ユーザの作成
久しぶりにPostgreSQLをインストールしたのですが、この手順書をみてもさっぱりダメでした。
中途半端だったんですよね。データベースができてもこの先の設定をしないと具体的に何をすればいいのかさっぱりですから。
ということで、データベースができたらユーザを追加します。
ユーザを追加する方法は2つあります。
- シェルからcreateuserコマンドを使う
- SQLコンソールからCREATE USERを使う
シェルの場合はこんな感じです。
% createuser [username]
こうするとそのあと、このユーザにデータベースを追加することを許可するかとか、ユーザを追加することを許可するかを聞かれるので適宜答えてあげましょう。
あとは作ったユーザでpsqlでログインすることができます。
% psql -U [username] -d database
パスワードなしでログインできてしまいました。
それでは困るのでパスワードを設定しましょう。
psql上から設定します。
database=> ALTER USER [username] WITH PASSWORD 'password'
ちなみにpsql上からやると一発だったりします。
database=> CREATE USER [username] WITH PASSWORD 'password'
お好きな方をお選びください。
9.小ネタ
psql上のバックスラッシュコマンドです。
よく忘れるのでメモ代わり。
コマンド 説明 \? ヘルプを表示 \q psqlを終了 \d データベース上のテーブル、インデックス、シーケンスの一覧を表示 \dt データベース上のテーブルのみの一覧を表示 \d [table_name] テーブルのカラム名とタイプ、属性を表示
とりあえずこれだけあればなんとかなるはずです。
具体的には
- \dか\dtで既存のテーブルを確認して
- \d [table_name]でカラム名とタイプと属性を確認して
- それを元にSELECT文を書いたりINSERTやUPDATEする
- 滅多に使わないのは\?で使い方を確認
- \qでおしまい
となります。
10.代表的なSQL文
これもよく忘れるので。
- SELECT文(データベース検索)
- SELECT column1,column2 FROM table_name WHERE [条件] ;
- INSERT文(データベース追加)
- INSERT INTO table_name (column1,column2) VALUES (col1_val , col2_val) ;
- UPDATE文(データベース更新)
- UPDATE table_name SET column = 'update_value' WHERE [条件] ;
- GRANT文(ユーザ権限操作)
- GRANT [SELECT|UPDATE|INSERT|ALL] ON table_name TO user_name ;
<参考文献>
PC UNIXユーザのためのPostgreSQL完全攻略ガイド 石井達夫 著 技術評論社 (通称シーラカンス本)
SRA http://osb.sra.co.jp/PostgreSQL/
PostgreSQL7.1日本語マニュアル http://osb.sra.co.jp/PostgreSQL/Manual/
日本PostgreSQLユーザ会 http://www.postgresql.jp
<余談>
仕事でSRA主催PostgreSQLのセミナーに行ったことがあります。
そのとき、PostgreSQLの主要な開発者であるBruce
Momjian氏とPostgreSQLを日本に紹介した石井達夫氏が講演されていました。
会社の先輩からもらった石井さんの本があったのでそれを抱えてサインでももらおうと思っていたのですが、当日セミナー受講中にみるみる体調が悪くなり、すぐ帰ったのでサインはもらえずじまい。
次会ったときはサインください(笑)
<余談2>
後に知ったのですが、性能面ではPostgreSQLは十分過ぎるほど満たしていますがWebアプリケーションが目的であることを考えた場合、性能よりも速度のほうが重視されることがあります。
そういう意味ではWebアプリケーションにはPostgreSQLよりも高速性に重点をおいて開発が進められてきたMySQLの方が適しているのかもしれません。