お問い合わせ
03-5979-2701
PowerGres
PowerGres 体験記 戻る

第4回 PowerGres をコマンドラインから使ってみよう

対象バージョン: PowerGres V9.1
本文では前半で CentOS 6.2 (x86_64 アーキテクチャ版) において PowerGres on Linux V9.1 Update 1 を、後半で Microsoft Windows 7 (64 ビット版) において PowerGres on Windows V9.1 Update1 を使用して解説しています。

PowerGres 体験記では、全3回に渡って GUI を使った使用方法を紹介し、PowerGres V9.1 の魅力をお伝えいたしました。今回は、「GUI による操作でなく、バッチプログラムから自動操作をしたい場合などい、コマンドから使用したい場合はどうすればよいのか?」という声にお答えすべく、PowerGres の起動・停止、レプリケーションの設定と操作をコマンドから行う手順を紹介します。

  1. Linux編
    1. データベースクラスタ初期化
    2. データベースサーバの起動・停止
    3. レプリケーションの構築
    4. レプリケーションの操作
  2. Windows編
    1. データベースサーバの起動・停止
    2. レプリケーションの操作
  3. まとめ

Linux編

Linux では、Windows と比べて GUI が全く使えない状態でセットアップされていることがよくあります。X Window System がインストールされていなかったり、ssh コマンドによるリモートログインによる操作を前提にしているといったケースです。そこで Linux編ではデータベースクラスタのセットアップやレプリケーションの構築を含めて、幅広く、コマンドによる操作を説明していきます。

操作例では postgres ユーザを使って PowerGres を動かすものとします。postgres ユーザは /var/lib/pgsql をホームディレクトリとしている状態であるものとします。インストール手順によっては /home/postgres である場合もありますが、適宜読み替えてください。

まず、コマンドと共有ライブラリのパスを設定しておきましょう。PowerGres を稼働させる postgres ユーザの ~/.bash_profile ファイルに追記しておきます。これで各コマンドが実行できます。また、同名コマンドやライブラリがあっても、PowerGres のものが優先されます。

export PATH=/opt/powergres91/bin:$PATH
export LD_LIBRARY_PATH=/opt/powergres91/lib:$LD_LIBRARY_PATH

~/.bash_profile の変更が反映されるのは次回ログイン時です。ここではこれらをコマンド実行してすぐ反映させます。また、PS1 を設定してプロンプトを見やすくしておきます。

-bash-3.2$ export PATH=/opt/powergres91/bin:$PATH
-bash-3.2$ export LD_LIBRARY_PATH=/opt/powergres91/lib:$LD_LIBRARY_PATH
-bash-3.2$ export PS1='[\u@\h \W]\$ '
[postgres@dbhost1 ~]$

データベースクラスタの初期化

データベースクラスタの初期化は PowerGres Manager では「サーバ登録」メニューから行いました。コマンドラインでは initdb コマンドで行います。-D オプションでデータを格納するデータベースクラスタ領域用のディレクトリを指定し、-E オプションでデフォルトの文字エンコーディングを指定します。--no-locale はロケール機能を使わないという日本語環境の Linux 上では一般的に指定されるオプションです。

[postgres@dbhost1 ~]$ initdb --no-locale -D /var/lib/pgsql/pgdata91 -E UTF8
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".

creating directory /var/lib/pgsql/pgdata91 ... ok
 :
 中略
 :
Success. You can now start the database server using:

    postgres -D /var/lib/pgsql/pgdata91
or
    pg_ctl -D /var/lib/pgsql/pgdata91 -l logfile start

[postgres@dbhost1 ~]$ ls /var/lib/pgsql/pgdata91
PG_VERSION  pg_clog        pg_multixact  pg_stat_tmp  pg_twophase
base        pg_hba.conf    pg_notify     pg_subtrans  pg_xlog
global      pg_ident.conf  pg_serial     pg_tblspc    postgresql.conf

上記のようにメッセージが続き、pgdata91 ディレクトリが作られます。

データベースサーバの起動・停止

データベースサーバを手動で起動・停止するには、pg_ctl コマンドを使います。以下の操作例では、起動して、起動できているかどうかプロセス確認をして、停止をしています。-D オプションでデータベースクラスタディレクトリを指定します。停止(pg_ctl stop)するときの -m fast オプションは、現在データベースに接続中のクライアントがいても、直ぐに停止するという意味です。

