PostgreSQL 9.4.8をAWSのEC2(RHEL 7.2)へインストールして初期設定
目次
構成
想定環境
サーバ構成
OSバージョン
Red Hat Enterprise Linux 7.2 x86_64
パッケージ一覧
- postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm
- postgresql94-libs-9.4.8-1PGDG.rhel7.x86_64.rpm
- postgresql94-server-9.4.8-1PGDG.rhel7.x86_64.rpm
環境構築
インストール
AWSのEC2インスタンスには初期状態ではPostgreSQLがインストールされていません。 PostgreSQLの公式サイトから最低限必要なパッケージをwgetコマンドでダウンロードしてから、rpmコマンドでインストールします。 もしwgetコマンドがインストールされていない場合は、先にyumコマンドでインストールしてください。
$ sudo su - Last login: Mon Jul 4 17:21:32 EDT 2016 on pts/1 # cd /media/installer/ # wget http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm --2016-07-07 09:42:51-- http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-9.4.8-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|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 1087476 (1.0M) [application/x-redhat-package-manager] Saving to: ‘postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm’ 100%[==================================================================================================>] 1,087,476 2.78MB/s in 0.4s 2016-07-07 09:42:52 (2.78 MB/s) - ‘postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm’ saved [1087476/1087476] # wget http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-libs-9.4.8-1PGDG.rhel7.x86_64.rpm --2016-07-07 09:43:19-- http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-libs-9.4.8-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|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 215152 (210K) [application/x-redhat-package-manager] Saving to: ‘postgresql94-libs-9.4.8-1PGDG.rhel7.x86_64.rpm’ 100%[==================================================================================================>] 215,152 549KB/s in 0.4s 2016-07-07 09:43:19 (549 KB/s) - ‘postgresql94-libs-9.4.8-1PGDG.rhel7.x86_64.rpm’ saved [215152/215152] # wget http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-server-9.4.8-1PGDG.rhel7.x86_64.rpm --2016-07-07 09:43:41-- http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-server-9.4.8-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|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 4044904 (3.9M) [application/x-redhat-package-manager] Saving to: ‘postgresql94-server-9.4.8-1PGDG.rhel7.x86_64.rpm’ 100%[==================================================================================================>] 4,044,904 6.47MB/s in 0.6s 2016-07-07 09:43:42 (6.47 MB/s) - ‘postgresql94-server-9.4.8-1PGDG.rhel7.x86_64.rpm’ saved [4044904/4044904] # ls -l postgresql* -rw-r--r--. 1 root root 1087476 May 11 11:39 postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm -rw-r--r--. 1 root root 215152 May 11 11:39 postgresql94-libs-9.4.8-1PGDG.rhel7.x86_64.rpm -rw-r--r--. 1 root root 4044904 May 11 11:39 postgresql94-server-9.4.8-1PGDG.rhel7.x86_64.rpm # rpm -ihv ./postgresql94-*.rpm warning: ./postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 442df0f8: NOKEY Preparing... ################################# [100%] Updating / installing... 1:postgresql94-libs-9.4.8-1PGDG.rhe################################# [ 33%] 2:postgresql94-9.4.8-1PGDG.rhel7 ################################# [ 67%] 3:postgresql94-server-9.4.8-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ユーザの環境変数設定
環境変数としてデータベースクラスタと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.4/data export PGDATA ↓変更 PGDATA=/data/pgdata1 export PGDATA
※ファイルの末尾に追加※
export PATH=$PATH:/usr/pgsql-9.4/bin
データベースクラスタ用ディレクトリ($PGDATA)作成
インストールしたRPMパッケージで初期設定されているデータベースクラスタは /var/lib/pgsql/9.4/data/ となっています。 このままでも良いのですが、ディレクトリ階層が深くて分かりづらいため /data/pgdata1/ に変更します。 ディレクトリを作成して必要なパーミッションを設定します。 データベースクラスタ用のディレクトリは管理者ユーザのpostgresユーザのみが参照、更新できるようにします。
# cd / # chmod 777 data # su - postgres Last failed login: Wed Jul 6 17:47:34 EDT 2016 from 114.215.211.176 on ssh:notty There were 27 failed login attempts since the last successful login. -bash-4.2$ cd /data/ -bash-4.2$ mkdir -m 700 pgdata1
データベースクラスタ作成
前の手順で作成したデータベースクラスタ用ディレクトリ内にデータベースクラスタを作成します。 initdbコマンドを使用しますが、必ず管理者ユーザであるpostgresユーザで実行してください。 エンコーディングは UTF8、ロケールは設定しません。 PostgreSQLでロケールを選択した場合、検索性能に問題が出る(性能が低下する?)らしく、 ロケールを選択しないことが推奨とされています。
-bash-4.2$ initdb --encoding=UTF8 --no-locale --pgdata=/data/pgdata1 --auth=ident 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. creating 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 creating template1 database in /data/pgdata1/base/1 ... ok initializing pg_authid ... ok initializing dependencies ... ok creating system views ... ok loading system objects' descriptions ... ok creating collations ... ok creating conversions ... ok creating dictionaries ... ok setting privileges on built-in objects ... ok creating information schema ... ok loading PL/pgSQL server-side language ... ok vacuuming database template1 ... ok copying template1 to template0 ... ok copying template1 to postgres ... ok syncing data to disk ... ok Success. You can now start the database server using: postgres -D /data/pgdata1 or pg_ctl -D /data/pgdata1 -l logfile start -bash-4.2$
initdb コマンドの --auth=ident オプションは pg_hba.conf の認証設定初期値を決めるものです。 後続の設定手順で書き換えてしまうため指定してもあまり意味がありません。 ただ、省略した場合は認証方式が trust (認証なし)となっているため、 pg_hba.conf の設定を忘れた場合の保険の意味で指定しています。
リッスンアドレスとログ出力設定の変更
ここではPostgreSQLインスタンスがリッスンするIPアドレスと ログ出力に関する設定を行います。
初期設定では localhost(127.0.0.1)のみでリッスンする設定になっています。 そのため、他のサーバからTCP/IP接続することができません。 ローカルからもリモートからもTCP/IP接続できるように、 このサーバが持つ全てのIPアドレスでリッスンする設定とします。 本番運用ではDBに接続できるノードは絞った方が良いですが、 現時点ではインターネット経由でpgAdminIII等で接続することも考慮して 接続元の制限は入れないことにしました。
ログの出力先は /data/pgdata1/pg_log/ ディレクトリ内とします。 ログファイル名は postgresql-20160708.log のように ログファイルが作成された年月日を付与します。 ログファイルは7日間経過後に自動でローテーションされ、 新しいログファイルに出力が切り替わるようにします。 一定のファイルサイズに達した際にローテーションされる 機能は使用しません。あくまで日数経過後にローテーションします。 ログファイルには標準では発生したイベントの内容のみが記録されます。 ただ、これでは後から見たときに分かりづらいので、 イベントが発生した年月日時分秒とプロセスIDが出力されるように設定します。 ログメッセージの形式は以下のようになります。
【ログメッセージの出力例】
2016-07-07 23:44:27 JST [31478] LOG: shutting down
2016-07-07 23:44:27 JST [31478] LOG: database system is shut down
あと、利用しているAWSのデータセンタのロケーションの関係で、 タイムゾーンがアメリカ東海岸になっていたので、日本に変更します。
データベースクラスタ内の 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;
※変更なし※
#------------------------------------------------------------------------------
# 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 = '%t [%p] ' # special values:
log_timezone = 'US/Eastern'
↓変更
log_timezone = 'Japan'
スーパーユーザのパスワード設定
データベースクラスタ作成時点では、スーパーユーザ(データベースユーザ) postgres のパスワードが 設定されていません。一度PostgreSQLのインスタンスを起動してパスワードを設定します。 パスワードを設定する前にクライアント認証を設定すると、ログインできなくなってしまう可能性がありますので要注意です。 パスワード設定後は再度インスタンスを停止します。 以下では postgres ユーザのパスワードを「password」に設定します。
-bash-4.2$ pg_ctl start -w waiting for server to start....2016-07-07 23:41:31 JST [31475] LOG: redirecting log output to logging collector process 2016-07-07 23:41:31 JST [31475] 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ドメインソケット接続(ローカル接続)を行った場合は、 PostgreSQLユーザ名とパスワードで認証する。パスワードはMD5で暗号化して送信する。
- ユーザに関係なくTCP/IP接続(リモート接続)を行った場合は、PostgreSQLユーザ名とパスワードで認証する。 パスワードはMD5で暗号化して送信する。
-bash-4.2$ cd /data/pgdata1/ -bash-4.2$ vi pg_hba.conf
# "local" is for Unix domain socket connections only local all all peer ↓変更 # "local" is for Unix domain socket connections only #local all all peer ※コメントアウト
# IPv4 local connections: host all all 127.0.0.1/32 ident ↓変更 # IPv4 local connections: #host all all 127.0.0.1/32 ident ※コメントアウト
# IPv6 local connections: host all all ::1/128 ident ↓変更 # IPv6 local connections: #host all all ::1/128 ident ※コメントアウト
※ファイルの末尾に追加※
local all postgres peer
local all all md5
host all all 0.0.0.0/0 md5
以上で設定は終了です。
インスタンス起動
PostgreSQLのインスタンスを起動します。 起動には pg_ctl コマンドを使用します。
オプション | 説明 |
---|---|
start | インスタンスを起動します。 |
-D <データベースクラスタ> | データベースクラスタのディレクトリ名を指定する。省略した場合は $PGDATA 環境変数に設定されているディレクトリが使用される。 |
-w | ウェイトオプション。通常起動コマンドを実行すると、コマンドはすぐに正常終了し、起動処理はバックグラウンドで実行されます。このオプションを付けると、インスタンスの起動を待って、起動完了後にコマンドが終了します。 |
-bash-4.2$ pg_ctl start -w waiting for server to start....2016-07-07 23:50:22 JST [31518] LOG: redirecting log output to logging collector process 2016-07-07 23:50:22 JST [31518] HINT: Future log output will appear in directory "pg_log". done server started
動作テスト
プロセス起動確認
PostgreSQLのプロセスが起動していることを確認します。 今回の設定ではマスタサーバプロセス1つとワーカプロセス6つが起動します。
-bash-4.2$ ps -ef | grep postgres (前略) ↓マスタサーバプロセス(1つ) postgres 31518 1 0 10:50 pts/1 00:00:00 /usr/pgsql-9.4/bin/postgres ↓ワーカプロセス(6つ) postgres 31519 31518 0 10:50 ? 00:00:00 postgres: logger process postgres 31521 31518 0 10:50 ? 00:00:00 postgres: checkpointer process postgres 31522 31518 0 10:50 ? 00:00:00 postgres: writer process postgres 31523 31518 0 10:50 ? 00:00:00 postgres: wal writer process postgres 31524 31518 0 10:50 ? 00:00:00 postgres: autovacuum launcher process postgres 31525 31518 0 10:50 ? 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 1011 Jul 7 10:50 postgresql-20160707.log -bash-4.2$ cat postgresql-20160707.log 2016-07-07 23:41:31 JST [31477] LOG: database system was shut down at 2016-07-07 23:18:45 JST 2016-07-07 23:41:31 JST [31477] LOG: MultiXact member wraparound protections are now enabled 2016-07-07 23:41:31 JST [31475] LOG: database system is ready to accept connections 2016-07-07 23:41:31 JST [31481] LOG: autovacuum launcher started 2016-07-07 23:44:27 JST [31475] LOG: received fast shutdown request 2016-07-07 23:44:27 JST [31475] LOG: aborting any active transactions 2016-07-07 23:44:27 JST [31481] LOG: autovacuum launcher shutting down 2016-07-07 23:44:27 JST [31478] LOG: shutting down 2016-07-07 23:44:27 JST [31478] LOG: database system is shut down 2016-07-07 23:50:22 JST [31520] LOG: database system was shut down at 2016-07-07 23:44:27 JST 2016-07-07 23:50:22 JST [31520] LOG: MultiXact member wraparound protections are now enabled 2016-07-07 23:50:22 JST [31518] LOG: database system is ready to accept connections 2016-07-07 23:50:22 JST [31524] LOG: autovacuum launcher started
SQL実行確認
psqlコマンドで、SQLを実行できることを確認します。
-bash-4.2$ psql psql (9.4.8) Type "help" for help. postgres=# select now(); now ----------------------------- 2016-07-07 10:52:09.4854-04 (1 row) postgres=# select oid, datname from pg_database; oid | datname -------+----------- 1 | template1 13051 | template0 13056 | postgres (3 rows) postgres=# \q -bash-4.2$
インスタンス再起動
PostgreSQLインスタンスを再起動します。 pg_ctl コマンド1つで再起動できますが、ここでは確認のため停止・起動に分けて実行します。
-bash-4.2$ pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped
-bash-4.2$ ps -ef | grep postgres ↓PostgreSQLのプロセスが表示されないことを確認
root 31369 31159 0 10:17 pts/1 00:00:00 su - postgres
postgres 31370 31369 0 10:17 pts/1 00:00:00 -bash
postgres 31538 31370 0 10:53 pts/1 00:00:00 ps -ef
postgres 31539 31370 0 10:53 pts/1 00:00:00 grep --color=auto postgres
-bash-4.2$ pg_ctl start -w
waiting for server to start....2016-07-07 23:53:41 JST [31542] LOG: redirecting log output to logging collector process
2016-07-07 23:53:41 JST [31542] HINT: Future log output will appear in directory "pg_log".
done
server started