PosgreSQLのインストール
 

概要:PosgreSQL(ポスグレエスキューエル)は、オープンソースのリレーショナル型データベースの一つです。
VPSでは普通インストールされていないので、インストールをして設定をします。 データベースの自動バックアップ運用設定をします。

1. PosgreSQL用ユーザーの作成

yumでPosgreSQLをインストールするとPosgreSQL用のユーザーpostgresが自動的に作成されますが、ログインディレクトリーが/var/lib/pgsqlに設定され、/homeの下にホームディレクトリーが作成されません。バックアップの設定など運用上不便なので予めユーザーpostgresを作成しておきます。意味はないと思いますがyumでインストールするとgid=26 uid=26でユーザーが作成されるので、それに合わせておきます。
セキュリティー上パスワードの設定はしません。rooからpostgresにsuします。

# groupadd -g 26 postgres                             ← グループの作成
# useradd -g postgres -u 26 postgres -c 'PostgreSQL Server' ← ユーザーの作成

作成したユーザーの.bash_profileにyumでインストールした時に作成されるユーザーの.bash_profileの記述を追加します。

# vi /home/postgres/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

PGDATA=/var/lib/pgsql/data    ← 2でデータベース用のディレクトリーを作成する場合はそれに合わせます
export PGDATA

SELinuxを有効にしている場合は、ディレクトリーの再構成をします。

2. データベース用ディレクトリーの作成

PosgreSQLを最初に起動する前にデータベースの初期化(initdb)をしますが、データベースが作成されるDefaultのディレクトリーは/var/lib/pgsql/dataです。データベースのディレクトリーを変更したい場合は、以下のようにしてinitdbを実行する前に作成します。後で忘れないようにここで作成しておきます。

# mkdir -p /data/pgsql       ← データベース用のディレクトリーの作成
# chown postgres.  /data/pgsql   ← 権限の変更

SELinuxを有効にしている場合は、ディレクトリーの再構成をします。

3. PosgreSQLのインストール

# yum -y install postgresql postgresql-server ← postgresqlのインストール
Loaded plugins: downloadonly, fastestmirror, priorities
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package postgresql.x86_64 0:8.4.20-1.el6_5 will be installed
---> Package postgresql-server.x86_64 0:8.4.20-1.el6_5 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================
 Package                   Arch           Version                   Repository       Size
==========================================================================================
Installing:
 postgresql                x86_64         8.4.20-1.el6_5            updates         2.6 M
 postgresql-server         x86_64         8.4.20-1.el6_5            updates         3.4 M

Transaction Summary
==========================================================================================
Install       2 Package(s)

Total download size: 6.0 M
Installed size: 28 M
Downloading Packages:
(1/2): postgresql-8.4.20-1.el6_5.x86_64.rpm                        | 2.6 MB     00:00
(2/2): postgresql-server-8.4.20-1.el6_5.x86_64.rpm                 | 3.4 MB     00:00
------------------------------------------------------------------------------------------
Total                                                      19 MB/s | 6.0 MB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : postgresql-8.4.20-1.el6_5.x86_64                                       1/2
  Installing : postgresql-server-8.4.20-1.el6_5.x86_64                                2/2
  Verifying  : postgresql-server-8.4.20-1.el6_5.x86_64                                1/2
  Verifying  : postgresql-8.4.20-1.el6_5.x86_64                                       2/2

Installed:
  postgresql.x86_64 0:8.4.20-1.el6_5       postgresql-server.x86_64 0:8.4.20-1.el6_5

Complete!

4. postgresqlの修正

データベースの初期化(initdb)をする前にサービスコマンドpostgresqlを修正します。修正個所は以下のデータベースのディレクトリーとログファイルとinitdbの3箇所です。

# ls -l /etc/init.d/postgresql
# cp -p /etc/init.d/postgresql /etc/init.d/postgresql.yyyymmdd
# vi /etc/init.d/postgresql
  :
  :
# Set defaults for configuration variables
PGENGINE=/usr/bin
PGPORT=5432  ← 外部からの接続ポートを変更する場合は変更
PGDATA=/var/lib/pgsql/data
  ↓ 以下のように修正
PGDATA=/data/pgsql
PGLOG=/var/lib/pgsql/pgstartup.log
  ↓ 以下のように修正
PGLOG=/home/postgres/pgstartup.log
  :
  :
        # Initialize the database
        $SU -l postgres -c "$PGENGINE/initdb --pgdata='$PGDATA' --auth='ident'" >> "$PGLOG" 2>&1 < /dev/null
       --no-locale -E UTF-8を追加します。
        $SU -l postgres -c "$PGENGINE/initdb --pgdata='$PGDATA' --no-locale -E UTF-8 --auth='ident'" >> "$PGLOG" 2>&1 < /dev/null
  :
  :

 -E(--encoding) オプションでテンプレートデータベースのエンコードをUTF-8にします。
 --no-locale でロケールを C のままにします。日本語環境の場合はデータベースのロケールはかえって有害です。

