PostgreSQLデータベース設定



●インストール(rpm)

 RPMバイナリをインストールします。
# yum install postgresql postgresql-libs postgresql-server postgresql-devel postgresql-contrib
# sudo postgresql-setup initdb


●インストール(tar)

RPMパッケージの削除

 PostgresSQLのRPMパッケージがインストールされているか確認します。
# rpm -qa | grep postgresql
 インストールされている場合は、削除します。
# rpm -e postgresql*
または
# yum remove postgresql*
上記により、依存するファイルも削除されます。

postgresユーザの作成

 PostgresSQLサーバのユーザにpostgresを作成します。PostgreSQLはrootで起動できないため、PostgreSQLを利用するユーザとしてpostgresを作成します。
# groupadd postgres ← 「postgres」グループの作成
# useradd -g postgres -d /usr/local/pgsql postgres
 ↑ 所属グループを「postgres」、ホームディレクトリを「/usr/local/pgsql」として、
   「postgres」ユーザを作成
# passwd postgres
 補足:RPMパッケージを削除しても「postgres」ユーザが残る場合の対処
 # usermod -g postgres -d /usr/local/pgsql -m postgres
  ↑ デフォルトグループを「postgres」、ホームディレクトリを「/usr/local/pgsql」に移動
   -c comment	login のコメントを変更する。
   -d home_dir 	login のホームディレクトリをhome_dirに変更する。後ろに-mをつけると、
        	現在のホームディレクトリの中身が新しいホームディレクトリに移動する。
        	上記の場合、「/usr/local」までは作成しておくこと。
        	また、そのディレクトリが存在しない場合は新たに作られる。
   -e expire_date 	アカウントが使用不能になる日付。日付はYYYY-MM-DDで指定する。
   -f inactive_days 	パスワードの使用期限が切れてからアカウントが永久に使用不能になるまでの日数。
			0とすると、パスワードの期限が切れると同時にこのアカウントは使用不可能になる。
			-1を指定すると無期限に。
   -g initial_group 	デフォルトのグループをinitial_groupに変更する
   -G group,[...] 	アカウントが属する、サブグループを追加。グループはコンマ区切り。
			元々入っていたグループをここで指定しないと、そのグループから削除されます。
   -l login_name 	ユーザのログイン名をloginからlogin_nameに変更する。パスワードとかもそのまま。
			ホームディレクトリの名前くらいはを変えてあげましょう。
   -s shell 	ログインシェルをshellに変更する。
   -u uid 	ユーザのID番号を指定したものへ変更する。
   -L 	ユーザのパスワードをロックする。
     	ロックされたアカウントは、パスワード認証でのログインができなくなります。
   -U 	ユーザのパスワードをアンロックする。-Lの反対です。 
インストール先ディレクトリを作成します。
# mkdir /usr/local/pgsql
# chown -R postgres:postgres /usr/local/pgsql

PostgreSQLのダウンロード

 以下のページより、最新版をダウンロードします。
 http://www.postgresql.org/
または
 ftp://ftp.postgresql.org/pub/

 今回は、postgresql-8.3.7.tar.gzをダウンロードし、/usr/local/srcに保存しました。

PostgreSQLのインストール
# cd /usr/local/src
# tar zxvf postgresql-8.3.7.tar.gz ← 解凍
# su - postgres
$ cd /usr/local/src/postgresql-8.3.7
$ ./configure ← 構成(configuration)
インストールについては、PostgreSQL 8.3.7文書 第15章インストール手順15.5. インストール手順を参照
$ gmake all ← 構築
 問題がなければ、最後に以下のような行が表示される。
 All of PostgreSQL is successfully made. Ready to install.
 コンパイルの途中で下記のエラーが発生
 /bin/sh: line 1: libpq.rc: 許可がありません
 下記により対応
  /usr/local/src/postgresql/src/interfaces/libpq/libpq-rc ファイルのパーミッションを変更
  $ su - ← 一度rootに戻る
  # chmod 777 /usr/local/src/postgresql/src/interfaces/libpq/libpq-rc ← アクセス権変更
  # su - postgres ← 再度、postgresユーザに戻る
  $ gmake all ← 再度、構築
$ gmake check ← テスト
$ gmake install ← インストール
 インストールが完了すれば、下記のように表示されます。
 PostgreSQL installation complete.

環境変数の設定

postgresユーザの .bash_profileを編集します。
$ vi ~/.bash_profile
export PATH=$PATH:/usr/local/pgsql/bin
export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=$POSTGRES_HOME/lib
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export PGDATA=/usr/local/pgsql/data
設定を反映させます。
$ source ~/.bash_profile
 上記設定を、全ユーザに反映させたい場合は「/etc/bash_profile」を編集し、設定を反映させます。
 では、次にデータベースを初期化します。
 PostgreSQLを使用できる状態にするには、一度データベースクラスタを初期化する必要があります。データベースクラスタとは、複数のデータベースを格納する領域です。データベースクラスタを初期化するには、postgresユーザでinitdbコマンドを実行します。
 PostgreSQLでは、initdbコマンドを実行したユーザがスーパーユーザーになります。また、データベースクラスタはPGDATA変数で指定したディレクトリに作成されます。
$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
または
$ /usr/local/pgsql/bin/initdb --encoding=UTF8 --no-locale
初期化が完了すれば、下記のように表示されます。
「Success. You can now start the database 〜」
 --encodingは、データベースのデフォルトの文字エンコーディングを設定するオプションです。ここでは、文字エンコーディングにUTF-8を指定しています。
 --no-localeは、ロケールを使用しないことを設定するオプションです。ロケールとは、言語や文化に応じた処理をするOSの機構です。
 PostgreSQLでは、このロケールを主にデータのソート処理に使用しますが、英語や日本語のデータを扱う場合には特に必要ありません。反対にロケールを設定すると、ロケール処理の分、ソート処理などが遅くなりますので、注意してください。

PostgreSQLの起動

 postgresユーザで起動します。
$ pg_ctl -w start
 「server started」と表示されれば成功です。

 停止する場合は以下のようにします。
$ pg_ctl -w stop
 「server stopped」と表示されれば成功です。

強制停止1
全てのトランザクションをロールバックさせて、セッションは強制切断してデータベースを停止させる。
pg_ctl stop -m fast
または
pg_ctl stop -m f
強制停止2
全てのトランザクション、セッションを強制的に切断してデータベースを停止させる。強制停止させられたトランザクションは、時間の起動の際リカバリーとしてロールバックされる。
pg_ctl stop -m immediate
または
pg_ctl stop -m i
起動ステータスの確認
pg_ctl status

他のホストからの接続

# su - postgres
Attempting to create directory /var/lib/pgsql/perl5
-bash-4.2$ psql -c "alter user postgres with password 'password'"
ALTER ROLE
-bash-4.2$ exit
ログアウト
 pg_hba.confを編集します。
$ vi /usr/local/pgsql/data/pg_hba.conf
または
$ vi /var/lib/pgsql/data/pg_hba.conf
# "local" is for Unix domain socket connections only
local    all    all    trust ← 変更
# IPv4 local connections:
host    all    all    127.0.0.1/32    ident
host    all    all    192.168.100.0/24    trust ← 追加
# IPv6 local connections:
host    all    all    :1/128    trust ← 変更
◆以下は、例です。
# データベース名databaseへのすべての接続を許可
host    database    all    0.0.0.0/0    trust
# パスワード認証を行なう
host    all    all    0.0.0.0/0    password
# 192.168.0.10からの接続を許可
host    all    all    192.168.0.10/32    trust
 上記の変更でも他のホストから接続できない場合は、postgresql.confを変更します。
# vi /var/lib/pgsql/data/postgresql.conf
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
 ↓ 変更
listen_addresses = '*'          # what IP address(es) to listen on;
 編集が完了したらPostgreSQLを再起動します。
# service postgresql restart
 インストール及び初期設定が完了しましたので、●テストデータベース作成を参照して、テストデータベースを作成してください。

自動起動スクリプトの作成

 ルート権限で、/etc/rc.d/init.d/postgresqlというファイルを作成します。
# vi /etc/rc.d/init.d/postgresql
#!/bin/sh
#
# postgres - This script is used to start/stop 
#            the postgreSQL listener process.
#
# Usage
#
#   You can use this script manually, and/or you
#   can install this script into the runlevel system
#   by running "sh postgres.init.sh install"
#
# Credits
#
#   Thomas Lockhart 
#   modified from other startup files in the
#   RedHat Linux distribution
#
#   Clark Evans 
#   cleaned up, added comments, etc.
#
#   modified for PostgreSQL book written by Tatsuo Ishii
# 
# RedHat Stuff
#
#    chkconfig: 345 85 15
#    description: Starts and stops the PostgreSQL backend daemon\
#                 that handles all database requests.
#    processname: postmaster
#    pidfile: /var/run/postmaster.pid
# 
# Config Variables
#
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
PGACCOUNT="postgres" ← PostgreSQLのユーザを指定
#
#  The non-root user account which will be used to run the
#  PostgreSQL executeable.   For this script to work, the
#  shell for this account must be SH/BASH.
#
POSTGRES_HOME="/usr/local/pgsql"
PGDATA="/usr/local/pgsql/data"
POSTMASTER="/usr/local/pgsql/bin/postmaster"
PG_CTL="/usr/local/pgsql/bin/pg_ctl"
PGPORT="5432"
PGLOG="/usr/local/pgsql/pgstartup.log"
export PGPORT
#
#  The executable program which is to be run, in this case
#  it is the listener, which waits for requests on the port
#  specified during configuration.
# 
pidfile="/var/run/postmaster.pid"
pidfile_make="ps -ef | grep -v grep | grep $POSTGRES_HOME | awk '{print \$2}' > $pidfile"
 ↑ PostgreSQLのプロセスID保存用ファイル作成
