OSS Fan ~OSSでLinuxサーバ構築~

このエントリーをはてなブックマークに追加

PostgreSQL 9.6.5をRHEL 7.4(AWSのEC2)へインストールし、PITR可能な初期設定を行う

カテゴリ:OSSセットアップ | ソフトウェア:PostgreSQL | タグ:
最終更新日:2021/01/01 | 公開日:2017/09/07

目次

概要

 RHEL 7.4がインストールされたAWSのEC2インスタンスに、PostgreSQL 9.6をインストールします。 運用の中で、人為的な操作ミスによるデータの削除や、バッチ処理のバグによるデータ誤りなどのデータベースの論理障害が 発生することを想定し、バックアップからのPITR(Point In Time Recovery)を行える構成とします。 ただし、ディスクの故障など物理障害は今回想定から外すこととし、Linuxのディスク構成を簡略化しています。 また、SystemdでPostgreSQLの起動を制御できるよう設定します。

 WALファイルをアーカイブする場合の注意点として、アーカイブファイルを自動で削除する仕組みがありません。 ディスクの使用率が不足する前に定期的に削除する必要があります。 適切なタイミングとしては、データベースクラスタのベースバックアップを取得したタイミングで、 それ以前に生成されたアーカイブファイルが不要となりますので、 ベースバックアップの実行とアーカイブファイルの削除をセットで運用するのが良いと思います。 今回はその詳細については触れませんが、運用設計として考慮しておいてください。

 WALはWrite Ahead Loggingの略で、いわゆるデータベースのトランザクションログです。 Oracle DatabaseではREDOログと呼んでいるものと同じです。

構成

想定環境

 今回構築するPostgreSQLサーバのプロセス、メモリ、接続の構成概要は以下の通りとなります。

PostgreSQL 9.6.5構成

 ディレクトリ構成は任意ですが、今回は以下の通りとします。 ご自身の環境に読み替えて構築してください。

最新データ/data/
バックアップデータ/bkup/
データベースクラスタ/data/pgdata1/
WALファイル/data/pgdata1/pg_xlog/
アーカイブファイル/bkup/pgdata1/pg_arch/
 サーバ環境はAWS(Amazon Web Services)のEC2インスタンスを利用しました。 サーバのスペックは以下のとおりです。 構築作業時はスペックが低くても問題ないので、インスタンスタイプはt2.microを選択しています。 本番運用開始前にインスタンスタイプをアップさせる前提です。

■サーバスペック
項目内容
インスタンスタイプt2.micro
vCPU1
メモリ1GB
ディスクSSD 10GiB
リージョン日本

サーバ構成

OSバージョン

Red Hat Enterprise Linux 7.4 x86_64

パッケージ一覧

  • postgresql96-9.6.5-1PGDG.rhel7.x86_64.rpm
  • postgresql96-libs-9.6.5-1PGDG.rhel7.x86_64.rpm
  • postgresql96-server-9.6.5-1PGDG.rhel7.x86_64.rpm

環境構築

インストール

RPMパッケージのダウンロード

 PostgreSQLサーバに最低限必要なRPMパッケージを3つダウンロードします。 ダウンロードにはwgetコマンドを利用しますので、事前にyumでwgetパッケージをインストールしておいてください。 ファイルのダウンロード先は /media/installer/ ディレクトリとしています。 コマンドに都度 sudo をつけるのが面倒なので、作業は root ユーザで実行しています。

【ダウンロードサイト】
 RHEL 7系Linux向けPostgreSQL 9.6.5(x86_64)ダウンロードページ

$ sudo su -
# cd /media/
# mkdir installer
# cd installer/
# wget https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/postgresql96-9.6.5-1PGDG.rhel7.x86_64.rpm
--2017-09-03 08:56:34--  https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/postgresql96-9.6.5-1PGDG.rhel7.x86_64.rpm
Resolving yum.postgresql.org (yum.postgresql.org)... 174.143.35.196, 2001:4800:1501:1::196
Connecting to yum.postgresql.org (yum.postgresql.org)|174.143.35.196|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/postgresql96-9.6.5-1PGDG.rhel7.x86_64.rpm [following]
--2017-09-03 08:56:35--  http://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/postgresql96-9.6.5-1PGDG.rhel7.x86_64.rpm
Resolving download.postgresql.org (download.postgresql.org)... 87.238.57.227, 174.143.35.246, 204.145.124.244, ...
Connecting to download.postgresql.org (download.postgresql.org)|87.238.57.227|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1427432 (1.4M) [application/x-redhat-package-manager]
Saving to: ‘postgresql96-9.6.5-1PGDG.rhel7.x86_64.rpm’