5. データベースの初期化(initdb)

initdbコマンドの実行はroot以外のデータベースオーナーとなるユーザー(通常postgres)で実行しなければなりませんが、サービスコマンドでは上記のようにpostgresにsu(SELinuxを使用している場合はrunuser)して実行するのでrootでサービスコマンドpostgresqlを実行します。サービスコマンドでinitdbを実行すると、SELinuxのファイルタイプの再構成も行ってくれます。

# service postgresql initdb
Initializing database:                                     [  OK  ]

結果のログを確認します。

# view /home/postgres/pgstartup.log
The database cluster will be initialized with locale C.
The default text search configuration will be set to "english".

fixing permissions on existing directory /var/data/pgsql ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /var/data/pgsql/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

Success. You can now start the database server using:

    /usr/bin/postgres -D /var/data/pgsql
or
    /usr/bin/pg_ctl -D /var/data/pgsql -l logfile start

6. データベースの起動

データベースの起動とシステム起動時の自動起動設定をします。

# service postgresql start   ← PostgreSQLの起動
Starting postgresql service:                               [  OK  ]
# service postgresql status   ← PostgreSQLの起動確認
postmaster (pid  861) is running...
# chkconfig --list postgresql   ← PostgreSQLの自動起動設定の確認
postgresql      0:off   1:off   2:off   3:off   4:off   5:off   6:off
# chkconfig postgresql on   ← PostgreSQLの自動起動の設定
# chkconfig --list postgresql
postgresql      0:off   1:off   2:on    3:on    4:on    5:on    6:off

psコマンドで起動の確認を行います。

# ps ax |grep post
20851 ?        S      0:00 /usr/pgsql-9.1/bin/postmaster -p 5432 -D /var/lib/pgsql/9.1/data
20853 ?        Ss     0:00 postgres: logger process
20857 ?        Ss     0:00 postgres: writer process
20858 ?        Ss     0:00 postgres: wal writer process
20859 ?        Ss     0:00 postgres: autovacuum launcher process
20860 ?        Ss     0:00 postgres: archiver process
20861 ?        Ss     0:00 postgres: stats collector process
プロセス名説明
postmasterDBMSデーモン
logger processサーバログ
writer processバックグラウンドライタ
wal writer processWAL ライタ
archiver processアーカイブログ管理
autovacuum launcher process自動バキューム
stats collector process統計情報

7. データベースの動作確認

ユーザーpostresでデータベースにアクセスしてみます。

# su - postgres
$ psql
psql (8.4.18)
Type "help" for help.

postgres=# \l    \lと入力してエンター
                             List of databases
   Name    |  Owner   | Encoding | Collation | Ctype |   Access privileges
-----------+----------+----------+-----------+-------+-----------------------
 postgres  | postgres | UTF8     | C         | C     |
 template0 | postgres | UTF8     | C         | C     | =c/postgres
                                                     : postgres=CTc/postgres
 template1 | postgres | UTF8     | C         | C     | =c/postgres
                                                     : postgres=CTc/postgres
(3 rows)

postgres=# select * from pg_settings;
データベースの設定情報が表示されればOKです。 
表示の途中で q で表示を中止できます。
postgres=# \q    psqlをquitします。
$

8. データベースのパラメータの初期設定

データベースの設定値がデフォルトのままだと小さすぎるのである程度大きく設定し、稼働状況により調整します。
参考:PostgreSQL 9.3.2文書 第 18章サーバの設定 以下の設定はpostgresql.confを編集します。「4.サーバログ関連」ではsyslogの設定も必要です。

1.メモリ(バッファ)関連

  1. ) shared_buffers
    デフォルト値:128MB
    データベースサーバが使用する共有メモリバッファ(テーブルやインデックスのデータを8kbのブロック単位でバッファリング)のために使用するメモリ量を設定します。
    1GB以上のRAMを載せた専用データベースサーバを使用している場合、妥当な初期値はシステムメモリの25%です。
  2. ) work_mem
    デフォルト値:1MB
    一時ディスクファイルに書き込む前に、内部並べ替えとハッシュテーブル操作が使用するメモリ容量を指定します。
    4MBを設定します。