pidfile_del="rm -f $pidfile" ← プロセスID保存用ファイル削除
#
# See how we were called.
#
case "$1" in
  start)
    # Start daemons.
    if [ -f /var/lock/subsys/postgresql ] ; then
      echo "PostgreSQL already started!"
      exit 1
    fi
    echo -n "Starting PostgreSQL: "
    su - $PGACCOUNT -c "$POSTMASTER -p $PGPORT -D $PGDATA &" >> $PGLOG 2>&1 < /dev/null
    daemon $pidfile_make ← この行がないと、[  OK  ]が表示されない
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/postgresql
    ;;
  stop)
    # Stop daemons.
    if [ ! -f /var/lock/subsys/postgresql ] ; then
      echo "PostgreSQL already stopped!"
      exit 1
    fi
    echo -n "Stopping PostgreSQL: "
    su - $PGACCOUNT -c "$PG_CTL stop -m f -D $PGDATA" > /dev/null 2>&1 < /dev/null 
    daemon $pidfile_del ← この行がないと、[  OK  ]が表示されない
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f /var/lock/subsys/postgresql
    ;;
  status)
      status postgresql
      exit $?
      ;;
  restart)
      $0 stop
      sleep 1 ← $pidfileに一つ前のプロセスIDが残ってしまうための対処
      $0 start
      ;;
  *)
    echo "Usage: $0 {start|stop|status|restart}"
    exit 1
esac
exit 0
 作成したpostgresqlのモードを変更します。
# chmod 755 postgresql
 chkconfigコマンドで、起動スクリプトを追加します。
# chkconfig --add postgresql 
 上記ファイルはここからダウンロードできます。

●初期設定

 インストール及びPostgreSQL用ユーザの作成が完了したら、PostgreSQLを初期化します。
# service postgresql initdb ← 初期化
or
# postgresql-setup initdb
 初期化が完了したら、サービスを起動します。
# service postgresql start
or
# systemctl start postgresql
 PostgreSQLを別のホストからも用する場合やFirewalldを有効にしている場合、PostgreSQLサービスへのアクセス許可が必要です。
# firewall-cmd --add-service=postgresql --permanent
success
# firewall-cmd --reload
success 
 psコマンドで確認します。動作していれば、下記のように表示されます。
# ps -ef | grep postmaster
 
/usr/bin/postmaster -p 5432 -D (postgresユーザのホームディレクトリ)/data
 補足:postgresユーザでpg_ctlを使用しての起動
  pg_ctl -o "-p 5432" -D /usr/local/pgsql/data -w start

  $ ps -ef | grep postgres
  /usr/bin/postgres -p 5432 -D (postgresユーザのホームディレクトリ)/data

 PostgreSQLがシステム起動時に、自動起動するようにします。
# chkconfig postgresql on ← PostgreSQL自動起動設定
# chkconfig --list postgresql ← PostgreSQL自動起動設定確認
postgresql     	0:off	1:off	2:on	3:on	4:on	5:on	6:off ← ランレベル2〜5のonを確認
or
# systemctl enable postgresql
◆PostgreSQLの設定ファイル

PostgreSQLの設定はpostgresql.confファイルとpg_hba.confファイルを使って行います。
 postgresql.conf:サーバの実行時のリソースなどを設定するファイル
 pg_hba.conf:クライアントからのアクセスコントロールを設定するファイル

◆サーバプロセスの起動と停止

 PostgreSQLのサーバプロセスを起動・停止するには、postgresユーザでpg_ctlコマンドを実行します。
$ pg_ctl -w start   // 起動処理終了後プロンプトに戻る
$ pg_ctl stop       // サーバプロセスの停止
 起動時の-wはwaitを表し、起動処理が終了した時点でコマンドプロンプトに戻すようにするオプションです。
 PostgreSQLのサーバプロセスを停止する際に、データベースに接続しているユーザがいる場合は、上記のコマンドでは停止できません。この場合は、-mオプションを使用して停止方法を指定します。
$ pg_ctl -m 停止方法 [s|f|i] stop
 停止方法には、s、f、i を引数として指定できます。それぞれ、smart、fast、immediateを表します。引数s(smart)は、新規の接続を拒否し、既存の接続が切断されるまで待ってから停止します。前述の-mオプションを指定しない場合はこの方法で停止処理が行われます。
 このほか、f(fast)は、既存の接続を強制的に切断してから停止し、i(immediate)は、適切な終了手順を踏まずにただちに停止します。

◆データベースに接続するには

 PostgreSQLには、専用のターミナルとしてpsqlが付属しています。psqlを利用すると手軽にデータベースへ接続し、SQLを実行することができます。
 psqlでデータベースに接続する最も単純なコマンドは次のとおりです。
$ psql データベース名 ユーザ名
 PostgreSQLは独自のユーザ管理機構を持っています。そのため、OSのユーザとPostgreSQLのユーザ間に直接的な関連はありません。
 ただし、一般的なPostgreSQLのコマンドは、データベースに接続するユーザの指定を省略した場合、そのコマンドを実行したOSのユーザの名前を使用して接続する仕組みになっています。上記のコマンドの場合もユーザ名を省略すると、postgresユーザでデータベースに接続します。

◆ユーザを作成するには

 いまのところ、PostgreSQLのユーザはスーパーユーザのpostgresしか存在していないので、一般ユーザを作成します。
 例えば、user1という名前の一般ユーザを作成するには、postgresユーザでcreateuserコマンドを実行します。このとき、PostgreSQLは起動している必要があります。
$ createuser user1
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
 createuserコマンド実行時の質問は、それぞれ以下のことを確認しています。
  * 新しいロールをスーパーユーザとするか
  * 新しいロールに対してデータベース作成を許可するか
  * 新しいロールに対してロール作成を許可するか

 ここでの「ロール」とは、ユーザとグループの両方を含む概念です。

◆psqlでデータベースに接続には

 PostgreSQLでは、initdbコマンドでデータベースクラスタを初期化した時点で、template0template1postgresという3つのデータベースが自動的に作成されます。
 template0とtemplate1データベースはユーザがデータベースを作る際にひな型として使用されるデータベースです。
 また、postgresデータベースはPostgreSQL 8.1以降に用意されているデータベースで、主にPostgreSQLのコマンドによって使用されます。どれも必要なデータベースなので削除してはいけません。なお、template1とpostgresデータベースには接続することができます。
 例えば、user1ユーザでpostgresデータベースに接続する場合、psqlコマンドで次のように接続します。
$ psql postgres user1
Welcome to psql 8.3.1, the PostgreSQL interactive terminal.
  Type:  \copyright for distribution terms
         \h for help with SQL commands
         \? for help with psql commands
         \g or terminate with semicolon to execute query
         \q to quit
postgres=>  //一般ユーザの場合のプロンプト表示
 一般ユーザでデータベースに接続した場合、プロンプトは 「=>」になり、スーパーユーザの場合は「=#」になります。

●テストデータベース作成

 postgresでログインします。以下のコマンドを実行して,データベースtestdbとテーブルtesttableを作成します。
# su - postgres
$ createdb testdb ← データベースtestdbの作成
$ psql -l ← 作成されたデータベースの確認
        List of databases
   Name    |  Owner   | Encoding 
-----------+----------+----------
 postgres  | postgres | UTF8
 template0 | postgres | UTF8
 template1 | postgres | UTF8
 testdb    | postgres | UTF8 ← データベースが作成されている
(4 rows)
$ psql testdb ← データベースtestdbに接続
Welcome to psql 8.3.5, the PostgreSQL interactive terminal.
Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit
testdb=# create table testtable (name varchar(30), age varchar(3)); ← テーブルtesttableの作成
CREATE TABLE
testdb=# \d ← テーブルtesttableが作成されているかどうかの確認
         List of relations
 Schema |   Name    | Type  |  Owner   
--------+-----------+-------+----------
 public | testtable | table | postgres
(1 row)
testdb=# insert into testtable values ('山田太郎', '18'); ← テーブルにデータの挿入
INSERT 0 1
testdb=# insert into testtable values ('福田一郎', '25'); ← テーブルにデータの挿入
INSERT 0 1
testdb=# select * from testtable; ← 挿入されたデータの確認
   name   | age 