100%[==============================================================================>] 1,427,432    690KB/s   in 2.0s

2017-09-03 08:56:38 (690 KB/s) - ‘postgresql96-9.6.5-1PGDG.rhel7.x86_64.rpm’ saved [1427432/1427432]

# wget https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/postgresql96-libs-9.6.5-1PGDG.rhel7.x86_64.rpm
--2017-09-03 08:56:47--  https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/postgresql96-libs-9.6.5-1PGDG.rhel7.x86_64.rpm
Resolving yum.postgresql.org (yum.postgresql.org)... 174.143.35.196, 2001:4800:1501:1::196
Connecting to yum.postgresql.org (yum.postgresql.org)|174.143.35.196|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/postgresql96-libs-9.6.5-1PGDG.rhel7.x86_64.rpm [following]
--2017-09-03 08:56:48--  http://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/postgresql96-libs-9.6.5-1PGDG.rhel7.x86_64.rpm
Resolving download.postgresql.org (download.postgresql.org)... 217.196.149.55, 87.238.57.227, 174.143.35.246, ...
Connecting to download.postgresql.org (download.postgresql.org)|217.196.149.55|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 319508 (312K) [application/x-redhat-package-manager]
Saving to: ‘postgresql96-libs-9.6.5-1PGDG.rhel7.x86_64.rpm’

100%[==============================================================================>] 319,508      283KB/s   in 1.1s

2017-09-03 08:56:50 (283 KB/s) - ‘postgresql96-libs-9.6.5-1PGDG.rhel7.x86_64.rpm’ saved [319508/319508]

# wget https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/postgresql96-server-9.6.5-1PGDG.rhel7.x86_64.rpm
--2017-09-03 08:57:27--  https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/postgresql96-server-9.6.5-1PGDG.rhel7.x86_64.rpm
Resolving yum.postgresql.org (yum.postgresql.org)... 174.143.35.196, 2001:4800:1501:1::196
Connecting to yum.postgresql.org (yum.postgresql.org)|174.143.35.196|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/postgresql96-server-9.6.5-1PGDG.rhel7.x86_64.rpm [following]
--2017-09-03 08:57:28--  http://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/postgresql96-server-9.6.5-1PGDG.rhel7.x86_64.rpm
Resolving download.postgresql.org (download.postgresql.org)... 204.145.124.244, 217.196.149.55, 87.238.57.227, ...
Connecting to download.postgresql.org (download.postgresql.org)|204.145.124.244|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4529248 (4.3M) [application/x-redhat-package-manager]
Saving to: ‘postgresql96-server-9.6.5-1PGDG.rhel7.x86_64.rpm’

100%[==============================================================================>] 4,529,248   2.69MB/s   in 1.6s

2017-09-03 08:57:30 (2.69 MB/s) - ‘postgresql96-server-9.6.5-1PGDG.rhel7.x86_64.rpm’ saved [4529248/4529248]

# ls -l
total 6136
-rw-r--r--. 1 root root 1427432 Aug 31 12:42 postgresql96-9.6.5-1PGDG.rhel7.x86_64.rpm
-rw-r--r--. 1 root root  319508 Aug 31 12:42 postgresql96-libs-9.6.5-1PGDG.rhel7.x86_64.rpm
-rw-r--r--. 1 root root 4529248 Aug 31 12:42 postgresql96-server-9.6.5-1PGDG.rhel7.x86_64.rpm

RPMパッケージからPostgreSQLをインストール

 ダウンロードしたRPMパッケージを使用してPostgreSQLをインストールします。 インストール時に警告メッセージが表示されますが、無視して構いません。

# rpm -ihv postgresql96-*.rpm
warning: postgresql96-9.6.5-1PGDG.rhel7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 442df0f8: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:postgresql96-libs-9.6.5-1PGDG.rhe################################# [ 33%]
   2:postgresql96-9.6.5-1PGDG.rhel7   ################################# [ 67%]
   3:postgresql96-server-9.6.5-1PGDG.r################################# [100%]

設定