2.ログ先行書き込み(WAL)関連

 PostgreSQLでは、データベースへの更新記録は、WALログ(Write Ahead Log,トランザクションログ)というファイルに同期書き込みを使って行われます。その代わり、テーブルやインデックス本体への書き込みは、同期書き込みではなく、通常のバッファリングを使ったより効率的な方法を使います。コンピュータ/PostgreSQLがクラッシュしても共有バッファ内の更新データは、WALログからリカバリできます。
 しかし、WALログは放っておくと無制限に大きくなってしまうので、ときどき「チェックポイント(checkpoint)」処理を実行し、データベースへの更新を同期書き込み(フラッシュ)によって確定します。同期書き込みによってデータを確定するとこれまでのWALログのデータが不要になるので、このタイミングでWALログを消去します。

  1. ) wal_buffers
    デフォルト値:-1(shared_buffersの1/32が設定される)
    未だディスクに書き込まれていないWALデータに対して使用される共有メモリ容量です。WALバッファの内容はトランザクションのコミット毎にディスクに書き込まれます。
    デフォルトのままとします。
  2. )checkpoint_segments
    デフォルト値:3ファイル
    「いくつのトランザクションログファイルを消費したらチェックポイントを発生させるか」という設定です。
    トランザクションログのファイルはひとつ16MBです。この設定のままだとチェックポイントが頻発してしまうことがあります。checkpoint_segmentsに64~128程度を初期値として設定します。
  3. )checkpoint_timeout
    デフォルト値:5分(5min)
    チェックポイントが発生する間隔を「時間」で指定するものです。
    少し短すぎるので「20分(20min)」を初期値として設定します。

3.プランナコスト関連

  1. ) effective_cache_size
    デフォルト値:1000(単位は8Kバイトなので約8Mバイト)
    カーネルやPostgeSQLの共有バッファなど、PostgreSQLが使用するバッファ領域の大きさの推定値です。これはあくまでオプティマイザが参考にするための数字なので、正確な値は必要ありません。effective_cache_sizeの値を大きくすると、オプティマイザがインデックスを使用した問い合わせプランを選択する傾向が強くなります。
    メモリの1/4~1/2程度に設定します。

4.サーバログ関連

  1. ) postgresql.conf
    1. ) log_destination
      ログの出力をsyslogにする場合は、ログの出力先はデフォルトでは標準出力なので、これを以下のようにsyslogに変更します。
      #log_destination = 'stderr'
                          
      log_destination = 'syslog'
      
    2. ) syslog_facility
      ログの出力をsyslogにする場合で、ログをpostgreSQL専用にする場合はデフォルトから以下のようにLOCAL0以外の使用されていない値に変更します。(例ではLOCAL2)
      #syslog_facility = 'LOCAL0'
                          
      syslog_facility = 'LOCAL2'
      
  1. ) log_line_prefix
    PostgreSQLサーバが出力するサーバログの各行の先頭部分に何を付加して出力するか、という設定です。
    ログの出力をsyslogにしない場合は、タイムスタンプ(%t)とプロセスID(%p)を出力するように以下のように設定します。(syslogの場合はsyslogが自動的に出力します。)
    log_line_prefix = '%t[%p]: '
    
     
  1. ) syslog関連
    ログの出力先をpostgreSQL専用にする場合は、以下を設定します。
    1. ) ログのディレクトリ
      ログを出力するディレクトリを作成します。
      # mkdir  /var/log/postgres
      # chown postgres.  /var/log/postgres
      
    2. ) rsyslog.conf
      ログの出力先を設定します。
      # vi /etc/rsyslog.conf
      
      前述のpostgres.confのsyslog_facilityで設定した値で以下のように追加します。
           (前略)
              :
      local2.*                        /var/log/postgres/postgres.log
      
  1. ) logrotate.d
    syslogのログローテートにpostgres.logの設定を追加します。
    # vi /etc/logrotate.d/syslog
    
         (前略)
            :
    /var/log/postgres
    {
        sharedscripts
        postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        endscript
    }
    
  2. ) rsyslog再起動
    rsyslogを再起動します。
    # service rsyslog restart
    

9.設定の反映(PostgreSQL再起動)

PostgreSQLを再起動します。

# service postgresql restart
Stopping postgresql service:                               [  OK  ]
Starting postgresql service:                               [  OK  ]

再起動の必要のない変更の場合は、以下のように設定の再読み込みだけでも設定の反映ができます。

# service postgresql reload

10.データベースの削除

インストール時や練習などで一旦作成したデータベースを削除する場合はPostgreSQLを停止してディレクトリーごと削除します。

# service postgesql stop    ← PostgeSQLの停止
# chkconfig postgesql off   ← PostgeSQL自動起動の停止
# rm -rf /data/pgsql        ← データベースの削除
 
 

最終更新のRSS
Last-modified: 2014-05-05 (月) 15:02:13 (1906d)