[postgres@dbhost1 ~]$ pg_ctl start -D /var/lib/pgsql/pgdata91
server starting

[postgres@dbhost1 ~]$ ps xw
  PID TTY      STAT   TIME COMMAND
 7153 pts/2    S      0:00 -bash
 7221 pts/2    S      0:00 /opt/powergres91/bin/postgres -D /var/lib/pgsql/pgdata91
 7222 ?        Ss     0:00 postgres: logger process
 7224 ?        Ss     0:00 postgres: writer process
 7225 ?        Ss     0:00 postgres: wal writer process
 7226 ?        Ss     0:00 postgres: autovacuum launcher process
 7227 ?        Ss     0:00 postgres: archiver process   last was 000000010000000
 7228 ?        Ss     0:00 postgres: stats collector process
 7244 pts/2    R+     0:00 ps x

[postgres@dbhost1 ~]$ pg_ctl stop -D /var/lib/pgsql/pgdata91 -m fast
waiting for server to shut down..... done
server stopped

起動・停止を Linux の initスクリプトで行わせることもできます。これによりマシン起動時に自動的に起動させたり、service コマンドを通してデータベースサーバを起動、停止することができます。initスクリプトを使う方法については、PowerGres on Linux マニュアル「自動起動の設定」 を参照してください。

なお、initスクリプトによる方法は、pg_ctl コマンドや、PowerGres Manager によるデータベースサーバの起動・停止操作と異なる管理方法を取っています。initスクリプトを使って停止できるのは、initスクリプトを使って起動していた場合だけであることに注意が必要です。

レプリケーションの構築

続いて、コマンド操作によるレプリケーションの構築を行っていきます。ここで説明する手順は PowerGres むけであることに注意してください。PostgreSQL 9.1.x では、postgresql.conf 設定のデフォルト値の違いや、pwg_rcpxlog コマンドが PowerGres 固有のものである等の違いにより、手順も若干異なります。

プライマリ側の手順

まずはプライマリとなる dhbost1 ホストの PowerGres に対してレプリケーションの準備をしていきます。まず、アーカイブログを格納するディレクトリを作成します。データベースサーバを通じてファイルコピーをする都合上、データベースクラスタ内に作成します。

[postgres@dbhost1 ~]$ mkdir /var/lib/pgsql/pgdata91/pwg_archive

次に postgresql.conf にアーカイブログを取得する設定とスタンバイ側になった場合に参照アクセスができるようにする設定をします。以下の項目を書き換えます。

archive_command = 'cp -p "%p" "/var/lib/pgsql/pgdata91/pwg_archive/%f"'
hot_standby = on

また、pg_hba.conf にレプリケーションのための接続を許可する以下の設定を加えます。samenet というのは同じネットワークなら接続を許可するという意味です。代わりに、10.1.2.3/32 と記述してスタンバイ側ホストの IP アドレスを直接指定しても良いです。

host    postgres    repli   samenet md5
host    replication repli   samenet md5

設定変更を反映させるため、reload をします。hot_standby 設定の反映には再起動(restart) が必要ですが、本設定項目を使うのはスタンバイ側なので、ここでは reload で充分です。また、上記で接続を許可した repli ユーザをデータベース上で作成しておきます。最後の 'pass' 部分はパスワードですので、実際には任意にパスワード文字列を与えてください。

[postgres@srapc2499 ~]$ pg_ctl reload -D /var/lib/pgdata91
[postgres@srapc2499 ~]$ psql -q
postgres=# CREATE USER repli REPLICATION SUPERUSER PASSWORD 'pass';
postgres=# \q

スタンバイ側の手順

ここまででプライマリ側の準備は完了しました。続いてスタンバイ側の手順を進めていきます。スタンバイ側ホスト dhbost2 には、既に PowerGres on Linux 9.1 がインストールされていて、しかし、まだデータベースクラスタの初期化は行われていない状態であるものとします。

まずは、pg_basebackup コマンドにて、データベースクラスタのコピーを取得します。-D オプションにて配置するディレクトリを指定します。-U で指定したレプリケーション用ユーザのパスワードを要求されますので、入力してください。

