PostgreSQL 9.4.10をCentOS 6.8へインストールして初期設定
目次
概要
今回はPostgreSQLサーバの統計情報や稼働状況を取得して分析するために、 pg_statsinfoとpg_stats_reporterをインストールすることを目的としています。 これらのツールが2017年1月22日時点でサポートしている中で最新のPostgreSQLバージョンが9.4で OSバージョンがRHEL6となっていたため、この前提環境を満たすバージョンとして PostgreSQL 9.4.10 と CentOS 6.8 を選択して インストールを行いました。 ここではPostgreSQLのインストールまでを行いますが、まだ pg_statsinfo や pg_stats_reporter に特化した設定は行いません。
構成
サーバ構成
OSバージョン
CentOS 6.8 x86_64
パッケージ一覧
- postgresql94-9.4.10-1PGDG.rhel6.x86_64.rpm
- postgresql94-libs-9.4.10-1PGDG.rhel6.x86_64.rpm
- postgresql94-server-9.4.10-1PGDG.rhel6.x86_64.rpm
環境構築
インストール
PostgreSQLサーバに必要なパッケージを3つインストールします。 下記URLよりファイルをダウンロードして /media/installer/postgresql9410/ に配置した前提でインストールを開始します。
【関連サイト】
Red Hat系Linux向けPostgreSQL 9.4.10(x86_64)ダウンロードページ
以下のコマンドを実行します。
# cd /media/installer/postgresql9410/ # ls -l 合計 8564 -rw-r--r-- 1 root root 2791456 1月 21 23:05 2017 pg_stats_reporter-3.0.1-1.el6.noarch.rpm -rw-r--r-- 1 root root 109308 1月 21 23:07 2017 pg_statsinfo-3.0.2-1.pg94.rhel6.x86_64.rpm -rw-r--r-- 1 root root 1087468 1月 22 08:25 2017 postgresql94-9.4.10-1PGDG.rhel6.x86_64.rpm -rw-r--r-- 1 root root 200564 1月 22 08:26 2017 postgresql94-libs-9.4.10-1PGDG.rhel6.x86_64.rpm -rw-r--r-- 1 root root 4571664 1月 22 08:26 2017 postgresql94-server-9.4.10-1PGDG.rhel6.x86_64.rpm # rpm -ihv postgresql94-*.rpm 警告: postgresql94-9.4.10-1PGDG.rhel6.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 442df0f8: NOKEY 準備中... ########################################### [100%] 1:postgresql94-libs ########################################### [ 33%] 2:postgresql94 ########################################### [ 67%] 3:postgresql94-server ########################################### [100%]
設定
postgresユーザのパスワード設定
PostgreSQLのパッケージをインストールすると、自動で postgres ユーザ(Linuxのユーザ)が作成されます。 作成直後はパスワードが設定されていないため、設定します。
# passwd postgres ユーザー postgres のパスワードを変更。 新しいパスワード: ←パスワードを入力(表示されません) 新しいパスワードを再入力してください: ←上と同じパスワードを入力(表示されません) passwd: 全ての認証トークンが正しく更新できました。
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 / # mkdir -m 777 data # su - postgres -bash-4.1$ cd /data/ -bash-4.1$ mkdir -m 700 pgdata1 -bash-4.1$ ls -l 合計 4 drwx------ 2 postgres postgres 4096 1月 22 08:58 2017 pgdata1
データベースクラスタ作成
前の手順で作成したデータベースクラスタ用ディレクトリ内にデータベースクラスタを作成します。 initdbコマンドを使用しますが、必ず管理者ユーザであるpostgresユーザで実行してください。 エンコーディングは UTF8、ロケールは設定しません。 PostgreSQLでロケールを選択した場合、検索性能に問題が出るらしく、 ロケールを選択しないことが推奨とされています。(9.4でも該当するかは未確認です)
-bash-4.1$ initdb --encoding=UTF8 --no-locale --pgdata=/data/pgdata1 データベースシステム内のファイルの所有者は"postgres"ユーザでした。 このユーザがサーバプロセスを所有しなければなりません。 データベースクラスタはロケール"C"で初期化されます。 デフォルトのテキスト検索設定はenglishに設定されました。 データベージのチェックサムは無効です。 ディレクトリ/data/pgdata1の権限を設定しています ... ok サブディレクトリを作成しています ... ok デフォルトのmax_connectionsを選択しています ... 100 デフォルトの shared_buffers を選択しています ... 128MB selecting dynamic shared memory implementation ... posix 設定ファイルを作成しています ... ok /data/pgdata1/base/1にtemplate1データベースを作成しています ... ok pg_authidを初期化しています ... ok 依存関係を初期化しています ... ok システムビューを作成しています ... ok システムオブジェクトの定義をロードしています ... ok 照合順序を作成しています ... ok 変換を作成しています ... ok ディレクトリを作成しています ... ok 組み込みオブジェクトに権限を設定しています ... ok 情報スキーマを作成しています ... ok PL/pgSQL サーバサイド言語をロードしています ... ok template1データベースをバキュームしています ... ok template1からtemplate0へコピーしています ... ok template1からpostgresへコピーしています ... ok データをディスクに同期しています...ok 警告: ローカル接続向けに"trust"認証が有効です。 pg_hba.confを編集する、もしくは、次回initdbを実行する時に-Aオプショ ン、または、--auth-localおよび--auth-hostを使用することで変更するこ とができます。 成功しました。以下を使用してデータベースサーバを起動することができます。 postmaster -D /data/pgdata1 または pg_ctl -D /data/pgdata1 -l logfile start -bash-4.1$
リッスンアドレスとログ出力設定の変更
ここではPostgreSQLインスタンスがリッスンするIPアドレスと ログ出力に関する設定を行います。
初期設定では localhost(127.0.0.1)のみでリッスンする設定になっています。 そのため、他のサーバからTCP/IP接続することができません。 ローカルからもリモートからもTCP/IP接続できるように、 このサーバが持つ全てのIPアドレスでリッスンする設定とします。
ログの出力先は /data/pgdata1/pg_log/ ディレクトリ内とします。 ログファイル名は postgresql-20170122.log のように ログファイルが作成された年月日を付与します。 ログファイルは7日間経過後に自動でローテーションされ、 新しいログファイルに出力が切り替わるようにします。 一定のファイルサイズに達した際にローテーションされる 機能は使用しません。あくまで日数経過後にローテーションします。 ログファイルには標準では発生したイベントの内容のみが記録されます。 ただ、これでは後から見たときに分かりづらいので、 イベントが発生した年月日時分秒とプロセスIDが出力されるように設定します。 ログメッセージの形式は以下のようになります。
【ログメッセージの出力例】
2017-01-22 09:14:10 JST [2392] LOG: shutting down
2017-01-22 09:14:10 JST [2392] LOG: database system is shut down
データベースクラスタ内の postgresql.conf ファイルを設定します。
-bash-4.1$ cd /data/pgdata1/ -bash-4.1$ 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 = 'Japan'
スーパーユーザのパスワード設定
データベースクラスタ作成時点では、スーパーユーザ(データベースユーザ) postgres のパスワードが 設定されていません。一度PostgreSQLのインスタンスを起動してパスワードを設定します。 パスワードを設定する前にクライアント認証を設定すると、ログインできなくなってしまう可能性がありますので要注意です。 パスワード設定後は再度インスタンスを停止します。 以下では postgres ユーザのパスワードを「password」に設定します。
-bash-4.1$ pg_ctl start -w サーバの起動完了を待っています....2017-01-22 09:13:23 JST [2389] LOG: redirecting log output to logging collector process 2017-01-22 09:13:23 JST [2389] HINT: Future log output will appear in directory "pg_log". 完了 サーバ起動完了 -bash-4.1$ psql -c "alter role postgres with password 'password';" ALTER ROLE -bash-4.1$ pg_ctl stop -m fast サーバ停止処理の完了を待っています....完了 サーバは停止しました
クライアント認証の設定
クライアントからPostgreSQLに接続する際の認証設定を行います。 デフォルトで設定されている内容は全てコメントアウトし、必要な設定をファイルの末尾に追加します。 設定する認証ルールは以下の通りとします。
- postgresユーザ(管理者ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 パスワードの入力を求めない。
- postgresユーザ(管理者ユーザ)以外のユーザ(一般ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 PostgreSQLユーザ名とパスワードで認証する。パスワードはMD5で暗号化して送信する。
- ユーザに関係なくTCP/IP接続(リモート接続)を行った場合は、PostgreSQLユーザ名とパスワードで認証する。 PostgreSQLが稼働するサーバと同一のネットワークセグメント(192.168.0.0/24)からの接続のみ許可する。 パスワードはMD5で暗号化して送信する。
-bash-4.1$ cd /data/pgdata1/ -bash-4.1$ vi pg_hba.conf
# "local" is for Unix domain socket connections only local all all 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 ↓変更 # IPv4 local connections: #host all all 127.0.0.1/32 trust ※コメントアウト
# IPv6 local connections: host all all ::1/128 trust ↓変更 # IPv6 local connections: #host all all ::1/128 trust ※コメントアウト
※ファイルの末尾に追加※
local all postgres peer
local all all md5
host all all 192.168.0.0/24 md5
以上で設定は終了です。
インスタンス起動
PostgreSQLのインスタンスを起動します。 起動には pg_ctl コマンドを使用します。
-bash-4.1$ pg_ctl start -w サーバの起動完了を待っています....2017-01-22 09:45:52 JST [2419] LOG: redirecting log output to logging collector process 2017-01-22 09:45:52 JST [2419] HINT: Future log output will appear in directory "pg_log". 完了 サーバ起動完了
動作テスト
プロセス起動確認
PostgreSQLのプロセスが起動していることを確認します。 今回の設定ではマスタサーバプロセス1つとワーカプロセス6つが起動します。
-bash-4.1$ ps -ef | grep postgres (前略) ↓マスタサーバプロセス(1つ) postgres 2419 1 0 09:45 pts/0 00:00:00 /usr/pgsql-9.4/bin/postgres ↓ワーカプロセス(6つ) postgres 2420 2419 0 09:45 ? 00:00:00 postgres: logger process postgres 2422 2419 0 09:45 ? 00:00:00 postgres: checkpointer process postgres 2423 2419 0 09:45 ? 00:00:00 postgres: writer process postgres 2424 2419 0 09:45 ? 00:00:00 postgres: wal writer process postgres 2425 2419 0 09:45 ? 00:00:00 postgres: autovacuum launcher process postgres 2426 2419 0 09:45 ? 00:00:00 postgres: stats collector process (後略)
ログ出力確認
設定したログファイルに起動ログが出力されていることを確認します。
-bash-4.1$ cd /data/pgdata1/pg_log/ -bash-4.1$ ls -l 合計 4 -rw------- 1 postgres postgres 998 1月 22 09:45 2017 postgresql-20170122.log -bash-4.1$ cat postgresql-20170122.log 2017-01-22 09:13:23 JST [2391] LOG: database system was shut down at 2017-01-22 09:00:20 JST 2017-01-22 09:13:23 JST [2391] LOG: MultiXact member wraparound protections are now enabled 2017-01-22 09:13:23 JST [2389] LOG: database system is ready to accept connections 2017-01-22 09:13:23 JST [2395] LOG: autovacuum launcher started 2017-01-22 09:14:10 JST [2389] LOG: received fast shutdown request 2017-01-22 09:14:10 JST [2389] LOG: aborting any active transactions 2017-01-22 09:14:10 JST [2395] LOG: autovacuum launcher shutting down 2017-01-22 09:14:10 JST [2392] LOG: shutting down 2017-01-22 09:14:10 JST [2392] LOG: database system is shut down 2017-01-22 09:45:52 JST [2421] LOG: database system was shut down at 2017-01-22 09:14:10 JST 2017-01-22 09:45:52 JST [2421] LOG: MultiXact member wraparound protections are now enabled 2017-01-22 09:45:52 JST [2419] LOG: database system is ready to accept connections 2017-01-22 09:45:52 JST [2425] LOG: autovacuum launcher started
SQL実行確認
psqlコマンドで、SQLを実行できることを確認します。
-bash-4.1$ psql psql (8.4.20, サーバ 9.4.10) 注意: psql バージョン 8.4, サーババージョン 9.4. psql の機能の中で、動作しないものがあるかもしれません。 "help" でヘルプを表示します. postgres=# select now(); now ------------------------------- 2017-01-22 09:47:20.734831+09 (1 行) postgres=# select oid, datname from pg_database; oid | datname -------+----------- 1 | template1 12998 | template0 13003 | postgres (3 行) postgres=# \q -bash-4.1$
インスタンス再起動
PostgreSQLインスタンスを再起動します。 pg_ctl コマンド1つで再起動できますが、ここでは確認のため停止・起動に分けて実行します。
-bash-4.1$ pg_ctl stop -m fast サーバ停止処理の完了を待っています....完了 サーバは停止しました -bash-4.1$ pg_ctl start -w サーバの起動完了を待っています....2017-01-22 09:48:16 JST [2439] LOG: redirecting log output to logging collector process 2017-01-22 09:48:16 JST [2439] HINT: Future log output will appear in directory "pg_log". 完了 サーバ起動完了