postgresユーザのパスワード設定

 PostgreSQLのパッケージをインストールすると、自動で postgres という名前のLinuxユーザが作成されます。 作成直後はパスワードが設定されていないため、設定します。

# passwd postgres
Changing password for user postgres.
New password: ←パスワードを入力(表示されません)
Retype new password: ←上と同じパスワードを入力(表示されません)
passwd: all authentication tokens updated successfully.

postgresユーザの環境変数設定

 postgresユーザの環境変数としてデータベースクラスタとPostgreSQLのコマンドへのパスを設定します。

# grep postgres /etc/passwd
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash ←ホームディレクトリを確認
# cd /var/lib/pgsql/
# vi .bash_profile
ファイル名:/var/lib/pgsql/.bash_profile
※以下、該当箇所のみ変更※
PGDATA=/var/lib/pgsql/9.6/data
export PGDATA
   ↓変更
PGDATA=/data/pgdata1
export PGDATA
export PATH=$PATH:/usr/pgsql-9.6/bin

データベースクラスタ用ディレクトリ($PGDATA)作成

 インストールしたRPMパッケージで初期設定されているデータベースクラスタは /var/lib/pgsql/9.6/data/ となっています。 このままでも良いのですが、ディレクトリ階層が深くて分かりづらいため /data/pgdata1/ に変更します。 また、アーカイブファイルの格納先は /bkup/pgdata1/pg_arch/ とします。 その他、データベースクラスタのベースバックアップの取得先は /bkup/ ディレクトリとします。

 データベースクラスタのベースバックアップと最新のWALファイル、アーカイブファイルはPITRに必要なファイルなので、 冗長化を高めたディスクに保管した方が良いですが、今回は物理障害ではなく、論理障害(人為的操作ミス)からの 復旧に限定した構成としているため、データベースクラスタと同じディスク上に保存しています。

 それぞれディレクトリを作成して必要なパーミッションを設定します。 データベースクラスタ用のディレクトリはPostgreSQL管理者ユーザの postgres のみが参照、更新できるようにします。

# cd /
# chmod 777 data ←最新データ用
# mkdir -m 777 bkup ←バックアップデータ用
# su - postgres
-bash-4.2$ cd /data/
-bash-4.2$ mkdir -m 700 pgdata1 ←データベースクラスタ用
-bash-4.2$ ls -l
total 0
drwx------. 2 postgres postgres 6 Sep  3 09:07 pgdata1
-bash-4.2$ cd /bkup/
-bash-4.2$ mkdir -m 700 pgdata1
-bash-4.2$ ls -l
total 0
drwx------. 2 postgres postgres 6 Sep  3 09:08 pgdata1
-bash-4.2$ cd pgdata1/
-bash-4.2$ mkdir -m 700 pg_arch ←アーカイブファイル用
-bash-4.2$ ls -l
total 0
drwx------. 2 postgres postgres 6 Sep  3 09:08 pg_arch

データベースクラスタ作成

 前の手順で作成したデータベースクラスタ用ディレクトリ内にデータベースクラスタを作成します。 initdbコマンドを使用しますが、必ず管理者ユーザであるpostgresユーザで実行してください。 エンコーディングは UTF8、ロケールは設定しません。 PostgreSQLでロケールを選択した場合、検索性能に問題が出るらしく、 ロケールを選択しないことが推奨とされています。(9.6でも該当するかは未確認です)

-bash-4.2$ initdb --encoding=UTF8 --no-locale --pgdata=/data/pgdata1
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /data/pgdata1 ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    pg_ctl -D /data/pgdata1 -l logfile start

-bash-4.2$

PostgreSQLの設定ファイル変更

 ここではPostgreSQLインスタンスがリッスンするIPアドレスと ログ出力、WALファイルのアーカイブに関する設定を行います。

 初期設定ではPostgreSQLが localhost(127.0.0.1)のみでリッスンする設定になっています。 そのため、他のサーバからTCP/IP接続することができません。 ローカルからもリモートからもTCP/IP接続できるように、 このサーバが持つ全てのIPアドレスでリッスンする設定とします(全てと言ってもEC2のデフォルトではNICはeth0の1つしかありませんが)。

 ログの出力先は /data/pgdata1/pg_log/ ディレクトリとします。 ログファイル名は postgresql-20170903.log のように ログファイルが作成された年月日を付与します。 ログファイルは7日間経過後に自動でローテーションされ、 新しいログファイルに出力が切り替わるようにします。 ログが一定のファイルサイズに達した際にローテーションされる 機能は使用しません。あくまで日数経過後にローテーションします。 ログファイルにはデフォルトでは出力日時と発生したイベントの内容が記録されます。 もう少しトラブル調査で役立つように、 プロセスIDも出力されるように設定し、ログの出力形式も少し変更します。 ログのタイムゾーンが日本になっていない場合は、日本(Japan)に変更します。 ログメッセージの形式は以下のようになります。

