mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

PostgreSQLで新規DBの構築

CentOS6の環境にPostgreSQL環境を構築したときのメモ。
(別段たいしたことはやってない)

インスト手順

yumでインスト出来るのでインスト手順は省略。

まず起動

デフォルトでは、/var/lib/pgsql/dataにDBが作成されていないとpostgresqlサービスを起動出来ない。
まずデータベースを作成して、それから起動する。

[root@centos6 ~]# service postgresql start

/var/lib/pgsql/data is missing. Use "service postgresql initdb" to initialize the cluster first.
                                                           [失敗]
[root@centos6 ~]# ls /var/lib/pgsql/data
[root@centos6 ~]# service postgresql initdb
データベースを初期化中:                                    [  OK  ]
[root@centos6 ~]# service postgresql start
postgresql サービスを開始中:                               [  OK  ]

サービスの自動起動設定

デフォルトでは自動起動はoffになってるのでonにする。

[root@centos6 ~]# chkconfig --list |grep postgre
postgresql     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
[root@centos6 ~]# chkconfig postgresql on
[root@centos6 ~]# chkconfig --list |grep postgre
postgresql     	0:off	1:off	2:on	3:on	4:on	5:on	6:off

ユーザ作成

デフォルトのpostgresユーザと別のユーザを作成し、DBインスタンスの作成権限を与える。
ユーザはログイン時のパスワード指定も必要とする。

-bash-4.1$ psql
psql (8.4.13)
"help" でヘルプを表示します.

postgres=# \du
                ロール一覧
 ロール名 |        属性        | メンバー 
----------+--------------------+----------
 postgres | スーパーユーザ     | {}
          : ロールを作成できる   
          : DBを作成できる       

postgres=# create user mokky with password 'mokkypasswd' createdb;
CREATE ROLE
postgres=# \du
                ロール一覧
 ロール名 |        属性        | メンバー 
----------+--------------------+----------
 mokky    | DBを作成できる     | {}
 postgres | スーパーユーザ     | {}
          : ロールを作成できる   
          : DBを作成できる 

データベース作成

postgres=# create database mokkydb owner = mokky;
CREATE DATABASE
postgres=# \l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |    
  アクセス権       
-----------+----------+------------------+-------------+-------------------+----
-------------------
 mokkydb   | mokky    | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | 
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | 
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/
postgres
                                                                           : pos
tgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/
postgres
                                                                           : pos
tgres=CTc/postgres
(4 行)

postgres=# 

新しく作成したDBにログイン

-bash-4.1$ psql -U mokky -d mokkydb;
psql: FATAL:  ユーザ"mokky"のIdent認証に失敗しました

、、しようとしたらエラー。
このIdent認証というのは、「Linux 上のアカウントと PostgreSQL のアカウントが一致しないとエラーにする」設定のことだそう。

なので、postgresqlログインアカウントに対応するUnixアカウントを作成する。

[root@centos6 ~]# useradd mokky
[root@centos6 ~]# passwd mokky
ユーザー mokky のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。

mokkyユーザで再度ログイン。

-bash-4.1$ su - mokky
パスワード:
[mokky@centos6 ~]$ psql -U mokky -d mokkydb;
psql (8.4.13)
"help" でヘルプを表示します.

mokkydb=>

ログイン出来た。パスワード聞かれなかったけど。。

(後日追記)
パスワード認証を行うには、 /var/lib/pgsql/data/pg_hba.conf に設定が必要。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 trust
host    all             all             0.0.0.0/0               password

上記設定だと、ローカルホストからのアクセスはパスワードなしでアクセス可能、ローカル以外のv4アドレスのクライアントからのアクセスはパスワード認証付きでアクセス可能になる。
なお、METHOD=passwordだと、パスワードが平文で送られるようなので、ネットワークセキュリティの考慮が必要な環境では別のメソッドが必要。
認証方式についてはここあたりに記述があった。