[postgres@dbhost2 ~]$ pg_basebackup -x -D /var/lib/pgsql/pgdata91 -h dbhost1 -U repli
Password:
NOTICE:  pg_stop_backup complete, all required WAL segments have been archived
[postgres@dbhost2 ~]$

こで展開されたデータベースクラスタにおける postgresql.conf と pg_hba.conf は、プライマリサーバのコピーです。スタンバイ側サーバについて何らか固有の設定が必要であれば加えてください。本例の設定では特に書き換えが必須となる項目はありません。

続いて recovery.conf ファイルを作成します。

[postgres@dbhost2 ~]$ vi /var/lib/pgsql/pgdata91/recovery.conf

次のような内容を記述します。primary_conninfo の「password=pass」部分と、restore_command の「-U "pass"」部分には実際に設定した repli ユーザのパスワードを記述してください。

standby_mode = 'on'
primary_conninfo = 'host=dbhost1 port=5432 user=repli password=pass application_name=standby'
restore_command = '/opt/powergres91/bin/pwg_rcpxlog -h dbhost1 -p 5432 -U repli -P "pass" pwg_archive %f %p'
trigger_file = '/var/lib/pgsql/pgdata91/powergres.trigger'

ここまでできましたら、スタンバイ側でデータベースサーバを起動します。これで非同期モードにてレプリケーションが行われている状態となります。

[postgres@dbhost2 ~]$ pg_ctl start -D /var/lib/pgsql/pgdata91

この後、プライマリのデータベースにデータやテーブルを追加して、スタンバイ側で反映されているか確認するのが良いでしょう。スタンバイ側に接続できなかったり、レプリケーションされていなかった場合には、/var/lib/pgsql/pgdata91/pg_log/ 以下にあるログファイルを確認してください。たいていの場合、レプリケーションできない理由が出力されています。

アーカイブログの定期削除

本設定手順でレプリケーションを構築した場合、プライマリサーバの /var/lib/pgsql/pgdata91/pwg_archive ディレクトリにアーカイブログファイルが溜まり続けます。何らか定期的に削除する仕組みが必要です。

例えば以下のようなコマンドで1日以上前のファイルを削除できます。これを cron で定期実行するスクリプトに記述する対処が考えられます。以下は、毎日 0時30分に削除する例です。

[postgres@dbhost1 ~]$ crontab -e
(…以下を記述して保存…)

PATH=/bin:/usr/bin
MAILTO=root@localhost

30 0 * * *  find /var/lib/pgsql/pgdata91/pwg_archive -mtime +0 | xargs rm -f

これは、PITR機能によるバックアップを併用しているのであれば、ベースバックアップ取得のタイミングで古いアーカイブログファイルを削除するのがよいでしょう。PowerGres の GUI から生成される PITR機能による定期ベースバックアップ取得のスクリプトでは、古い世代のアーカイブログファイルを削除する動作が含まれています。上記のような cronスクリプトを使うのは、レプリケーションをしているけれども、PITR機能のバックアップは使っていないというケースとなります。

レプリケーションの操作

レプリケーションが稼動している状態でのいくつかの操作手順について説明します。

起動・停止

レプリケーションが稼働している状態であっても、プライマリ側、スタンバイ側とも、任意の順番でいつでも停止、起動をすることができます。停止して、起動すれば、引き続きレプリケーションが再開されます。特別な考慮事項はありません。

同期モードへの切り替え

レプリケーションを同期モードに切り替えるには、プライマリサーバの postgresql.conf の synchronous_standby_names 項目にスタンバイサーバの recovery.conf の primary_conninfo 項目の application_name に設定した名前を記述します。本例では以下のようになります。

synchronous_standby_names = 'standby'

これは pg_ctl reload で反映させます。同期モードに変わったかどうかは、psql 上にて pg_stat_replication ビューから確認できます。

[postgres@dbhost1 ~]$ pg_ctl start -D /var/lib/pgsql/pgdata91
[postgres@dbhost1 ~]$ psql -q
postgres=# \x
Expanded display is on.
postgres=# SELECT * FROM pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
procpid          | 4387
usesysid         | 16384
usename          | repli
application_name | standby
client_addr      | 10.1.2.102
client_hostname  |
client_port      | 45561
backend_start    | 2013-02-24 17:25:50.317772+09
state            | streaming
sent_location    | 0/1E000260
write_location   | 0/1E000260
flush_location   | 0/1E000260
replay_location  | 0/1E000260
sync_priority    | 1
sync_state       | sync