【ログメッセージの出力例】
2017-09-03 18:31:31.999 JST [1248] LOG: shutting down
2017-09-03 18:31:32.180 JST [1245] LOG: database system is shut down

 WALファイルは初期設定ではアーカイブする設定になっていないため、 ログファイルが循環すると古いファイルから削除されてしまいます。 PITRではベースバックアップからの一連の更新ログが必要となるため、 WALファイルをアーカイブする設定に変更します。 また、データベースクラスタのベースバックアップ(pg_basebackup)を取得する際に レプリケーションプロトコルが利用される仕様となっているため、 一部レプリケーションに関する設定も必要となります。

 データベースクラスタ内の postgresql.conf ファイルを編集します。

-bash-4.2$ cd /data/pgdata1/
-bash-4.2$ vi postgresql.conf
ファイル名:/data/pgdata1/postgresql.conf
※以下、該当箇所を変更※
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
   ↓変更
listen_addresses = '*'                  # what IP address(es) to listen on;

#------------------------------------------------------------------------------
# WRITE AHEAD LOG
#------------------------------------------------------------------------------
#wal_level = minimal                    # minimal, replica, or logical
   ↓変更
wal_level = replica                     # minimal, replica, or logical

#archive_mode = off             # enables archiving; off, on, or always
   ↓変更
archive_mode = on               # enables archiving; off, on, or always

#archive_command = ''           # command to use to archive a logfile segment
   ↓変更
archive_command = 'cp %p /bkup/pgdata1/pg_arch/%f'      # command to use to archive a logfile segment

#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------
#max_wal_senders = 0            # max number of walsender processes
   ↓変更
max_wal_senders = 2             # max number of walsender processes

※変更なし※
#------------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#------------------------------------------------------------------------------
log_destination = 'stderr'              # Valid values are combinations of
logging_collector = on                  # Enable capturing of stderr and csvlog
log_directory = 'pg_log'                # directory where log files are written,

log_filename = 'postgresql-%a.log'      # log file name pattern,
   ↓変更
log_filename = 'postgresql-%Y%m%d.log'  # log file name pattern,

log_truncate_on_rotation = on           # If on, an existing log file with the
   ↓変更
log_truncate_on_rotation = off          # If on, an existing log file with the

log_rotation_age = 1d                   # Automatic rotation of logfiles will
   ↓変更
log_rotation_age = 7d                   # Automatic rotation of logfiles will

※変更なし※
log_rotation_size = 0                   # Automatic rotation of logfiles will

log_line_prefix = '< %m > '                     # special values:
   ↓変更
log_line_prefix = '%m [%p] '                    # special values:

log_timezone = 'UTC'
   ↓変更
log_timezone = 'Japan'

スーパーユーザのパスワード設定

 データベースクラスタ作成時点では、スーパーユーザ(データベースユーザ) postgres のパスワードが 設定されていません。一度PostgreSQLのインスタンスを起動してパスワードを設定します。 パスワードを設定する前にクライアント認証を設定すると、ログインできなくなってしまう可能性がありますので要注意です。 パスワード設定後は再度インスタンスを停止します。 以下では postgres ユーザのパスワードを「password」に設定しますが、実際にはもっと推測されづらいものを採用してください。

-bash-4.2$ pg_ctl start -w
waiting for server to start....2017-09-03 18:30:51.453 JST [1245] LOG:  redirecting log output to logging collector process
2017-09-03 18:30:51.453 JST [1245] HINT:  Future log output will appear in directory "pg_log".
 done
server started
-bash-4.2$ psql -c "alter role postgres with password 'password';"
ALTER ROLE
-bash-4.2$ pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped

クライアント認証の設定

 クライアントからPostgreSQLに接続する際の認証設定を行います。 デフォルトで設定されている内容は全てコメントアウトし、必要な設定をファイルの末尾に追加します。 設定する認証ルールは以下の通りとします。

  • postgresユーザ(管理者ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 パスワードの入力を求めない。
  • postgresユーザ(管理者ユーザ)がUNIXドメインソケット接続(ローカル接続)でレプリケーションが要求された場合、 (replicationという名のデータベースは存在せず、特殊な操作を表す予約語)パスワードの入力を求めない。
  • postgresユーザ(管理者ユーザ)以外のユーザ(一般ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 PostgreSQLユーザ名とパスワードで認証する。パスワードはMD5で暗号化して送信する。
  • ユーザに関係なくTCP/IP接続(リモート接続)を行った場合は、PostgreSQLユーザ名とパスワードで認証する。 システム開発者がpgAdmin4などを利用してインターネット経由で接続してくることを想定し、接続元IPアドレスが不定であることから、 任意のIPアドレス(0.0.0.0/0)からの接続を許可する。※個人情報などを扱う場合はおすすめできません。 パスワードはMD5で暗号化して送信する。

 PostgreSQLでデータベースクラスタのオンラインバックアップ(pg_basebackup)を実行する場合、 レプリケーションプロトコルを利用してバックアップが作成される仕様となっています。 そのため、上記2つ目のルールを記述しておく必要があることに注意してください。

-bash-4.2$ cd /data/pgdata1/
-bash-4.2$ vi pg_hba.conf
ファイル名:/data/pgdata1/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            trust
# IPv6 local connections:
host     all             all             ::1/128                 trust
   ↓変更
# "local" is for Unix domain socket connections only
#local   all             all                                     trust ※コメントアウト
# IPv4 local connections:
#host    all             all             127.0.0.1/32            trust ※コメントアウト
# IPv6 local connections:
#host    all             all             ::1/128                 trust ※コメントアウト

※ファイルの末尾に追加※
local   all             postgres                                peer
local   replication     postgres                                peer
local   all             all                                     md5
host    all             all             0.0.0.0/0               md5

Systemdの設定

 Systemdを利用してPostgreSQLの起動を管理する設定を行います。 PostgreSQL用のサービスユニットファイルをコピーして編集します。 変更するのは PGDATA の環境変数のみで構いません。

-bash-4.2$ exit
logout
# cp -piv /lib/systemd/system/postgresql-9.6.service /etc/systemd/system/postgresql-9.6.service
‘/lib/systemd/system/postgresql-9.6.service’ -> ‘/etc/systemd/system/postgresql-9.6.service’
# cd /etc/systemd/system/
# ls -l
total 8
drwxr-xr-x. 2 root root   31 Jul 12 01:02 basic.target.wants
lrwxrwxrwx. 1 root root   46 Jul 12 01:00 dbus-org.freedesktop.NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service
lrwxrwxrwx. 1 root root   57 Jul 12 01:00 dbus-org.freedesktop.nm-dispatcher.service -> /usr/lib/systemd/system/NetworkManager-dispatcher.service
lrwxrwxrwx. 1 root root   37 Jul 12 01:07 default.target -> /lib/systemd/system/multi-user.target
drwxr-xr-x. 2 root root   87 Jul 12 01:00 default.target.wants
drwxr-xr-x. 2 root root   38 Jul 12 01:02 dev-virtio\x2dports-org.qemu.guest_agent.0.device.wants
drwxr-xr-x. 2 root root   32 Jul 12 01:00 getty.target.wants
drwxr-xr-x. 2 root root 4096 Jul 12 01:08 multi-user.target.wants
-rw-r--r--. 1 root root 1558 Aug 31 21:36 postgresql-9.6.service
drwxr-xr-x. 2 root root   44 Jul 12 01:00 system-update.target.wants
# vi postgresql-9.6.service
ファイル名:/etc/systemd/system/postgresql-9.6.service
※以下、該当箇所のみ変更※
# Location of database directory
Environment=PGDATA=/var/lib/pgsql/9.6/data/
   ↓変更
# Location of database directory
Environment=PGDATA=/data/pgdata1/

SystemdでPostgeSQLの状態確認

 SystemdでPostgreSQLのサービスユニットが認識されていることを確認します。 初期状態ではPostgreSQLは停止状態で、自動起動も無効になっています。 コミュニティ版のPostgreSQLをインストールした場合、 サービスユニット名は postgresql-9.6.service となっています。

# systemctl status postgresql-9.6.service
● postgresql-9.6.service - PostgreSQL 9.6 database server
   Loaded: loaded (/etc/systemd/system/postgresql-9.6.service; disabled; vendor preset: disabled) ←自動起動無効
   Active: inactive (dead) ←停止状態
#

SystemdでPostgreSQLの起動

 SystemdでPostgreSQLを起動できることを確認します。

# systemctl start postgresql-9.6.service
# systemctl status postgresql-9.6.service
● postgresql-9.6.service - PostgreSQL 9.6 database server
   Loaded: loaded (/etc/systemd/system/postgresql-9.6.service; disabled; vendor preset: disabled) ←自動起動無効
   Active: active (running) since Sun 2017-09-03 22:54:31 JST; 12s ago ←起動状態
  Process: 9221 ExecStartPre=/usr/pgsql-9.6/bin/postgresql96-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 9226 (postmaster)
   CGroup: /system.slice/postgresql-9.6.service
           tq9226 /usr/pgsql-9.6/bin/postmaster -D /data/pgdata1/
           tq9229 postgres: logger process
           tq9231 postgres: checkpointer process
           tq9232 postgres: writer process
           tq9233 postgres: wal writer process
           tq9234 postgres: autovacuum launcher process
           tq9235 postgres: archiver process
           mq9236 postgres: stats collector process

Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal systemd[1]: Starting PostgreSQL 9.6 database server...
Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal postmaster[9226]: 2017-09-03 22:54:31.917 JST [9226...s
Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal postmaster[9226]: 2017-09-03 22:54:31.917 JST [9226....
Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal systemd[1]: Started PostgreSQL 9.6 database server.
Hint: Some lines were ellipsized, use -l to show in full.

SystemdでPostgreSQLを自動起動に設定

 SystemdでPostgreSQLを自動起動に設定します。

# systemctl enable postgresql-9.6.service
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-9.6.service to /etc/systemd/system/postgresql-9.6.service.
# systemctl status postgresql-9.6.service
● postgresql-9.6.service - PostgreSQL 9.6 database server
   Loaded: loaded (/etc/systemd/system/postgresql-9.6.service; enabled; vendor preset: disabled) ←自動起動有効
   Active: active (running) since Sun 2017-09-03 22:54:31 JST; 58s ago ←起動状態
 Main PID: 9226 (postmaster)
   CGroup: /system.slice/postgresql-9.6.service
           tq9226 /usr/pgsql-9.6/bin/postmaster -D /data/pgdata1/
           tq9229 postgres: logger process
           tq9231 postgres: checkpointer process
           tq9232 postgres: writer process
           tq9233 postgres: wal writer process
           tq9234 postgres: autovacuum launcher process
           tq9235 postgres: archiver process
           mq9236 postgres: stats collector process

Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal systemd[1]: Starting PostgreSQL 9.6 database server...
Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal postmaster[9226]: 2017-09-03 22:54:31.917 JST [9226...s
Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal postmaster[9226]: 2017-09-03 22:54:31.917 JST [9226....
Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal systemd[1]: Started PostgreSQL 9.6 database server.
Hint: Some lines were ellipsized, use -l to show in full.

SystemdでPostgreSQLを停止

 SystemdでPostgreSQLを停止できることを確認します。

# systemctl stop postgresql-9.6.service
# systemctl status postgresql-9.6.service
● postgresql-9.6.service - PostgreSQL 9.6 database server
   Loaded: loaded (/etc/systemd/system/postgresql-9.6.service; enabled; vendor preset: disabled) ←自動起動有効
   Active: inactive (dead) since Sun 2017-09-03 23:20:17 JST; 6s ago ←停止状態
 Main PID: 9226 (code=exited, status=0/SUCCESS)

Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal systemd[1]: Starting PostgreSQL 9.6 database server...
Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal postmaster[9226]: 2017-09-03 22:54:31.917 JST [9226...s
Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal postmaster[9226]: 2017-09-03 22:54:31.917 JST [9226....
Sep 03 22:54:31 ip-172-31-25-154.ap-northeast-1.compute.internal systemd[1]: Started PostgreSQL 9.6 database server.
Sep 03 23:20:17 ip-172-31-25-154.ap-northeast-1.compute.internal systemd[1]: Stopping PostgreSQL 9.6 database server...
Sep 03 23:20:17 ip-172-31-25-154.ap-northeast-1.compute.internal systemd[1]: Stopped PostgreSQL 9.6 database server.
Hint: Some lines were ellipsized, use -l to show in full.

動作テスト

インスタンス起動

 PostgreSQLのインスタンスを起動します。 起動には pg_ctl コマンドを使用します。

# su - postgres
-bash-4.2$ pg_ctl start -w
waiting for server to start....2017-09-03 18:33:52.730 JST [1262] LOG:  redirecting log output to logging collector process
2017-09-03 18:33:52.730 JST [1262] HINT:  Future log output will appear in directory "pg_log".
 done
server started

プロセス起動確認

 PostgreSQLのプロセスが起動していることを確認します。 今回の設定ではマスタサーバプロセス1つとワーカプロセス7つが起動します。

-bash-4.2$ ps -ef | grep postgres
(前略)
                                                ↓マスタサーバプロセス(1つ)
postgres  1262     1  0 09:33 pts/0    00:00:00 /usr/pgsql-9.6/bin/postgres
                                                ↓ワーカプロセス(7つ)
postgres  1263  1262  0 09:33 ?        00:00:00 postgres: logger process
postgres  1265  1262  0 09:33 ?        00:00:00 postgres: checkpointer process
postgres  1266  1262  0 09:33 ?        00:00:00 postgres: writer process
postgres  1267  1262  0 09:33 ?        00:00:00 postgres: wal writer process
postgres  1268  1262  0 09:33 ?        00:00:00 postgres: autovacuum launcher process
postgres  1269  1262  0 09:33 ?        00:00:00 postgres: archiver process
postgres  1270  1262  0 09:33 ?        00:00:00 postgres: stats collector process
(後略)

ログ出力確認

 設定したログファイルに起動ログが出力されていることを確認します。

-bash-4.2$ cd /data/pgdata1/pg_log/
-bash-4.2$ ls -l
total 4
-rw-------. 1 postgres postgres 1050 Sep  3 09:33 postgresql-20170903.log
-bash-4.2$ cat postgresql-20170903.log
2017-09-03 18:30:51.455 JST [1247] LOG:  database system was shut down at 2017-09-03 18:09:17 JST
2017-09-03 18:30:51.456 JST [1247] LOG:  MultiXact member wraparound protections are now enabled
2017-09-03 18:30:51.460 JST [1245] LOG:  database system is ready to accept connections
2017-09-03 18:30:51.461 JST [1251] LOG:  autovacuum launcher started
2017-09-03 18:31:31.996 JST [1245] LOG:  received fast shutdown request
2017-09-03 18:31:31.996 JST [1245] LOG:  aborting any active transactions
2017-09-03 18:31:31.997 JST [1251] LOG:  autovacuum launcher shutting down
2017-09-03 18:31:31.999 JST [1248] LOG:  shutting down
2017-09-03 18:31:32.180 JST [1245] LOG:  database system is shut down
2017-09-03 18:33:52.731 JST [1264] LOG:  database system was shut down at 2017-09-03 18:31:32 JST
2017-09-03 18:33:52.749 JST [1264] LOG:  MultiXact member wraparound protections are now enabled
2017-09-03 18:33:52.751 JST [1262] LOG:  database system is ready to accept connections
2017-09-03 18:33:52.753 JST [1268] LOG:  autovacuum launcher started

SQL実行確認

 psqlコマンドで、SQLを実行できることを確認します。

-bash-4.2$ psql
psql (9.6.5)
Type "help" for help.

postgres=# select now();
              now
-------------------------------
 2017-09-03 09:34:39.775579+00
(1 row)

postgres=# select oid, datname from pg_database;
  oid  |  datname
-------+-----------
 13323 | postgres
     1 | template1
 13322 | template0
(3 rows)

postgres-# \q
-bash-4.2$

インスタンス停止

 PostgreSQLインスタンスを停止します。 停止には pg_ctl コマンドを使用します。

-bash-4.2$ pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped

アーカイブファイル確認

 PostgreSQLのインストール直後はアーカイブファイルは存在しませんが、 上記動作確認を行っている中で自然とWALファイルが循環し、 アーカイブされるため、最後にアーカイブファイルが作成されていることを確認します。

-bash-4.2$ cd /bkup/pgdata1/pg_arch/
-bash-4.2$ ls -l
total 32768
-rw-------. 1 postgres postgres 16777216 Sep  3 09:31 000000010000000000000001
-rw-------. 1 postgres postgres 16777216 Sep  3 09:35 000000010000000000000002