新トップページへ | Tip

PostgreSQLの使い方メモ

LastUpdate : 12/08/05
Update : 08/04/12

CentOS5.1(64Bit版)にPostgreSQLをインストールし、DBサーバとして使うための、基本的な使い方までのメモです。
メモといいつつ、ただの、作業履歴です(ぉ

もくじ

始めに
インストールについて
マニュアルとか
インストール後、とりあえずちゃんと動くか確認する
データベースを初期化し、テスト用のテーブルを作成し、selectする
データベースの作成&削除
データベースに表の挿入&問い合わせ
ネットワーク越しに接続
クライアントから、問い合わせをしてみる
Tip
インスタンスの作成

インストールについて

yumを使ってインストールを行います

[root@postgres_server ~]# yum install postgresql-server

ついでに、立ち上がったときにpostgresが自動的に起動するようにしておきます。

[root@postgres_server ~]# chkconfig --list postgresql
postgresql 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@postgres_server ~]# chkconfig --level 3 postgresql on
[root@postgres_server ~]# chkconfig --list postgresql
postgresql 0:off 1:off 2:off 3:on 4:off 5:off 6:off
[root@postgres_server ~]#

デフォルトではオフになってるので、ONにしておきます(私の場合、ランレベルは常に3なので、3のみONにしています。ランレベル5(自動でXが立ち上がる場合)の場合、5をONにしておかないと自動的に立ち上がりません。

yum でインストールを行うと、postgresを実行するユーザアカウント「postgres」が自動で追加されます。
念のためパスワードを設定しておきます(linuxのpasswdコマンド)

マニュアルとか

日本PostgreSQLユーザ会 → http://www.postgresql.jp/

↑の中にある、オンラインマニュアル(日本語) → http://www.postgresql.jp/document/

オンラインマニュアルは丁寧に書かれているので、大方これでなんとかなりそうな感じです。
というか、これを読めば一通り大丈夫だと思います(^^; 

データベースを初期化し、テスト用のテーブルを作成し、selectする

インストール直後、行わなければならないことは、データベースのデータを格納する場所の初期化です。

「 initdb -D /var/lib/pgsql/data 」とかで初期化しなければならなかったような気がしますが、どうも、yum なんかでインストールすると、違う感じ?

マニュアル(「 PostgreSQL 8.1.1文書 の 16.2データベースクラスタの作成 」 [ http://www.postgresql.jp/document/pg811doc/html/creating-cluster.html ])には

初期化が終わると、データベースクラスタにはpostgresという名前のデータベースが含まれています。

だとか

データディレクトリが既に初期化されているように見える場合は、initdbは実行を拒否します。

とかマニュアルにあります。
で、データベース一覧を表示させてみると・・・

[root@postgres_server pgsql]# su - postgres
-bash-3.1$ psql -l
List of databases
Name | Owner | Encoding
-----------+----------+----------
postgres | postgres | UTF8
template0 | postgres | UTF8
template1 | postgres | UTF8
(3 rows)

-bash-3.1$

とか、表示されています(postgres というデータベースが存在している)。

初期化が完了していると、判断していいのでしょうか?(涙
まぁ、問題があれば、やり直せばいいだけだし・・・ね?tt
なんというか、たぶん、初回起動時に、postgresというインスタンスがつくられているよーな気がします。

データベースクラスタのパスを変更したい場合とかの場合は、initdbで初期化しなおす必要がある気がします( ← 変更したいと思ったことがないため、やったことがありませんtt

※12/08/05 追記

CentOS6.3では上記手順ではうまくいかなかった。
yum install postgresql でインストール後以下のコマンドを実行
service postgresql initdb
その後、service postgresql startでPostgreSQLの起動を行う。

データベースの作成&削除

自分用のデータベースを作成します。

postgresが立ち上がっている必要がありますので、注意してください(インストール直後は起動していないため、service postgresql start などのコマンドで起動させてください。)。

コマンドラインより以下のプログラムを呼び出し、データベースを作成してもらいます。
テスト用に「 testdb 」というデータベースを作成してみます。

[root@postgres_server ~]# su - postgres
-bash-3.1$ createdb testdb
← testdbというデータベースを作成
CREATE DATABASE
-bash-3.1$

このコマンドが完了したならば、今度はデータベースの一覧を表示させます

-bash-3.1$ psql -l ← データベースの一覧を表示させる
List of databases
Name | Owner | Encoding
-----------+----------+----------
postgres | postgres | UTF8
template0 | postgres | UTF8
template1 | postgres | UTF8
testdb | postgres | UTF8 
← 先ほど作成したデータベースが追加されている
(4 rows)

-bash-3.1$

今、作成したデータベース、testdbを削除する。

-bash-3.1$ dropdb testdb ←データベースを削除する
DROP DATABASE
-bash-3.1$ psql -l 
←データベースの一覧を表示させる
List of databases
Name | Owner | Encoding
-----------+----------+----------
postgres | postgres | UTF8
template0 | postgres | UTF8
template1 | postgres | UTF8
(3 rows)

-bash-3.1$

データベースに表の挿入&問い合わせ

「 testdb 」という名前のデータベースを作成し、テーブルを挿入し、挿入したレコードを表示させています。

-bash-3.1$ createdb testdb ←testdbというデータベースの作成
CREATE DATABASE
-bash-3.1$ psql -d testdb 
←psqlでtestdbへ接続(-dで接続するデータベースを指定する)
Welcome to psql 8.1.11, 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=# \d 
←テーブルの一覧を表示させる
No relations found. 
←データベースを作成した直後のため何もテーブルは存在しない
testdb=# create table TicketTBL( 
←テーブルの作成
testdb(# TicketNo integer primary key,
testdb(# comment text,
testdb(# updated timestamp); 
←psqlにおいてコマンドの実行は「\g」ですが「;」でもOKみたいです
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tickettbl_pkey" for table "tickettbl"
CREATE TABLE
testdb=# insert into TicketTBL(TicketNo,comment,updated) 
←レコードの挿入
testdb-# VALUES( 1 , 'こめんとですよーーーーーwww' , NOW() ); 
INSERT 0 1
testdb=# select * from TicketTBL 
←先ほど挿入したレコードを表示
testdb-# ;
ticketno | comment | updated
----------+--------------------------------+----------------------------
1 | こめんとですよーーーーーwww | 2008-04-12 23:24:38.268346
(1 row)

testdb=# \d TicketTBL 
←先ほど作成したテーブルの情報を表示させてみる
Table "public.tickettbl"
Column | Type | Modifiers
----------+-----------------------------+-----------
ticketno | integer | not null
comment | text |
updated | timestamp without time zone |
Indexes:
"tickettbl_pkey" PRIMARY KEY, btree (ticketno)

testdb=#


クライアントから、問い合わせをしてみる

インストールした状態だと、外部から接続できないようになっています。
外部から接続できるようにするため、設定ファイルを編集します。

postgresql.conf ファイルを編集します( /var/lib/pgsql/data/postgresql.conf )

#---------------------------------------------------------------------------
#       CONNECTIONS     AND     AUTHENTICATION
#---------------------------------------------------------------------------

#       -       Connection      Settings        -

#listen_addresses       =       'localhost'     # what IP address(es) to listen  on;
                                                # comma-separated list of addresses;
                                                # defaults to 'localhost', '*' = all

となっているところがあるかと思います(vi なら/listen_addressesと打ち込んで検索すれば、2回目ぐらいで発見できます)

これを、コメントにもあるように、「 listen_address = '*' 」に変更しますし、保存します。

listen_address = '*'

次に、pg_hba.conf ファイルを編集します( /var/lib/pgsql/data/pg_hba.conf )

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               ident sameuser
# IPv4 local connections:
host    all         all         127.0.0.1/32          ident sameuser
# IPv6 local connections:
host    all         all         ::1/128               ident sameuser
#ALC_GROUP Lan access
host    all         all         192.168.118.0/24       md5

長いコメントの最後の数行にアクセス設定が書いてあります。最後の2行が追加したところです。
パスワードで認証をさせ、なおかつ、192.168.118.0のアドレス以下からしかアクセスさせない、という設定になっています。

PostgreSQLの中で、postgresというユーザが存在します(linuxのプロセスを実行させるためのユーザーではない)。
このpostgresにパスワードを未設定のため、設定を行います。

[root@postgres_server ~]# su - postgres
-bash-3.1$ psql -d testdb
Welcome to psql 8.1.11, 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=# alter user postgres with password 'nyannyan'; 
←postgres(ユーザ名)にnyannyanというパスワードを設定
ALTER ROLE
testdb=# \q
-bash-3.1$

設定ファイルの編集が終わったら、保存し、PostgreSQLを再起動させる。

とりあえず、外部からの接続ということで、Windows機から接続をしてみました(Windows機に、たまたまPostgreSQLがはいっていたため、psqlから問い合わせをしてみました)

C:\Program Files\PostgreSQL\8.3\bin>psql -d testdb -h 192.168.118.115 -p 5432 -U postgres ←PostgreSQLを動かしているサーバに接続(コマンドの意味は下参照)
Password for user postgres: 
←ここで、先ほど決めたパスワードを入力
Welcome to psql 8.3.0 (server 8.1.11), 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

WARNING: You are connected to a server with major version 8.1,
but your psql client is major version 8.3. Some backslash commands,
such as \d, might not work properly.

testdb=# select * from tickettbl 
← 適当なテーブルから、データをselectしてみました
testdb-# ;
ticketno | comment | updated
----------+--------------------------------+----------------------------
1 | こめんとですよーーーーーwww | 2008-04-12 23:24:38.268346
(1 row)

testdb=#

サーバーとクライアントで使っているPostgreSQLのバージョンが異なるため、ワーニングがでていますが、とりあえず、使うことができました。
サーバーの設定においては、ファイヤーオールの設定、そして、上にも書きましたが設定ファイルの編集は忘れないでください。


※psqlのオプション

-d データベース名前
-h リモートホストアドレス
-p 使用するポート番号
-U 使用するユーザー名

そして、以下のように使用します。

psql -d testDB -h 192.168.118.115 -p 5432 -U postgres

インスタンスの作成

以下の内容はほんとーに、これでよいのか、考え中ですので、注意してください。

 PostgreSQLのコマンドに、「 initdb 」というものがあります。これを使いインスタンスの追加を行います。

(1)インスタンス管理者用としてアカウントを作成
 インスタンスごとに、管理者ユーザを作る必要があるのかどうかは不明ですが、とりあえず作ってみます。
とりあえず、普通にここでは、「 adduser postgres2 」とし、postgres2というユーザを追加しました(念のため、パスワードも設定しておきました)。

(2)データベースを格納するディレクトリを作成

[root@postgres_server ~]# mkdir -p /var/postgresdb/test
[root@postgres_server ~]# chown postgres2:postgres2 /var/postgresdb/test
[root@postgres_server ~]# chmod 775 /var/postgresdb/test

こんな感じで、ディレクトリを作成し、さらに、所有権・パーミッションも変更しておきます。

(3)インスタンスを作成

initdbを行う際、ロケールを指定することができますが、この点はなんだか揉めてるみたい(?)。
まぁ、現状ではとりあえず、

[postgres2@postgres_server ~]$ initdb --no-locale --encoding=EUC_JP --username=postgres2 --pwprompt --pgdata /var/postgresdb/test

こんな感じで指定します。LIKEでの検索などに問題がでてくるらしいのでロケールの設定には「 --no-locale 」を必ず指定します。
--encodingにて、エンコーディングの指定をし、
--pgdataにて、データベースのデータをどこに配置するか((2)で作成したディレクトリを指定)を指定します。

その他、オプションもありますので、マニュアルを参照してください。

(4)インスタンスの起動

 initdbコマンドが正常に終了すると「 postmaster -D /var/postgresdb/test 」でインスタンスを起動してね、みたいなメッセージが表示されます。
すでに、インスタンスが起動している場合、同じポートで、インスタンスが複数待ちうけというのは、おかしな話なので、ポート番号を変更し、インスタンスを起動させます。

 データベースの保存ディレクトリとして(3)にて、/var/postgresdb/test を指定しました。
ここに、設定ファイルなども、作成されるので、その中の「 postgresql.conf 」ファイルの編集を行います。

postgresql.conf
#---------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#---------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*'                  # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost', '*' = all
port = 50000

大体、50行目あたりに、外部からの接続を受け入れるかどうか、や、ポート番号の設定の項目があります。
#でコメントアウトされていたら、#をはずじ、ポート番号などを設定します(ここでは、50000に設定)

そして、ファイヤーオールの設定ももちろん行います(50000のポートを外部から接続受け入れ)

そして、インスタンスの起動を行います。

[postgres2@postgres_server ~]$ pg_ctl -o "-p 50000" -D /var/postgresdb/test -w start

pg_ctlというpostgreSQLのデータベースの起動・停止の管理用プログラムを使い、起動させてみます。 -wオプションをつけ、データベースが起動するまで、制御が帰ってこないようにしています(pg_ctlを実行しているのは、(1)で作成したpostgres2です。この辺の管理者ユーザが必要なのか、そしてそれの指定方法などいまいちわかってないので、あやしいです)。

・・・これで、たぶん、うまく動く・・・はず。