----------+-----
 山田太郎 | 18
 福田一郎 | 25
(2 rows)
testdb=# \d testtable ← テーブルのカラム定義の確認
           table "public.testtable"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 name   | character varying(30) | 
 age    | character varying(3)  | 
testdb=# \q ← \qを入力して、データベースから切断

●apacheとの連携

 以下のコマンドを実行して,ユーザapacheを作成し,データベースtestdbのテーブルtesttableに対する参照のみのアクセス権を,ユーザapache(パスワード:test)に設定します。
$ psql testdb
testdb=# create user apache with password 'test'; ← ユーザapache(パスワード:test)の作成
CREATE ROLE
testdb=# select usename from pg_user; ← ユーザの一覧表示
 usename  
----------
 postgres
 apache ← ユーザapacheが作成されている
(2 rows)
testdb=# grant select on testtable to apache; ← ユーザapacheに参照のみのアクセス権を設定
GRANT
testdb=# \z ← 存在するオブジェクトに対し与えられた権限の表示
                  Access privileges for database "testdb"
 Schema |   Name    | Type  |              Access privileges               
--------+-----------+-------+----------------------------------------------
 public | testtable | table | {postgres=arwdxt/postgres,apache=r/postgres}
(1 row)
testdb=# \q ← \qを入力して、データベースから切断
$ exit ← postgresからログアウト
logput

php-pgsqlのインストールと利用

 PHPとPostgreSQLの連携を可能にするため,以下のコマンドを実行して, php-pgsqlをインストールします。
# yum -y install php-pgsql
 Apacheを再起動します。
# service httpd restart
または
# service apache restart
 /var/www/html/test_postgresql.phpを以下のように作成します。
# vi /var/www/html/test_postgresql.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>DB接続テスト</title>
</head>
<body>
<h2>名簿</h2>
<p>
<?php
// 初期設定
$dbname = "testdb";
$username = "apache";
$password = "test";
$sql = "select * from testtable";
// データベースに接続
$con = pg_connect("dbname=$dbname user=$username password=$password");
if (!$con) {
    die("データベースに接続できませんでした");
}
// クエリの実行
$rs = pg_query($con, $sql);
// 結果セットの行数を取得
$maxrows = pg_num_rows($rs);
for ($i = 0; $i < $maxrows; $i++) {
	$row = pg_fetch_row($rs, $i);
	echo("$row[0] | $row[1]<br>\n");
}
// データベースの接続終了
pg_close($con);
?>
</p>
</body>
</html>
 http://(Webサーバ名)/test_postgresql.phpにアクセスすることにより、DBへの接続状況を確認することができます。

 接続できない場合は、「他のホストからの接続」を参照してください。

後始末

 作成したユーザやデータベース等を削除します。
testdb=# revoke select on testtable from apache; ← ユーザapacheから参照のみのアクセス権を解除
testdb=# revoke all on testtable from apache; ← ユーザapacheからすべてのアクセス権を解除
 ← どちらかの方法でアクセス権を解除
testdb=# drop user apache; ← ユーザapacheの削除
DROP ROLE
testdb=# drop table testtable; ← テーブルtesttableの削除
DROP table
testdb=# \q ← データベースから切断
$ dropdb testdb ← データベースtestdbの削除
$ psql -l ← データベースtestdbが削除されたかの確認
        List of databases
   Name    |  Owner   | Encoding 
-----------+----------+----------
 postgres  | postgres | UTF8
 template0 | postgres | UTF8
 template1 | postgres | UTF8
(3 rows)

●PerlとPostgreSQLの連携

 Perlから、PostgreSQLにアクセスするには大きく分けて二つのやり方があります。
  1. Pg.pm を使う方法(速度重視)
  2. DBI + DBD を使う方法(他DBとの互換性重視)
 1. は、PostgreSQLに付属してくる、Perl用の接続インタフェースです。
 Pg.pmを使用する場合は、既にバンドルされているPg.pmは利用できませんので、http://search.cpan.org/search%3fmodule=Pgから「pgsql_perl5-1.9.0http://www.postgresql.org/ftp/projects/gborg/pgperl/stable/から「Pg-2.1.1.tar.gz」をダウンロードします。
 CPANからモジュールダウンロードに関する環境設定はPerlの設定を参照してください。
$ cd /usr/local/src
$ wget http://search.cpan.org/CPAN/authors/id/M/ME/MERGL/pgsql_perl5-1.9.0.tar.gz
$ tar zxvf pgsql_perl5-1.9.0.tar.gz
$ cd pgsql_perl5-1.9.0
$ wget http://ftp.postgresql.org/pub/projects/gborg/pgperl/stable/Pg-2.1.1.tar.gz
$ tar zxvf Pg-2.1.1.tar.gz
$ cd Pg-2.1.1
$ perl Makefile.PL
 この時、「Please set environment variables POSTGRES_INCLUDE and POSTGRES_LIB」と表示された場合は、下記のとおり対処してください。

・PostgreSQLをソースからインストールした場合(tar.gz)
$ vi (postgresユーザのホームディレクトリ)/.bash_profile
export POSTGRES_HOME=/usr/local/pgsql
export PATH=$PATH:$POSTGRES_HOME/bin
export PGLIB=$POSTGRES_HOME/lib
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export PGDATA=$POSTGRES_HOME/data
$ source (postgresユーザのホームディレクトリ)/.bash_profile
としてください。上記設定を、全ユーザに反映させたい場合は「/etc/profile」を編集し、設定を反映させます。

・PostgreSQLをバイナリからインストールした場合(rpm)

 バイナリからインストールした場合、「.bash_profile」を設定しなくても環境変数として設定済みの場合があります。その場合は、「.bash_profile」を編集する必要はありません。
 Pg.pmのrpmがあれば下記の設定は必要ないのかも・・。
$ vi (postgresユーザのホームディレクトリ)/.bash_profile
export POSTGRES_HOME=(postgresユーザのホームディレクトリ)
export PATH=$PATH:/usr/local/pgsql/bin
export PGLIB=$POSTGRES_HOME/lib
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export PGDATA=$POSTGRES_HOME/data
export POSTGRES_INCLUDE=/usr/include/pgsql
export POSTGRES_LIB=(postgresユーザのホームディレクトリ)
$ source (postgresユーザのホームディレクトリ)/.bash_profile
または、
# export POSTGRES_INCLUDE=/usr/include/pgsql
# export POSTGRES_LIB=/var/lib/pgsql
としてください。上記設定を、全ユーザに反映させたい場合は「/etc/profile」を編集し、設定を反映させます。
 正常終了時は下記のように表示されます。
Configuring Pg
Remember to actually read the README file !
OS: linux
Checking if your kit is complete...
Looks good
Writing Makefile for Pg
Configuring Pg
Remember to actually read the README file !
OS: linux
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for Pg
Writing MYMETA.yml and MYMETA.json
 その後、下記の作業を続行します。
