PostgreSQL 9.6.5をRHEL 7.4(AWSのEC2)へインストールし、PITR可能な初期設定を行う
目次
概要
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サーバのプロセス、メモリ、接続の構成概要は以下の通りとなります。
ディレクトリ構成は任意ですが、今回は以下の通りとします。 ご自身の環境に読み替えて構築してください。
最新データ | /data/ |
---|---|
バックアップデータ | /bkup/ |
データベースクラスタ | /data/pgdata1/ |
WALファイル | /data/pgdata1/pg_xlog/ |
アーカイブファイル | /bkup/pgdata1/pg_arch/ |
項目 | 内容 |
---|---|
インスタンスタイプ | t2.micro |
vCPU | 1 |
メモリ | 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
※以下、該当箇所のみ変更※ 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
※以下、該当箇所を変更※ #------------------------------------------------------------------------------ # 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
※以下、該当箇所を変更※ # "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
※以下、該当箇所のみ変更※ # 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