非同期モードに戻すにはプライマリにて「synchronous_standby_names = ''」と設定を元に戻して、pg_ctl reload をします。

同期モード / 非同期モードの自動切り替え

PowerGres Manager(GUIツール)では、定期的にスタンバイサーバを監視して、スタンバイサーバに障害があった場合に同期モードを自動的に非同期モードに戻す機能を提供しています。今回の様なコマンドラインベースの構築においても、PowerGres Manager が生成するスクリプトを手動で作成し、cron に登録することで、その機能を利用できます。

始めに、プライマリサーバのデータベースクラスタディレクトリ内に以下のスクリプトファイルを作成します。
PGPASSWORD、接続ポート番号はお使いの環境にあわせて適宜変更してください。

[postgres@dbhost1 ~]$ vi /var/lib/pgsql/pgdata91/pwg_monitorstandby_01.sh
(…以下を記述して保存…)
#! /bin/sh
export PGPASSWORD="postgres"
"/opt/powergres91/bin/psql" -c "SELECT pwg_switch_standby()" -d "postgres" -h "localhost" -p "5432" -U "postgres"

作成したスクリプトファイルを以下の通り cron に登録します。
下記の cron 設定では、一分ごとにスタンバイサーバの監視する設定になっています。

[postgres@dbhost1 ~]$ crontab -e
(…以wを追記して保存…)
PATH=/bin:/usr/bin
MAILTO=root@localhost

30 0 * * *  find /var/lib/pgsql/pgdata91/pwg_archive -mtime +0 | xargs rm -f
*/1 * * * * "/var/lib/pgsql/pgdata91/pwg_monitorstandby_01.sh" > /dev/null

スタンバイをプライマリに昇格させる

スタンバイサーバではデータを更新する SQL を実行できません。プライマリサーバが何らか障害状態となり、代替にスタンバイサーバを使うには、プライマリに昇格させるという手続きが必要になります。

プライマリ昇格をするには、昇格させたいスタンバイサーバにて以下コマンドを実行します。

[postgres@dbhost2 ~]$ pg_ctl promote -D /var/lib/pgsql/pgdata91
server promoting

recovery.conf ファイルの trigger_file 項目で設定したトリガファイルを置くという方法でも昇格を指示できます。

[postgres@dbhost2 ~]$ touch /var/lib/pgsql/pgdata91/powergres.trigger

スタンバイサーバの再構築

プライマリサーバが障害を起こして残ったスタンバイサーバをプライマリに昇格させた場合も、スタンバイサーバが障害を起こした場合も、プライマリサーバが1台正常動作していて、スタンバイサーバが無いという状態となります。この状態から、スタンバイサーバがある状態にするには、「レプリケーション構築」の手順を行うことになります。

Windows編

続いては、Windows 環境における PowerGres のコマンドライン操作です。Windows 環境では、GUI が使用できず、コマンドラインのみの操作が必要とされるケースは多くありません。Windows 編では、GUI による操作を織り交ぜつつ、データベースサーバの起動・停止と、レプリケーションの操作方法のみを紹介します。

データベースクラスタの初期化とレプリケーションの構築は、GUI を用いた PowerGres V9.1 体験記の第1回第2回をご参照ください。

操作例では、 PowerGres V9.1 の管理ユーザである sraoss ユーザで行なうものとします。
また、コマンドのパスをあらかじめ設定しておく必要があります。システムのプロパティから設定するか、以下コマンドを実行します。

C:\Users\sraoss>set PATH=C:\Program Files\PowerGres91\bin;%PATH%

データベースサーバの起動・停止

データベースサーバを手動で起動・停止する場合は、Windows 付属の net コマンドを使い、PowerGres V9.1 体験記の第1回にもとづいて登録した PowerGres の Windows サービスを操作することになります。以下の操作例では、サービスを起動し、データベースサーバの起動状態を確認して、サービスを停止しています。

C:\Users\sraoss>net start powergres91
powergres91 サービスを開始します.
powergres91 サービスは正常に開始されました。