$ make
cp Pg.pm blib/lib/Pg.pm AutoSplitting blib/lib/Pg.pm (blib/lib/auto/Pg) Running Mkbootstrap for Pg () chmod 644 Pg.bs /usr/bin/perl /usr/share/perl5/vendor_perl/ExtUtils/xsubpp -typemap /usr/share/perl5/ExtUtils/typemap -typemap typemap Pg.xs > Pg.xsc && mv Pg.xsc Pg.c gcc -c -I/usr/include/pgsql -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g -pipe -Wall -Wp,\ -D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables \ -DVERSION=\"2.1.1\" -DXS_VERSION=\"2.1.1\" -fPIC "-I/usr/lib/perl5/CORE" Pg.c In file included from Pg.xs:12:0: ppport.h:43:38: 警告: コメント内に "/*" があります [-Wcomment] perl -x ppport.h *.c *.h *.xs foo/*.c [etc] ^ Pg.xs: 関数 ‘constant’ 内: Pg.xs:72:1: 警告: ラベル ‘not_there’ が定義されていますが使用されていません [-Wunused-label] not_there: ^ Pg.xs: 関数 ‘XS_Pg_conndefaults’ 内: Pg.xs:159:3: 警告: 真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします [-Wparentheses] if (infoOptions = PQconndefaults()) { ^ rm -f blib/arch/auto/Pg/Pg.so LD_RUN_PATH="/lib" gcc -shared -O2 -g -pipe -Wall -Wp,\ -D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m32 \ -march=i686 -mtune=atom -fasynchronous-unwind-tables -Wl,\ -z,relro -L/usr/local/lib Pg.o -o blib/arch/auto/Pg/Pg.so \ -L/var/lib/pgsql -lpq \ chmod 755 blib/arch/auto/Pg/Pg.so /usr/bin/perl -MExtUtils::Command::MM -e 'cp_nonempty' -- Pg.bs blib/arch/auto/Pg/Pg.bs 644 Manifying blib/man3/Pg.3pm
$ su # export PGDATABASE=test # export PGUSER=postgres # make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-Iblib/lib" "-Iblib/arch" test.pl Pg::conndefaults ........ ok Pg::connectdb ........... ok $conn->exec ............. ok $conn->errorMessage ..... not ok: FATAL: データベース"rumpumpel"は存在しません make: *** [test_dynamic] エラー 255
# PGDATABASE=test; export PGDATABASE # PGUSER=postgres; export PGUSER # createdb -U postgres rumpumpel # make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-Iblib/lib" "-Iblib/arch" test.pl Pg::conndefaults ........ ok Pg::connectdb ........... ok $conn->exec ............. ok $conn->errorMessage ..... not ok: at test.pl line 117. make: *** [test_dynamic] エラー 255
エラーと表示されますが、このままインストールします。 # make install
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree Installing /usr/local/lib/perl5/auto/Pg/Pg.so Installing /usr/local/lib/perl5/Pg.pm Installing /usr/local/lib/perl5/auto/Pg/autosplit.ix Installing /usr/local/share/man/man3/Pg.3pm Appending installation info to /usr/lib/perl5/perllocal.pod
# perl -e "use Pg;" 何も表示されなければ、インストール成功です。
 上記により、Pg.pmが「/usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi/usr/local/lib/perl5」にインストールされます。
 実際の状況は、下記のとおりです。
# make install
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/auto/Pg/Pg.so
Appending installation info to /usr/lib/perl5/5.10.0/i386-linux-thread-multi/perllocal.pod

 「libpq-fe.h」がありませんと出力された場合、「postgresql-devel」をインストールすると出力されなくなります。再度、makeしたところ「Pg.xs(XS_PG_…)」関係で警告等が出力されましたが、そのまま「make install」したらインストールできました。


 2. は、DBD と呼ばれるモジュールと、DBIと呼ばれるモジュールを組み合わせて使う方法です。DBDは、Oracleなど、各種データベース用のものが配布されており、DBIは各DBDに共通で使えます。階層的にあらわすと、「DBMS(PostgreSQL等) ⇔ DBD ⇔ DBI ⇔ Perl プログラム」というようになっており、つまり、DBMSとDBIの間をとりもち、DBMS毎の差異を吸収するのがDBDということになります。 これを用いることにより、DBMSが例えばOracleからPostgreSQLに変わっても、理論的にはプログラムの修正が不要(SQLレベルの変換は当然行われませんので、DBMS依存のSQLが含まれている場合は修正が必要です)となります。
 CPANからモジュールダウンロードに関する環境設定はPerlの設定を参照してください。
 PostgreSQLを利用しますので、CPANからDBIとDBD::Pgをダウンロードし、インストールします。
・cpanコマンドを使用する場合
# cpan DBI
  /usr/bin/make install  -- OK
# cpan DBD::Pg
  /usr/bin/make install  -- OK
・ソースからインストールする場合
$ cd /usr/local/src
$ wget http://cpan.perl.org/modules/by-module/DBI/DBI-1.608.tar.gz
$ tar zxvf DBI-1.608.tar.gz
$ cd DBI-1.608
$ perl Makefile.PL
$ make
$ su
# make install
$ cd /usr/local/src
$ wget http://search.cpan.org/CPAN/authors/id/T/TU/TURNSTEP/DBD-Pg-2.13.1.tar.gz
$ tar zxvf DBD-Pg-2.13.1.tar.gz
$ cd DBD-Pg-2.13.1
$ perl Makefile.PL
$ make
$ su
# make install
 実際の状況は、下記のとおりです。
・DBI-1.608
# make install
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/DBI.pm
Appending installation info to /usr/lib/perl5/5.10.0/i386-linux-thread-multi/perllocal.pod
・DBD-Pg
# make install
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/auto/DBD/Pg/Pg.so
Appending installation info to /usr/lib/perl5/5.10.0/i386-linux-thread-multi/perllocal.pod

サンプルデータベースの作成

 今回は、氏名と電話番号および電子メールアドレスを管理する簡易アドレス帳のサンプルデータベースを作成します。
 まず、PostgreSQLのプロンプトでcreate table文を発行して、テーブルを定義します。
# su - postgres
$ createdb addressdb ← データベース「addressdb」の作成
$ psql -l ← 作成したデータベースの確認
        List of databases
   Name    |  Owner   | Encoding 
-----------+----------+----------
 addressdb | postgres | UTF8 ← データベースが作成されている
 postgres  | postgres | UTF8
 template0 | postgres | UTF8
 template1 | postgres | UTF8
$ psql addressdb ← データベース「addressdb」に接続
addressdb=# create table addrbook (name varchar(50), telno varchar(50), email varchar(50));
 ↑ テーブル「addressdb」に接続
CREATE TABLE
addressdb=# \d ← テーブルtesttableが作成されているかどうかの確認
         List of relations
 Schema |   Name   | Type  |  Owner   
--------+----------+-------+----------
 public | addrbook | table | postgres
(1 row)
addressdb=# \q ← psqlモードから抜ける
 以下の内容のテキストファイルを(postgreユーザ権限で)用意し、addrbook.txtというファイル名で保存します。セパレータの部分はTABにしてください
# su - postgres
# vi addrbook.txt
R.Nomura	090-2298-****	nomura.r@mail.com
D.Tanaka	080-****-****	dtanaka@post.co.jp
I.Yanagida	090-1987-****	ichi.yanagida@elect.net
 このファイルをcopyコマンドを使ってインポートします。
$ psql addressdb
addressdb=# \copy addrbook from addrbook.txt
 コピーされた内容を確認します。
addressdb=# select * from addrbook;
    name    |     telno     |          email
------------+---------------+-------------------------
 R.Nomura   | 090-2298-**** | nomura.r@mail.com
 D.Tanaka   | 080-****-**** | dtanaka@post.co.jp
 I.Yanagida | 090-1987-**** | ichi.yanagida@elect.net
(3 rows)
 以上でサンプルデータベースの用意ができました。

Perlのプログラム(表示用) Pg.pm版

 PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
$ vi test1_pgsql.pl ← test1_pgsql.plの編集
#!/usr/bin/perl ← 環境に合わせる
use Pg;
$dbname = "addressdb";
$username = "postgres";
$tblname = "addrbook";
$sql = "select * from $tblname";
$conn = Pg::connectdb("dbname=$dbname user=$username");
#接続確認
if ($conn->status != PGRES_CONNECTION_OK) {
  print "データベースへの接続に失敗しました。\n";
# exit;
}
$res = $conn-> exec($sql);
#コマンド実行確認
if ($res->resultStatus != PGRES_COMMAND_OK) {
  print "SQLコマンドの実行に失敗しました。\n";
# exit;
}
print "name telno email\n";
print "--------------------------------------\n";
while(@item = $res-> fetchrow) {
  print "@item[0] @item[1] @item[2]";
  print ("\n");
}
$ chmod +x test1_pgsql.pl ← test1_pgsql.plに実行権限の設定
 1行目はPerlの実行ファイルの絶対パスを指定します。whichなどのコマンドで調べて、各自の環境に合わせてください。5行目がデータベース名の指定、6行目がユーザ名の指定、7行目がテーブル名の指定、8行目がSQL文の指定で、11行目がデータベースに対して実際にSQL文を発行する部分です。
 13〜18行目までが表示を行う部分になります。まず15〜18行目でループを行い、1行ずつfetchを行ってレコードを取得し、printで出力します。

Perlのプログラム(追加用) Pg.pm版

 次に(コマンドベースで)レコード追加を行うサンプルプログラムtest2_pgsql.plについて説明します。
$ vi test2_pgsql.pl ← test2_pgsql.plの編集
#!/usr/bin/perl ← 環境に合わせる
use Pg;
$dbname = "addressdb";
$username = "postgres";
$tblname = "addrbook";
$sql = "insert into $tblname values('H.Takayanagi','070-1234-4321','H-Taka\@email.com')";
$conn = Pg::connectdb("dbname=$dbname user=$username");
#接続確認
if ($conn->status != PGRES_CONNECTION_OK) {
  print "データベースへの接続に失敗しました。\n";
# exit;
}
$res = $conn-> exec($sql);
#コマンド実行確認
if ($res->resultStatus != PGRES_COMMAND_OK) {
  print "SQLコマンドの実行に失敗しました。\n";
# exit;
}
if ( $res -> resultStatus == PGRES_COMMAND_OK ) {
  print "データベースに追加されました。\n\n"
}
else {
  print "データベースの追加に失敗しました。\n\n"
}
#以下表示用
$sql2 = "select * from $tblname";
$res2 = $conn-> exec($sql2);
print "name telno email\n";
print "--------------------------------------\n";
while(@item = $res2-> fetchrow) {
  print "@item[0] @item[1] @item[2]";
  print ("\n");
}
$ chmod +x test2_pgsql.pl ← test2_pgsql.plに実行権限の設定
 5行目まではtest1_pgsql.plと同じですが、6行目のSQL文の発行部分が異なる点に注目してください。また、“@”を入力するような場合は、“\”を使ってエスケープすることに注意してください(実際のデータに“\”は登録されません)。
 13〜18行目はエラー処理を記述しています。処理がうまく実行できなかった場合は、resultStatusに“PGRES_COMMAND_OK”以外のステータスを戻してきます。
 test2_pgsql.plを実行してから表示用のプログラムtest1_pgsql.plを実行すると、レコードの追加が行われているのが分かります

Perlのプログラム(表示用) DBI + DBD版

 PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
$ vi test3_pgsql.pl ← test3_pgsql.plの編集
#!/usr/bin/perl ← 環境に合わせる
use DBI;
$dbname = "addressdb";
$username = "postgres";
$tblname = "addrbook";
$sql = "select * from $tblname";
$conn = DBI->connect("DBI:Pg:dbname=$dbname", $username);
$res = $conn->prepare($sql);
$st = $res->execute();
print "name telno email\n";
print "--------------------------------------\n";
while(@item = $res->fetchrow_array()) {
  print "@item[0] @item[1] @item[2]";
  print ("\n");
}
$res->finish;
$conn->disconnect;
$ chmod +x test3_pgsql.pl ← test3_pgsql.plに実行権限の設定
 10行目の詳細な記載方法は下記のとおりです。
$conn = DBI->connect("DBI:Pg:dbname=$dbname host=$host port=$port", "$user", "$pass");
 SQL文を用意し(大文字・小文字の区別はない)、「prepare()」でセットして、「execute()」で実行します。取得したデータは「fetchrow_array()」で1行ずつ取得します。戻り値に指定した配列に1行文のデータが格納されているので、取得できなくなるまでループさせます。データが1行しかないと分かっている場合は、ループさせる必要はない。

Perlのプログラム(追記用) DBI + DBD版

 PerlでPostgreSQLに作成したデータベーステーブルに(コマンドベースで)追記を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容に追記する簡単なプログラムのリストです。
$ vi test4_pgsql.pl ← test4_pgsql.plの編集
#!/usr/bin/perl ← 環境に合わせる
use DBI;
$dbname = "addressdb";
$username = "postgres";
$tblname = "addrbook";
$sql = "insert into $tblname values('S.Shirakawa','090-0000-6542','Shibakawa\@mailserver.net')";
$conn = DBI->connect("DBI:Pg:dbname=$dbname", $username);
$res = $conn->prepare($sql);
$st = $res->execute();
#以下、表示用
$sql2 = "select * from $tblname";
$res2 = $conn->prepare($sql2);
$st = $res2->execute();
print "name telno email\n";
print "--------------------------------------\n";
while(@item = $res2->fetchrow_array()) {
  print "@item[0] @item[1] @item[2]";
  print ("\n");
}
$res->finish;
$conn->disconnect;
$ chmod +x test4_pgsql.pl ← test4_pgsql.plに実行権限の設定

●RubyとPostgreSQLの連携

 RubyとPostgreSQLを接続するためには,
 1. ruby-pg
 2. Ruby/DBI
 3. rubygem-pg(Fedora 20等)
のいずれかをインストールする必要があります。

 1.を使用するには、「yum」コマンドを利用して「ruby-postgres」をインストールする方法及びRubyのアプリケーションやライブラリhttps://bitbucket.org/ged/ruby-pg/downloadsから「ruby-postgres-0.7.9.2008.01.28.tar.gz」をダウンロードし、インストールする方法があります。

・yumコマンドを利用する場合
# yum -y install ruby-postgres
・ソースからインストールする場合
# cd /usr/local/src
# tar zxvf ruby-postgres-0.7.9.2008.01.28.tar.gz
# cd ruby-postgres
# ruby extconf.rb
 この時「ruby: No such file or directory -- extconf.rb (LoadError)」と表示された場合は
# ruby ext/extconf.rb
を実行してください。さらに、「mkmf.rb can't find header files for ruby at /usr/lib/ruby/ruby.h」と表示された場合は、ruby-develをインストールしてください。
# yum -y install ruby-devel
 PostgreSQLのインクルードファイル、ライブラリファイルのインストール場所をコンパイラが見付けることができない場合には以下を指定してください。
--with-pgsql-include-dir=<include file directory>
--with-pgsql-lib-dir=<library directory>
 例えばこんな感じです
$ ruby ext/extconf.rb --with-pgsql-include-dir=/usr/local/pgsql/include --with-pgsql-lib-dir=/usr/local/pgsql/lib
 問題なければ下記のように表示されます。
# ruby ext/extconf.rb
checking for main() in -lpq... yes
checking for libpq-fe.h... yes
checking for libpq/libpq-fs.h... yes
checking for PQsetClientEncoding()... yes
checking for pg_encoding_to_char()... yes
checking for PQfreemem()... yes
checking for PQserverVersion()... yes
checking for PQescapeString()... yes
checking for PQexecParams()... yes
creating Makefile
 そして
# make
# make install
すれば完了です。

 2.を使用するには、RubyForgeプロジェクトのRuby/DBIからダウンロードし、インストールします。Ruby DBIモジュールを使うが参考になります。
 Ruby DBIモジュールのRPM版は無いようです・・。

$ cd /usr/local/src
$ wget http://rubyforge.org/frs/download.php/47537/dbi-0.4.1.tar.gz
$ tar zxvf dbi-0.4.1.tar.gz
$ cd dbi-0.4.1
$ ruby setup.rb config
$ ruby setup.rb setup
$ su
# ruby setup.rb install
 上記の方法でDBIをインストールしてみましたが、「ruby setup.rb config」で「--with=dbi,dbd_pg」というオプションを指定することができず、うまく動作しませんでした。そこで、インターネット上で見つけた方法で、DBI等をインストールすることにしました。
postgres-0.7.9_extconf.rb.patch結論からすると、このパッチは必要ありません
postgres-0.7.9_postgres.c.patch結論からすると、このパッチは必要ありません
dbi-0.1.1_sql.rb.patch

$ cd /usr/local/src
$ tar zxvf ruby-postgres-0.7.9.2008.01.28.tar.gz
$ cd ruby-postgres/ext
$ patch extconf.rb < /usr/local/src/postgres-0.7.9_extconf.rb.patch ← 結論からすると、作業不必要
$ patch postgres.c < /usr/local/src/postgres-0.7.9_postgres.c.patch ← 結論からすると、作業不必要
$ ruby extconf.rb
$ make
 makeすると「postgres.c:16:21: error ruby/io.h そのようなファイルやディレクトリはありません」と言うエラーが表示されましたので、rubyに関係するio.hを調べてみました。
/usr/local/src/ruby-1.8.7-p160/wince/io.hにありましたので、postgres.cを下記のとおり編集します。

$ vi postgres.c
#include "ruby/io.h" ← 編集前
#include "/usr/local/src/ruby-1.8.7-p160/wince/io.h" ← 編集後
 makeしましたが、「・・・conflicting・・・」云々かんぬんとエラーが表示されましたので、「extconf.rb」及び「postgres.c」に対するパッチの摘要をやめ、通常の方法でインストールしました。

$ ruby extconf.rb
$ make
$ su
# make install
 DBI(dbi-0.1.1.tar.gz)を、パッチを当てて普通にインストールします。このDBIはバージョン0.4.1より古いですが、DBD:Pgが同梱されています。
$ cd /usr/local/src
$ wget http://rubyforge.org/frs/download.php/12368/dbi-0.1.1.tar.gz
$ tar zxf dbi-0.1.1.tar.gz
$ cd ruby-dbi
$ patch lib/dbi/sql.rb < /usr/local/src/dbi-0.1.1_sql.rb.patch
 ↑ patchを適用しなくても動作する
($ ruby setup.rb config)
 ↑ このように実行した場合、DBI関連のドライバのみがインストール対象となります。
   DBDドライバを追加インストールしたい場合、--with オプションにドライバの名前を列挙します。
   例えば、DBIのメイン部分とPostgreSQLのDBDレベルのドライバをインストールするときは、次のようにします。
$ ruby setup.rb config --with=dbi,dbd_pg
$ ruby setup.rb setup
$ su
# ruby setup.rb install
 実際の状況は下記のようになります。
$ ruby setup.rb config --with=dbi,dbd_pg
entering config phase...
config done.
$ ruby setup.rb setup
entering setup phase...
setting #! line to "#!/usr/bin/ruby"
setup.rb: skip bin/proxyserver(dbd_proxy) by user option
setup.rb: skip ext/dbd_sqlite(dbd_sqlite) by user option
setup.rb: skip ext/dbd_sybase(dbd_sybase) by user option
setup done.
$ su
# ruby setup.rb install
entering install phase...
mkdir -p /usr/local/bin
install sqlsh.rb /usr/local/bin
setup.rb: skip bin/proxyserver(dbd_proxy) by user option
mkdir -p /usr/local/lib/ruby/site_ruby/1.8/DBD/Pg
install Pg.rb /usr/local/lib/ruby/site_ruby/1.8/DBD/Pg/Pg.rb
mkdir -p /usr/local/lib/ruby/site_ruby/1.8/dbi
install row.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install version.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install utils.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install sql.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install trace.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install columninfo.rb /usr/local/lib/ruby/site_ruby/1.8/dbi
install dbi.rb /usr/local/lib/ruby/site_ruby/1.8
setup.rb: skip ext/dbd_sqlite(dbd_sqlite) by user option
setup.rb: skip ext/dbd_sybase(dbd_sybase) by user option
install done.

 2014年10月現時点で、新しいOS(Fedora 20等)ではrubygem-pgを使用します。
# yum install rubygem-pg
 rubygem-pgを使用する場合、スクリプトを一部変更する必要があります。
require "postgres"
 ↓
require "rubygems"
require "pg"
 変更後、実行すればrubyを使用してPostgreSQLに接続できるようになります。

サンプルデータベースの作成

 データベースは、PerlとPostgreSQLとの連携で作成したものを使用します。

Rubyのプログラム(表示用) Pg版

 RubyでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
$ vi test1_pgsql.rb
#!/usr/bin/ruby ← 環境に合わせる
require "postgres"
$hostname = "localhost"
$port = 5432
$dbname = "addressdb";
$username = "postgres";
$sql = "select * from addrbook;"
$encode = "UTF-8"
conn = PGconn.connect($hostname, $port, "", "", $dbname, $username) ← 注意
conn.set_client_encoding($encode)
#conn.query($sql).each do |row|
#  puts "#{row[0]} #{row[1]} #{row[2]}"
#end
#データ表示は、下記の書き方がスマート
res = conn.exec($sql)
rows = res.num_tuples
cols = res.num_fields
for i in 0..rows-1 do
  for j in 0..cols-1 do
    print res.getvalue(i,j)," "
  end
  print "\n"
end
conn.close
注意
conn = PGconn.connect("localhost", 5432, "", "", "addressdb", "postgres")
のように記載した場合、RubyはPerlと異なり、接続の際(上記「conn」の行)の「"localhost", 5432, "", "",」は省略できません。また、数字である「5432」を「"5432"」としてもいけません。どちらの場合もエラーが表示され、PostgreSQLに接続できません。

 上記プログラムを実行すると、下記のような警告が表示される事があります(Ruby1.8.6で表示され、Ruby1.8.7では表示されませんでした)。
・・・warning: parenthesize arugument(s) for future version
 この場合は、「puts row.join ", "」を「puts row.join(", ")」に変更してください。

 Perlからデータベースに接続できるのに、Rubyから接続すると下記のようなエラーが表示される場合があります
・・・:in `connect': FATAL:  Ident authentication failed for user "postgres" (PGError)
 pg_logを見ると
FATAL:  Ident authentication failed for user "postgres"
LOG:  could not connect to Ident server at address "::1", port 113: 接続が拒否されました
と記録されていました。これは、pg_hba.confを下記のように変更すると接続できるようになります。
# vi (postgresユーザのホームディレクトリ)/data/pg_hba.conf
# IPv6 local connections:
host    all         all         ::1/128               ident sameuser
 ↓ 変更
host    all         all         ::1/128               trust
# service postgresql restart 設定変更反映のため再起動

Rubyのプログラム(追加用) Pg版

 (コマンドベースで)データを追加するプログラムを紹介します。
$ vi test2_pgsql.rb
#!/usr/bin/ruby ← 環境に合わせる
require "postgres"
$hostname = "localhost"
$port = 5432
$dbname = "addressdb";
$username = "postgres";
$tblname = "addrbook"
$sql = "select * from " + $tblname + ";" ← 注意
$encode = "UTF-8"
# 表示メソッド
def view(conn)
  res = conn.exec($sql)
  rows = res.num_tuples
  cols = res.num_fields
    for i in 0..rows-1 do
      for j in 0..cols-1 do
        print res.getvalue(i,j)," "
      end
      print "\n"
    end
end
conn = PGconn.connect($hostname, $port, "", "", $dbname, $username)
conn.set_client_encoding($encode)
begin
  # データの挿入
  conn.exec("insert into " + $tblname + " (name,telno,email) values ('user1','user1','pass');")
  view(conn)
  # データの更新
  # conn.exec("update " + $tblname + " set email = 'user1@mail1.dot.com' where name = 'user1';")
  # view(conn)
  # データの削除
  # conn.exec("delete from " + $tblname + " where name = 'user1';")
  # view(conn)
rescue => ex
  conn.exec("ROLLBACK;")
  print ex.message, "\n"
ensure
  conn.close()
end
注意
 SQL文の記載方法は、
$sql = "select * from $tblname;"
ではなく
$sql = "select * from " + $tblname + ";"
のようにしなければエラーが表示されます。

Rubyのプログラム(表示用) DBI + DBD版

 PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
$ vi test3_pgsql.rb
#!/usr/bin/ruby ← 環境に合わせる
require "dbi"
$hostname = "localhost"
$port = 5432
$dbname = "addressdb";
$username = "postgres";
$password = "";
$tblname = "addrbook"
$sql = "select * from " + $tblname + ";" ← 注意
$encode = "UTF-8"
dbh = DBI.connect("dbi:pg:" + $dbname + ":" + $hostname, $username, $password)
sth = dbh.prepare($sql)
sth.execute
sth.each do |row|
  puts row.join ", "
end
#while row=sth.fetch do
#  p row
#end
sth.finish
dbh.disconnect

Rubyのプログラム(追加用) DBI + DBD版

 PerlでPostgreSQLに作成したデータベーステーブルの(コマンドベースで)表示を行うプログラムを作成してみます。以下は、先ほど作成したテーブルの内容を表示する簡単なプログラムのリストです。
$ vi test4_pgsql.rb
#!/usr/bin/ruby ← 環境に合わせる
require "dbi"
$hostname = "localhost"
$port = 5432
$dbname = "addressdb";
$username = "postgres";
$password = "";
$tblname = "addrbook"
$sql = "select * from " + $tblname + ";" ← 注意
$encode = "UTF-8"
dbh = DBI.connect("dbi:pg:" + $dbname + ":" + $hostname, $username, $password)
sth = dbh.prepare($sql)
sth.execute
begin
  # データの挿入
  dbh.do("insert into " + $tblname + " (name,telno,email) values ('user1','user1','pass');")
  # データの更新
  # dbh.do("update " + $tblname + " set email = 'user1@mail1.dot.com' where name = 'user1';")
  # データの削除
  # dbh.do("delete from " + $tblname + " where name = 'user1';")
  sth.each do |row|
    puts row.join ", "
  end
rescue
  puts "transaction failed"
  dbh.rollback
ensure
  sth.finish
  dbh.disconnect
end

●データベースの作成

【PostgreSQL基本設定値】
設定項目 設定値
データベース名 auth
ユーザID myuser
パスワード mypass
テーブル名 city

【cityテーブルスキーマ】
カラム名 データ型
country varchar(20)
capital varchar(20)

【cityテーブル挿入データ】
country capital
Japan Tokyo
USA NewYork


 上記データベースを作成します。
# su - postgres
 補足:PostgreSQLサーバから切断方法
  「\q」、「Control-D」のいずれかを入力します。
 補足:接続に関する情報を知りたい
  バージョンを知るには
   $ psql( データベース名)
   postgres(または、データベース名)=# select version();
$ createdb auth ← データベース「auth」の作成
 補足:データベースの所有者をpostgres以外で作成する方法
 # su - postgres
 $ createdb -U postgres -O user_dev01 -E UTF8 database_dev01
  ↑ 接続に使用するユーザ名「postgres」、データベースの所有者「user_dev01」、
    データベースの文字コード「UTF8」でデータベース「database_dev01」を作成
 結果は
                  List of databases
            Name   |    Owner    | Encoding 
  -----------------+-------------+----------
   database_dev01  | user_dev01  | UTF8
 補足:postgres以外のデータベース所有者でテーブルを作成する方法
 # su - postgres
 $ psql -U user_dev01 database_dev01
 この時、「psql FATAL: Ident authentication failed for user "********"」
 と表示される場合は、「pg_hba.conf」ファイルを編集(下記参照)してください。
 database_dev01=> CREATE TABLE table_sample1(id int4);
 database_dev01=> INSERT INTO table_sample1 (id)values(1);
 database_dev01=> \d
                List of relations
   Schema |     Name      | Type  |   Owner    
  --------+---------------+-------+------------
   public | table_sample1 | table | user_dev01
  (1 row)
  database_dev01=> select * from table_sample1;
   id 
  ----
    1
  (1 row)
 補足:データベースの削除方法
  $ dropdb データベース名;
$ psql -l ← データベース「auth」が作成されているか確認
        List of databases
   Name    |  Owner   | Encoding 
-----------+----------+----------
 postgres  | postgres | UTF8
 template0 | postgres | UTF8
 template1 | postgres | UTF8
 auth      | postgres | UTF8 ← 作成されている
(4 rows)
$ psql auth ← データベース「auth」に接続
Welcome to psql 8.3.5, the PostgreSQL interactive terminal.
Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit
auth=# create table city (country varchar(20), capital varchar(20)); ← テーブル「city」の作成
CREATE TABLE
 補足:テーブルの削除方法
  $ drop table テーブル名;
auth=# \d ← テーブル「city」が作成されているか確認
         List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | city | table | postgres
(1 row)
auth=# \d city ← テーブル「city」のカラム定義の確認
           table "public.city"
 Column  |         Type          | Modifiers 
---------+-----------------------+-----------
 country | character varying(20) | 
 capital | character varying(20) | 
auth=# insert into city values ('JAPAN', 'TOKYO'); ← テーブルにデータの挿入
INSERT 0 1
auth=# insert into city values ('USA', 'NewYork'); ← テーブルにデータの挿入
INSERT 0 1
 補足:複数行まとめてのデータの挿入
  auth=# insert into city
  auth-# (country,capital) ← SQL文が続いている場合は「auth-#」となる
  auth-# values('JAPAN','TOKYO'),
  auth-# ('USA','NewYork'); ← データの作成
  INSERT 0 2
 補足:レコードの削除方法
  auth=# delete from city where country='USA'; ← 「USA」レコードの削除
  DELETE 1
  auth=# delete from city; ← テーブル「city」の全レコード削除
auth=# select * from city; ← テーブル「city」の内容確認
 country | capital
---------+---------
 JAPAN   | TOKYO
 USA     | NewYork
(2 rows)
auth=# create user myuser with password 'mypass'; ← ユーザmyuser(パスワード:mypass)の作成
CREATE ROLE
 補足:createuserコマンドで同上のことをする場合
  $ createuser -P myuser
  Enter password for new role: ← パスワードの入力
  Enter it again: ← パスワードの再入力
  Shall the new role be a superuser? (y/n) n
  Shall the new role be allowed to create databases? (y/n) y
  Shall the new role be allowed to create more new roles? (y/n) n
  createuserコマンド実行時の質問は、それぞれ以下のことを確認しています。
   * 新しいロールをスーパーユーザとするか
   * 新しいロールに対してデータベース作成を許可するか
   * 新しいロールに対してロール作成を許可するか
 補足:ユーザの確認方法
  $ psql
  # \du
                                 List of roles
   Role name | Superuser | Create role | Create DB | Connections | Member of 
  -----------+-----------+-------------+-----------+-------------+-----------
   apache    | no        | no          | no        | no limit    | {}
   postgres  | yes       | yes         | yes       | no limit    | {}
  (2 rows)
 補足:ユーザの削除方法
  drop user myuser;
  ただし、下記の「grant」により権限を付与済みの場合は、
  権限をすべて削除した後でなければユーザを削除することができません。
auth=# select usename from pg_user; ← ユーザの一覧表示
 usename  
----------
 postgres
 myuser ← ユーザmyuserが作成されている
(2 rows)
auth=# grant select on city to myuser;
 ↑ テーブル「city」に対し、ユーザmyuserに参照のみのアクセス権を設定
GRANT
 補足:アクセス権限の削除方法
  auth=# revoke select on city from myuser;
   ↑ テーブル「city」に対し、ユーザmyuserから参照のアクセス権を削除
  REVOKE
auth=# \z ← 存在するオブジェクトに対し与えられた権限の表示
                Access privileges for database "auth"
 Schema | Name | Type  |              Access privileges               
--------+------+-------+----------------------------------------------
 public | city | table | {postgres=arwdxt/postgres,myuser=r/postgres}
(1 row)
 「Access privileges」に権限の状態が表示されています。「ロール名=権限/権限を与えたロール」の形で表示されます。
 この場合でも所有者がデフォルトで持つ権限は表示されません。
 各記号の意味は下記の通りです。
      rolename=xxxx -- ロールに与えられた権限
              =xxxx -- PUBLICに与えられた権限
                  r -- SELECT(読み取り(read))
                  w -- UPDATE(書き込み(write))
                  a -- INSERT (追加(append))
                  d -- DELETE
                  x -- REFERENCES
                  t -- TRIGGER
                  X -- EXECUTE
                  U -- USAGE
                  C -- CREATE
                  c -- CONNECT
                  T -- TEMPORARY
             arwdxt -- 全ての権限(テーブル用)
                  * -- 直前の権限に関するグラントオプション
              /yyyy -- この権限を付与したロール
 よって、「myuser=r/postgres」の意味は、「tmyuser」ロールに対して「postgres」ユーザが「SELECT」の権限が
与えれた、ということになります。
 また「postgres=arwdxt/postgres」は「postgres」ロールが「全ての権限(テーブル用)」を持っている
ことになります。
auth=# \q ← \qを入力して、データベースから切断
$ exit ← postgresからログアウト

●バックアップとリストアについて

 PostgreSQLのデータベースをバックアップする手段は、主に3通りあります。
  • PostgreSQLのダンプツールを利用する
  • OSコマンドやサードパーティのバックアップツールを利用する
  • PostgreSQLのPITR(Point In Time Recovery)機能を利用する
 それぞれの特徴を簡単にまとめると表1のようになります。この表の「バックアップファイルのサイズ比」は、同一サイズのデータをバックアップした際のサイズの比較です。 具体的な数値は掲載しませんが、ここで示した法則は汎用的に適用できるでしょう。

(1)PostgreSQLのダンプツール (2)OSコマンド、 バックアップツール (3)PITR
PostgreSQL停止の必要性 なし あり なし
バックアップ・リストアの手順 単純 単純 複雑
リストア後のデータベースの状態 バックアップ取得時点 バックアップ取得時点 直前または任意の時点
マシン変更、メジャーバージョンアップへの利用 可能 不可能 不可能
バックアップファイルのサイズ比 PostgreSQLのダンプツール<OSコマンド、 バックアップツール<PITR
表1 各バックアップ手段の特徴

(1)PostgreSQLのダンプツールを利用したバックアップ

 PostgreSQLのダンプツールには、pg_dump、pg_dumpallがあります。また、pg_dumpallで作成したアーカイブのリストアにはpg_restoreが用意されています。

 データベースのバックアップを作成:pg_dump

 PostgreSQLにはpg_dumpというデータベースをバックアップするコマンドがあります。pg_dumpを利用すると、データベースを運用中であってもバックアップを作成できます。
  • pg_dumpの内部動作
 pg_dumpの内部動作としては、トランザクションブロック内でSELECT文を発行し、取得したデータを出力形式に合わせて整形したうえで標準出力に出力します。
 そのため、ほかのユーザーによるデータベースへの読み書きをブロックすることなく、バックアップ開始時点における一貫性のあるバックアップを取得することが可能です。

 pg_dumpの出力形式

 出力形式はスクリプト形式とアーカイブ形式が選択できます。デフォルトはスクリプト形式で、バックアップ時のデータベースを復元するために必要なSQL文の羅列がプレーンテキストの形で出力されます。リストアはpsqlコマンドを使用します。
 スクリプト形式の利点は、なんといってもプレーンテキストという点です。例えば、リストアの際にエラーが発生した場合、ファイルの中身を見てエラーの原因を探ることができますし、PostgreSQL固有のSQL文を多少編集すれば、ほかのデータベース製品にもリストアすることができます。
 一方、アーカイブ形式はバイナリの形で出力されます。リストアはpsqlではなく、pg_restoreというリストア用のコマンドを使用します。アーカイブ形式の利点は、指定したテーブルのみといったように、データベースを部分的にリストアするなど、柔軟なリストアが可能になっている点です。そのかわり、バイナリのためファイルの中身を直接見たり編集したりすることはできません。また、アーカイブ形式には、custom形式とtar形式の2種類があり、custom形式はデフォルトで圧縮されるためファイルサイズが小さくなります。
 なお、pg_dumpによって作成したバックアップファイルは、CPUアーキテクチャが異なるほかのマシンや、より新しいバージョンのPostgreSQLにもリストアすることができます。
 pg_dumpの基本的な使用方法は次のとおりです。
$ pg_dump データベース名 > バックアップファイル名
 また、pg_dumpはローカル環境だけでなくリモート環境でも実行できます。
$ pg_dump -h ホスト名 -p ポート番号 データベース名 > バックアップファイル名    
 リストアは次のように行います。
$ createdb データベース名
$ psql -f バックアップファイル名 データベース名    
 上記はスクリプト形式でのバックアップ、リストアですが、アーカイブ形式でバックアップを行う場合は、-Fオプションを指定して実行します。
$ pg_dump -Fc データベース名 バックアップファイル名
 上の例で、cオプションはcustom形式を表し、代わりにt を指定するとtar形式になります。
 アーカイブ形式のリストアは、pg_restoreを使用します。
$ pg_restore -C -d postgres バックアップファイル名
 -Cオプションを付けるとリストア前にデータベースを作成し、-dオプションは、その際に接続するデータベース名を指定します。そのため、-Cオプションと併用する場合は、接続さえできればどのデータベースでもかまいません。
 以上が、pg_dumpを利用したバックアップ、リストア方法です。
 pg_dumpは、データベース単位でバックアップを取得するコマンドですので、グローバルデータと呼ばれるロールやテーブルスペースなどの情報はバックアップされないことに注意してください。

 データベースクラスタ全体のバックアップを作成:pg_dumpall

 前述のように、pg_dumpコマンドではロールやテーブルスペースなどの情報はバックアップされません。これらの情報も含めてデータベースクラスタ全体をバックアップしたい場合は、pg_dumpallという便利なコマンドが用意されています。このコマンドは、-gオプションを指定して実行することで、グローバルデータのみをバックアップすることも可能です。

pg_dumpallの内部動作と出力

 pg_dumpallは、内部動作としてはpg_dumpを呼び出しているため、ほぼ同じオプションを指定できます。ただし、出力形式を指定する-Fオプションは使えません。出力は常にスクリプト形式です。
 pg_dumpallを使用すると、PostgreSQLを運用しているマシンの変更やPostgreSQLのバージョンアップを容易に行うことができます

 pg_dump、pg_dumpallをcronで使う際の注意点

 pg_dump、pg_dumpallは、cronなどを利用して定期的に実行されることが多いですが、その際、接続時にパスワードを設定していると、それらは実行時にパスワードの入力待ち状態になってしまいます。
 これを防ぐには、コマンドを実行するユーザーのホームディレクトリに、以下の書式に従ってパスワードを記述したファイルを.pgpassという名前で配置しておいてください。そうすることで、パスワードはそのファイルに書かれているものが自動的に適用されるようになります。

ホスト名:ポート番号:データベース名:ユーザー名:パスワード

 ただし、pg_dump、pg_dumpallでは、postgresql.confやpg_hba.confなどの設定ファイルはバックアップされないので注意が必要です。これらのファイルについては別途コピーする必要があります。これ以外のpg_dump、pg_dumpall、pg_restoreのオプションや詳細については、下記マニュアルを参照してください。

バックアップコマンドのマニュアル
バックアップコマンドのそのほかのオプションや詳細な使い方については下記日本語ドキュメントを参照ください(いずれも、NPO法人 PostgreSQLユーザ会Webサイト内掲載のオンラインマニュアル)。
(2)OSコマンド(rsyncなど)、バックアップツールによるバックアップ

 OS側で用意されているコマンドやサードパーティ製のバックアップツールを利用したバックアップ方法は、PostgreSQLを停止してデータベースクラスタをコピーすれば完了です。リストアは、データベースクラスタのディレクトリを置き換えるだけです。この方法の利点は何といっても単純明快なことですが、以下の欠点があります。
  • 一貫性を保ったバックアップを取得するために、PostgreSQLを停止しなければならない
  • CPUアーキテクチャが異なる環境やメジャーバージョン(先頭2けた)が異なるPostgreSQLへはリストアできない
  • バックアップファイルのサイズが、PostgreSQLのダンプツールを使用した場合に比べて大きくなりがち
 OSコマンドとしては、tar、cpio、dump、rsyncなどのコマンドが使用できますが、なかでも差分バックアップができるrsyncは特に有用です。

 rsyncによる差分バックアップ

 rsync を利用する場合は、PostgreSQLを運用中にいったんrsyncを実行したうえでPostgreSQLを停止し、再度rsyncを実行する方法が多く取られます。2回目のrsyncは1回目のrsyncでコピーしたものの差分のみをコピーするため、コピー時間が短くなり、結果的にPostgreSQLの停止時間を最小限に抑えることができるからです。
rsyncによる差分バックアップの画像
図 rsyncによる差分バックアップの流れ
  • バックアップ先は信頼できるメディアを
 最後に、当たり前のことですが、いずれのバックアップ手段を取るにしても、データベースと同じハードディスク上にバックアップを保存してしまうと、ハードディスクが壊れたときにせっかくのバックアップも取り出せなくなってしまいます。
 バックアップファイルはデータベースと別の信頼できるハードディスクに保存するか、テープなどのメディアに保存するよう検討してください。

(3)PITRによるバックアップ

 記載は未定






●エラー対処

 PerlプログラムでCan't locate (モジュール名) in @INCと出力された場合
% perl -le 'print for @INC' ← Perlのライブラリの検索PATHの確認
/usr/local/lib/perl5/5.8.8/BSDPAN
/usr/local/lib/perl5/site_perl/5.8.8/mach
/usr/local/lib/perl5/site_perl/5.8.8
/usr/local/lib/perl5/site_perl
/usr/local/lib/perl5/5.8.8/mach
/usr/local/lib/perl5/5.8.8
配列なので、プログラム中、
unshift @INC, '/home/user/lib/';
の様に追加も可能。
 また、-Iオプションを用いることにより、/home/user/libを検索PATHに加えたければ、
% perl -I /home/user/lib ./test1_pgsql.pl
の様に、実行時に指定も可能。
 さらに環境変数PERL5LIBを用いれば、
% setenv PERL5LIB=/home/user/lib
% perl -le 'print for @INC'
/home/user/lib
/usr/local/lib/perl5/5.8.8/BSDPAN
/usr/local/lib/perl5/site_perl/5.8.8/mach
/usr/local/lib/perl5/site_perl/5.8.8
/usr/local/lib/perl5/site_perl
/usr/local/lib/perl5/5.8.8/mach
/usr/local/lib/perl5/5.8.8
の様に、予め指定しておく事もできます。

 Perl-Pgプログラム実行時にデータベースと接続できない場合の疑うべき箇所

 (postgresユーザのホームディレクトリ)/data/pg_logにあるログを調査します。
 データベースに接続する際のユーザ名が「postgres」の場合、パスワードを設定しなくてもデータベースに接続することができます。それなのに、結果が表示されない場合は「FATAL: ユーザ"postgres"のIdent認証に失敗しました」というエラーが表示されているはずです。
 これは「pg_hba.conf」の設定に問題がありますので、下記の通り修正します。
# vi (postgresユーザのホームディレクトリ)/data/pg_hba.conf
#local   all         all                               ident ← コメントアウト
local   all         all                               trust ← 追加
# service postgresql reload ← リロード
 これでもまだ結果が表示されない場合は、PostgreSQLが起動しているかどうか、データベース接続ユーザ名、パスワードまたはデータベース名等が間違っていないか確認してください。

 org.postgresql.util.PSQLException: FATAL: Ident authentication failed for user "postgres"
 プログラム名:20:行数 `initialize': FATAL: ユーザ"postgres"のIdent認証に失敗しました (PG::ConnectionBad)


 対処方法は下記をのように変更してください。
# vi (postgresユーザのホームディレクトリ)/data/pg_hba.conf ← 「pg_hba.conf」ファイルの編集

# "local" is for Unix domain socket connections only
#local   all             all                                     peer ← コメントアウト
local   all             all                                     trust ← 追加
# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident ← コメントアウト
host    all             all             127.0.0.1/32            trust ← 追加
#local    all             all             127.0.0.1/32            trust
# IPv6 local connections:
#host    all             all             ::1/128                 ident ← コメントアウト
host    all             all             ::1/128                 trust ← 追加

 org.postgresql.util.PSQLException: FATAL: role "myuser" dose not exist

 コンテキストファイルで設定したユーザ「myuser」が、PostgreSQLで作成されていない場合に表示されるエラーです。対処方法は下記を参照してください。
# su - postgres
$ psql auth ← データベース「auth」に接続
auth=# create user myuser with password 'mypass'; ← ユーザmyuser(パスワード:mypass)の作成
auth=# grant select on city to myuser; ← ユーザmyuserに参照のみのアクセス権を設定

 org.postgresql.util.PSQLException: ERROR: permision denied for relation city

 コンテキストファイルで設定したユーザが、テーブル「city」への参照権がない場合に表示されるエラーです。テーブル「city」に対し、少なくとも「select」権限を与えてください。なお、テーブル「city」はデータベース「auth」に存在するものとします。
# su - postgres
$ psql auth ← データベース「auth」に接続
auth=# grant select on city to myuser; ← ユーザmyuserに参照のみのアクセス権を設定

 LOG: アドレス"127.0.0.1"、ポート113のIdentサーバに接続できませんでした: 接続を拒否されました

 Ruby-Pgプログラムを実行時に、(postgresユーザのホームディレクトリ)/data/pg_logに下記のようなエラーが表示される場合があります。
LOG:  アドレス"127.0.0.1"、ポート113のIdentサーバに接続できませんでした: 接続を拒否されました
FATAL:  ユーザ"postgres"のIdent認証に失敗しました
 この場合は、下記のようにしてください。
# vi (postgresユーザのホームディレクトリ)/data/pg_hba.conf
#host	all	all	127.0.0.1/32	ident ← コメントアウト
host	all	all	127.0.0.1/32	trust ← 追加
# service postgresql reload ← リロード