C:\Users\sraoss>tasklist /fi "imagename eq postgres.exe"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
postgres.exe                  7772 Services                   0     13,284 K
postgres.exe                  7316 Services                   0      6,688 K
postgres.exe                  5452 Services                   0      7,320 K
postgres.exe                  7424 Services                   0      7,272 K
postgres.exe                  6440 Services                   0      8,364 K
postgres.exe                  5244 Services                   0      6,672 K
postgres.exe                  9068 Services                   0      6,764 K

C:\Users\sraoss>net stop powergres91
powergres91 サービスを停止中です.
powergres91 サービスは正常に停止されました。

レプリケーションの操作

Windows におけるレプリケーション稼動時のいくつかの操作手順について説明します。

起動・停止

レプリケーション稼働時の起動・停止は Linux と同様に、プライマリ側、スタンバイ側とも、任意の順番でいつでも停止、起動をすることができます。停止して、起動すれば、引き続きレプリケーションが再開されます。特別な考慮事項はありません。

同期モードへの切り替え

レプリケーションを同期モードに切り替える方法も Linux と違いはありません。
プライマリサーバの postgresql.conf の synchronous_standby_names 項目にスタンバイサーバの recovery.conf の primary_conninfo 項目の application_name に設定した名前を以下のように記述します。

synchronous_standby_names = 'standby'

設定の変更は pg_ctl reload で反映させます。
同期モードに変わったかどうかは、psql 上にて pg_stat_replication ビューから確認できます。

C:\Users\sraoss>pg_ctl -D C:\data reload
server signaled

C:\Users\sraoss>psql -U postgres -d postgres -q
Password for user postgres:
postgres=# \x
postgres=# SELECT * FROM pg_stat_replication;
-[ RECORD 1 ]----+---------------------------
procpid          | 9456
usesysid         | 16384
usename          | repli
application_name | standby
client_addr      | 127.0.0.1
client_hostname  |
client_port      | 51323
backend_start    | 2013-04-08 13:31:53.236+09
state            | streaming
sent_location    | 0/1B007B78
write_location   | 0/1B007B78
flush_location   | 0/1B007B78
replay_location  | 0/1B007B78
sync_priority    | 1
sync_state       | sync

非同期モードに戻すにはプライマリにて「synchronous_standby_names = ''」と設定を元に戻して、pg_ctl reload をします。

同期モード / 非同期モードの自動切り替え

PowerGres Manager(GUIツール)で提供されている、同期モード / 非同期モードの自動切り替え機能を Windows のコマンドラインベースで設定するには、以下の PowerGres Manager が生成するバッチファイルを手動で作成し、タスクスケジューラにそのバッチファイルを登録します。

始めに、プライマリサーバのデータベースクラスタディレクトリ内に以下の内容のバッチファイル (pwg_monitorstandby_01.bat) を作成します。
PGPASSWORD、接続ポート番号はお使いの環境にあわせて適宜変更してください。

@echo off
setlocal
set PGPASSWORD=postgres
"C:\Program Files\PowerGres91\bin\psql" -c "SELECT pwg_switch_standby()" -d "postgres" -h "localhost" -p "5432" -U "postgres"
endlocal

作成したスクリプトファイルをタスクスケジューラに登録します。
以下の設定では、一分ごとにスタンバイサーバの監視する設定になっています。
/sc オプションでスケジュールの種類を指定します。同期モード / 非同期モードの実行頻度は分単位なので、本例では MINUTE をしています。また、/mo オプションでスケジュールの実行頻度を指定します。本例では1分おきとしています。
/tn オプションでタスクスケジューラの名前を指定します。
/tr オプションで上述のバッチファイルを指定します。

C:\Users\sraoss>schtasks /create /sc MINUTE /mo 1 /tn "PowerGres91 Monitor (powergres91)" /tr C:\data\pwg_monitorstandby_01.bat
成功: スケジュール タスク "PowerGres91 Monitor (powergres91)" は正しく作成されました。

まとめ

今回は、コマンドラインベースの PowerGres Manager の操作方法を紹介しました。
本来、PowerGres Manager は、PostgreSQL の管理・監視・運用を、コマンドライン操作に不慣れなユーザであっても GUI の管理ツールを用いて直感的に操作できるようにした製品です。
しかしそれは、コマンドラインベースの操作が不可能であるというわけではありません。PowerGres Manager で提供されている機能は、コマンドラインベースでも設定可能であることが、お分かりいただけたかと思います。