PostgresForest 4.0 管理者ガイド

目次

1   本ドキュメントについて

本ドキュメントは、PostgresForestデータベース環境のインストール、セット アップおよび運用管理を行うデータベース管理者(DBA) を対象としています。

本ドキュメントでは、読者がPostgreSQLの管理に関する一般的な知識を持って いることを前提としています。そのため、PostgreSQLに関連する詳細な解説を 省いている場合があります。

PostgreSQLについての技術情報は、 PostgreSQLオフィシャルマニュアル (http://www.postgresql.jp/document/pg815doc/index.html) 等を参照してく ださい。

2   PostgresForestの概要

PostgresForestは、PostgreSQLを最大限に利用するエンタープライズシステム で必要な機能を実現するオープンソースのミドルウェアです。

2.1   PostgresForestの提供する機能

2.1.1   高可用性

PostgresForestは、データベースを複数のサーバ上に冗長化して配置すること を可能にします(レプリケーション機能)。障害発生時には、該当サーバを自 動的に切り離すことで、システムの障害とサービスの停止を分離し、高い可用 性を実現します。

2.1.2   負荷分散

PostgresForestでは、データベースへの問い合わせ処理を複数のサーバに振り 分けることを可能にします(負荷分散機能)。また、データベースへの問い合 わせ処理量の増加に応じてサーバを追加することによって、システム全体の処 理能力の向上を容易に実現することができます(スケールアウト)。

2.1.3   並列処理

PostgresForestでは、複数のサーバにデータを分割して配置し、これらの分割 したデータに対して検索や集計処理などを並列に行うことによって、データベー スへの問い合わせ処理時間を短縮します。システムの状況に応じてサーバを追 加することで、システム全体の性能を大幅に向上させることができます。

2.1.4   オンラインリカバリ

障害発生後の縮退運転状態から、サービスを停止せずに正常状態に復旧させる ことができます。

2.2   PostgresForestデータベース環境概要

2.2.1   PostgresForestデータベース環境を構成する要素

PostgresForestのシステムは、大きく以下の3つのコンポーネントから構成されています。

  • PostgresForestデータベース環境において実際のデータベースを保持する「PostgreSQLインスタンス」
  • PostgresForestデータベース環境のメタ情報を保持する「グローバルシステムカタログ(GSC)」
  • PostgresForestデータベース環境への一元的なアクセスを可能にするJDBCドライバ「仮想化モジュール」
  • PostgresForestデータベース環境を構築・運用管理するツール「環境構築ツール」

また、上記以外に、

  • PostgresForestデータベースに対する対話的なデータ操作を実現するインターフェースツール「Jpsql」
  • PostgresForestデータベースの縮退状態からサービスを継続したまま復旧する「リカバリツール」

も提供されています。

本ドキュメントでは、これらのコンポーネントによって構成されている環境を 総称して「PostgresForestデータベース環境」と呼びます。

2.2.2   PostgreSQLインスタンス

PostgresForestデータベース環境は、複数のPostgreSQLインスタンスを統合し て単一の仮想的なデータベースとして動作させます。そのため、 PostgresForestデータベース環境を構成する、個々のPostgreSQLインスタンス が必要となります。

このPostgreSQLインスタンスを複数のサーバに配置することにって、 PostgresForestデータベース環境の可用性の向上や負荷分散、並列処理などを 実現することが可能になります。

2.2.3   グローバルシステムカタログ(GSC)

「グローバルシステムカタログ(GSC)」は、PostgresForest環境において、 PostgresForestの機能を実現するための各PostgreSQLインスタンスやデータベース、テーブルなど についてのメタ情報を保持するデータベースです。

後述する仮想化モジュールや環境構築ツールは、このGSCの情報を元に分散化 されたPostgresForestデータベース環境における動作を決定します。

2.2.4   仮想化モジュール

仮想化モジュールは、分散化されたデータベースに対して問い合わせ処理を行 う、PostgresForestの中心となるモジュールです。

仮想化モジュールは、JDBC準拠のAPIを提供するライブラリ(JARファイル)と して提供されており、通常のJDBCドライバと置き換えるだけで、既存のJavaア プリケーション資産を容易に移行することができます(ただし、ドライバのク ラス名は org.postgresql.Driver から org.postgresforest.Driver へと変更になります)。

2.2.5   環境構築ツール

PostgresForestデータベース環境を構築・保守するためのツールです。

DBAは、環境構築ツールのプロンプトからコマンドを対話的に入力することで、 サーバの追加、データベースの作成、テーブルの作成などの管理作業を行うこ とができます。

2.2.6   Jpsql

Jsqlは、PostgresForestデータベースのテーブルデータに対してアクセス (SELECT/INSERT/UPDATE/DELETE)を行う際に使用します。

Jpsqlのプロンプトにユーザーが対話的にSQL文を入力する、あるいはSQLを記 述した外部のファイルから一括して読み込むすることで、SQL文を実行するこ とができます。

なお、JpsqlではDDL文の実行はサポートされていません。

2.2.7   リカバリツール

PostgresForestデータベース環境において障害が発生した場合の、縮退状態から通常状態に 復旧させるためのコマンドラインのツールです。仮想化モジュールの動作と連 係しながらサービスを停止することなく復旧することを実現します。

3   PostgresForestのインストールとセットアップ

ここでは前節で準備した環境に、 PostgresForestをインストールする手順を説明します。 このインストールおよびセットアップ作業は、 PostgreSQLインスタンスを動作させるすべてのサーバ上で、それぞれ行う必要があります。

3.1   必要なソフトウェアおよび動作環境

PostgresForestは、PostgresSQLが動作するLinux環境と、Javaの実行環境を前 提としています。

動作確認は以下の環境で行われています。

OS:RedHat Enterprise Linux 3, 4
Java:Sun J2SDK 1.4.2, 1.5.0
PostgreSQL:PostgreSQL 8.1

必要なソフトウェアは、以下の場所などから入手することができます。

なお、OS、j2sdkおよびPostgreSQLは既にインストールされているものとして、 以降の解説を行います。

3.2   ユーザの作成

PostgresForest環境を管理するためのユーザ(OSユーザ)を新しく作成します。 ここでは例としてユーザ名を forest とします。:

$ su -
# adduser forest
# passwd forest
# su - forest

ユーザを作成したら、 作成したユーザとしてログインし、 ホームディレクトリ下などの適当な場所に パッケージのアーカイブを展開してください。

3.3   設定ファイルの編集

パッケージのアーカイブを展開すると、 いちばん上のフォルダには env.conf というファイルが入っていて、 以下のような環境変数の設定が記述されています。:

DESTDIR=/usr/local/forest401

JAVA_HOME=/usr/java/jdk1.5.0_09

PGHOME=/usr/local/pgsql
PGUSER=forest
PGPORT=5432
PGDATA=/home/forest/data

export DESTDIR PGHOME PGUSER PGPORT PGDATA JAVA_HOME

インストールを実行する前に、 このファイルを環境に合わせて適切な内容に編集してください。 変数はそれぞれ以下のような設定を表しています。

DESTDIR:PostgresForestをインストールする先のディレクトリ名を指定します。 ディレクトリはインストーラによって作成されるため、 事前に作成する必要はありません。
JAVA_HOME:Javaの実行環境の場所を指定します。
PGHOME:PostgresForestで使用するデータベースクラスタの ディレクトリを指定します。
PGUSER:PostgresForestで利用するPostgreSQLのユーザ名を指定します。 インストール時にデータベースを作成するため、 あらかじめ権限を設定しておく必要があります。
PGPORT:インストール時に作成するデータベースのポート番号を指定します。 この設定はインストール時に作成される、 ${DESTDIR}/bin/forest_ctl という起動スクリプトの中に記述されます。
PGDATA:PostgreSQLインスタンスで使用するデータベースクラスタの場所を指定します。 PostgresForestのインストールユーザがこのディレクトリを作成できるよう、 事前に親ディレクトリの権限を設定しておく必要があります。 既存のディレクトリが存在すると、 forest_initdb コマンド(後述)で エラーとなります。

3.4   インストール

インストールを行うには、 パッケージに含まれる以下のスクリプトを順に実行します。

build.sh:PL/Java のビルドとPostgreSQLインスタンス起動用のシェルスクリプトの生成を行います。
install.sh:インストール先ディレクトリの作成とファイルのコピーを行います。

build.sh は一般ユーザで、 install.sh は rootユーザで行う必要があることに注意してください。:

[forest@st13 PostgresForest-4.0.1]$ sh ./build.sh
PostgreSQL version: 8.1
Applying lock-timeout support patch to pl/java.
patching file src/C/pljava/Backend.c
(...略...)
ln -s libforest_recovery.so.0.0 libforest_recovery.so.0
rm -f libforest_recovery.so
ln -s libforest_recovery.so.0.0 libforest_recovery.so
[forest@st13 PostgresForest-4.0.1]$ su
Password:
[root@st13 PostgresForest-4.0.1]# sh ./install.sh
PostgreSQL version: 8.1
Creating  /usr/local/forest401 /usr/local/forest401/bin /usr/local/forest401/lib
 /usr/local/forest401/share /usr/local/forest401/src done.
===============================================
====== All files installed successfully. ======
===============================================
[root@st13 PostgresForest-4.0.1]# exit
[forest@st13 PostgresForest-4.0.1]$

「All files installed successfully.」と表示されたらインストールは完了 です。binディレクトリに以下のコマンド類がインストールされていることを 確認してください。:

[forest@st13 PostgresForest-4.0.1]$ ls -l /usr/local/forest401/bin
total 28
-rw-r--r--  1 root root 1192 Jan 31 11:29 common.conf
-rw-r--r--  1 root root  704 Jan 31 11:29 env.conf
-rwxr-xr-x  1 root root  342 Jan 31 11:29 forestadm
-rwxr-xr-x  1 root root  466 Jan 31 11:29 forest_ctl
-rwxr-xr-x  1 root root 2984 Jan 31 11:29 forest_initdb
-rwxr-xr-x  1 root root  267 Jan 31 11:29 ForestRecovery.sh
-rwxr-xr-x  1 root root 1944 Jan 31 11:29 Jpsql.sh
[forest@st13 PostgresForest-4.0.1]$

3.5   データベースクラスタのセットアップ

インストールが完了したら、forest_initdbコマンドを用いてデータベースク ラスタのセットアップを行います。

データベースクラスタのセットアップでは、PostgreSQLのデータベースクラス タの作成を行い、PostgresForestで使用するテンプレートデータベースの作成 を行います。:

[forest@st13 PostgresForest-4.0.1]$ /usr/local/forest401/bin/forest_initdb
The files belonging to this database system will be owned by user "forest".
This user must also own the server process.
(...略...)
CREATE FUNCTION
CREATE FUNCTION
======================================================
====== PostgresForest initialized successfully. ======
======================================================
waiting for postmaster to shut down....LOG:  received smart shutdown request
LOG:  shutting down
LOG:  database system is shut down
 done
postmaster stopped
[forest@st13 PostgresForest-4.0.1]$

「PostgresForest initialized successfully.」と表示されたら、データベー スクラスタのセットアップは完了です。

3.6   アクセス制御の設定

PostgresForestを利用するためには、環境構築ツールや仮想化モジュール(を 利用するホスト)からPostgreSQLにTCPソケットで接続できるようになっている 必要があります。

まず、 postgresql.conf の listen_address のパラメータを設定します。:

listen_addresses = '*'

postgresql.conf の詳細については、「 PostgreSQL 8.1.5 サーバの構成 」を参照してください。

次に、 pg_hba.conf でホストのアクセス制御の設定をおこないます。:

host    all         all         172.19.188.0/24      password

上記の設定を行うと、「172.19.188.0/24」ネットワークから設定した PostgreSQLインスタンスへのアクセスを、パスワード認証で許可することがで きるようになります。

pg_hba.conf の詳細については、「 PostgreSQL 8.1.5 クライアント認証 」 の項目を参照してください。

4   PostgreSQLインスタンスの起動と終了

4.1   PostgreSQLインスタンスの起動方法

PostgreSQLインスタンスの起動と停止には、 forest_ctl コマンドを使用します。 forest_ctl コマンドで指定できるオプションについては、 forest_ctlコマンド を参照してください。

起動する場合の pg_ctl と同様に、 -D オプションでデータディレクトリを指定し、 start オプションで起動します。:

[forest@st13 PostgresForest-4.0.1]$ forest_ctl -w -D /home/forest/data start
waiting for postmaster to start....  done
postmaster started
[forest@st13 PostgresForest-4.0.1]$

4.2   PostgreSQLインスタンスの停止方法

PostgreSQLインスタンスの停止を行う際には、 forest_ctl のオプションに stop を与えます。:

[forest@st13 PostgresForest-4.0.1]$ forest_ctl -w -D /home/forest/data stop
waiting for postmaster to shut down.... done
postmaster stopped
[forest@st13 PostgresForest-4.0.1]$

5   環境構築ツールの起動と終了

5.1   GSCの作成

環境構築ツールを使用するには、まず最初にPostgresForestデータベース環境に 一つ以上のGSC を作成する必要があります。

環境構築ツールで -i オプションを指定すると、指定したサーバ上にGSC の作成を行うことができます。

以下は、サーバ「172.19.188.33」上に「gsc」というGSC名で初期作成を行っ ている例です。:

$ forestadm -h 172.19.188.33 -p 5432 -g gsc -U forest -W PASSWORD -i

指定できるコマンドラインオプションの詳細については、 forestadmコマンド を参照してください。

5.2   環境構築ツールの起動

GSC作成後、 forestadm コマンドを実行すると、環境構築ツールが起動し ます。:

$ forestadm -h 172.19.188.33 -p 5432 -g gsc -U forest -W PASSWORD
Welcome to PostgresForest Command Line Tool.
Connecting to Database GSC = 172.19.188.33:5432/gsc

[gsc]$

環境構築ツールを起動すると、 [gsc]$ プロンプトが表示されます ( gsc の部分はGSC名によって変わります)。管理者は、このプロンプト に対してコマンドを発行することで、PostgresForest環境の管理を行います。

5.3   環境構築ツールで使用するコマンド

環境構築ツールでは、以下のコマンドを使用することができます。各コマンド の詳細については、「環境構築ツールリファレンス」を参照してください。

  • データベース操作関係
  • create db
  • drop db
  • show db
  • create dbinstance
  • drop dbinstance
  • open db
  • close db
  • サーバの登録・削除関連
  • create instance
  • drop instance
  • set instance
  • show instance
  • 障害ログ関連
  • show brokenlog
  • clear brokenlog
  • GSC関連
  • create gsc
  • drop gsc
  • show gsc
  • check gsc
  • コンフィギュレーション関連
  • create config
  • drop config
  • set config
  • replicate config
  • show config
  • テーブル操作関連
  • show table
  • part table
  • part table2
  • unpart table
  • set priority
  • show priority
  • パーティション関数関連
  • create hash
  • drop hash
  • show hash

環境構築ツールで help <コマンド> を実行すると、 それぞれのコマンドおよびオプションの書式が表示されます。:

[gsc]$ help create instance;

<インスタンス作成>
グローバルシステムカタログ上にインスタンスを登録します。
書式:  create instance <hostname> <port> ;
                hostname: ホスト名、IPアドレス
                port: ポート番号

5.4   環境構築ツールの終了

環境構築ツールのコマンドプロンプトで、 \q コマンドを入力することで 環境構築ツールを終了することができます。:

[gsc]$ \q

6   PostgreSQLインスタンスの追加と削除

PostgresForest環境を管理するDBAの重要なタスクに「インスタンスの 追加」および「インスタンスの削除」があります。

既存のデータベースがあるかどうかによって若干手順が変わってきますが、こ れらの作業はPostgresForestデータベースへの更新処理が停止している状態で 行う必要があります。

6.1   インスタンス情報の表示

PostgresForestデータベース環境に登録されているインスタンスの情報を表示するには show instance コマンドを使用します。:

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中
        1 | 172.19.188.34 | 5432 | 稼動中

[gsc]$ show db;

6.2   インスタンスの追加

6.2.1   まだデータベースを作成していない場合

まだ作成されたデータベースが無く、新規にPostgresForestデータベース環境を構築してい る場合には、 create instance コマンドを用いてインスタンスの 追加を行います。:

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中


[gsc]$ create instance 172.19.188.34 5432;
インスタンス:172.19.188.34:5432を作成しました。

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中
        1 | 172.19.188.34 | 5432 | 稼動中


[gsc]$

6.2.2   既存のデータベースにインスタンスを追加する場合

既存のデータベースにインスタンスを追加する場合には、上記の手順に加えてデータ の移行も行う必要があります。

データの移行手順は、

  1. 追加したインスタンスをデータベースに参加させる(環境構築ツールの create dbinstance コマンド)
  2. 追加したインスタンスにデータベースを作成(PostgreSQLの createdb コマンド)
  3. スキーマおよびデータの移行(PostgreSQLの pg_dump / psql コマンド)
  4. GSCおよびデータベースの整合性チェック(環境構築ツールの check gsc コマンド)

となります。

以下は、1台構成のPostgresForest環境のデータベースにインスタンスを追加する際の例です。

まず、現在のインスタンス、データベース、テーブルの状態を確認します。:

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中


[gsc]$ show db;
データベース一覧
 DBNAME | SERVERID |     HOST      | PORT
------------------------------------------
 testdb |        0 | 172.19.188.33 | 5432

[gsc]$ open db testdb;
データベース:testdbをオープンしました。

[testdb]> show table;
テーブル一覧
 TABLENAME | TABLETYPE | PARTITION_FUNC | STATUS
-------------------------------------------------
 t1        | 多重化    |                | 稼動中


[testdb]> close db;
データベース:testdbをクローズしました。

次に、新しいインスタンスを登録し、結果を確認します。:

[gsc]$ create instance 172.19.188.34 5432;
インスタンス:172.19.188.34:5432を作成しました。

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中
        1 | 172.19.188.34 | 5432 | 稼動中

この段階では、追加されたインスタンスにはまだ testdb データベースは作成されていません。:

[gsc]$ show db;
データベース一覧
 DBNAME | SERVERID |     HOST      | PORT
------------------------------------------
 testdb |        0 | 172.19.188.33 | 5432

追加したインスタンス(サーバID:1)を create dbinstance コマンドを使って testdb データベースに参加させます。:

[gsc]$ create dbinstance testdb 1;
データベースインスタンス:testdbを、サーバID:1に作成しました。

この段階で show db コマンドを実行すると、追加したインスタンスが登録され ていることが分かりますが、この段階ではインスタンスの情報がGSCに登録されただ けであり、実際のデータは移行されていないので、 check gsc コマンド を実行するとエラーとなります。:

[gsc]$ show db;
データベース一覧
 DBNAME | SERVERID |     HOST      | PORT
------------------------------------------
 testdb |        0 | 172.19.188.33 | 5432
 testdb |        1 | 172.19.188.34 | 5432

[gsc]$ check gsc;
2007-02-01 17:14:16.342 ERROR: Instance[1] 172.19.188.34:5432: org.postgresql.util.PSQLException: FATAL: database "testdb" does not exist
2007-02-01 17:14:16.357 ERROR: org.postgresql.util.PSQLException: FATAL: database "testdb" does not exist
2007-02-01 17:14:16.358 ERROR: Database `testdb' is under inconsistent.
2007-02-01 17:14:16.358 ERROR: [Error] グローバルシステムカタログの整合性チェック中にエラーが発生しました。
グローバルシステムカタログの整合性をチェックしました。

[gsc]$

ここで、実際のデータの移行を行います。

まず、PostgreSQLの createdb コマンドを使って、追加したインスタンスにデータベー スを作成します。この際、テンプレートのデータベースは template0 と し、データベースのエンコーディングを既存のデータベースと揃える必要があ ります。:

[forest@st14 ~]$ psql -l -h 172.19.188.33 -U forest
          List of databases
      Name       | Owner  | Encoding
-----------------+--------+-----------
 forest_template | forest | UTF8
 gsc             | forest | SQL_ASCII
 postgres        | forest | SQL_ASCII
 template0       | forest | SQL_ASCII
 template1       | forest | SQL_ASCII
 testdb          | forest | UTF8
(6 rows)

[forest@st14 ~]$ createdb -E UTF8 -T template0 -h 172.19.188.34 -U forest testdb
CREATE DATABASE
[forest@st14 ~]$

データベースは作成されましたが、この段階ではまだテーブルの移行ができて いないため、 check gsc コマンドはエラーとなります。:

[gsc]$ check gsc;
2007-02-01 17:20:44.994 ERROR: ERROR: relation "t1" does not exist
2007-02-01 17:20:44.994 ERROR: Database `testdb' is under inconsistent.
2007-02-01 17:20:44.995 ERROR: [Error] グローバルシステムカタログの整合性チェック中にエラーが発生しました。
グローバルシステムカタログの整合性をチェックしました。

[gsc]$

次に、 pg_dump コマンドで既存のインスタンス(172.19.188.33)からデータベー スのダンプを取得し、 psql コマンドを使って追加するインスタンス (172.19.188.34)へデータを投入します。:

[forest@st13 ~]$ pg_dump -h 172.19.188.33 -U forest testdb > testdb.dmp
[forest@st13 ~]$ psql -h 172.19.188.34 -U forest testdb < testdb.dmp
SET
SET
SET
CREATE SCHEMA
(...略...)
GRANT
GRANT
[forest@st14 ~]$

以上で、データの移行は完了です。最後に、 check gsc コマンドでデー タの整合性に問題が無いことを確認して、環境構築ツールを終了します。:

[gsc]$ check gsc;
グローバルシステムカタログの整合性をチェックしました。

[gsc]$

6.3   インスタンスの削除

6.3.1   既存のデータベースからインスタンスを削除する場合

PostgresForestデータベース環境からインスタンスを削除する場合には、

  1. drop dbinstance コマンドでデータベースから切り離す
  2. drop instance コマンドでインスタンスの登録を解除する

という手順になります。

まず、 drop dbinstance コマンドに force オプションを指定して実 行します( force オプションを指定すると、インスタンス上にデータベースや テーブルが存在していても強制的に削除します)。:

[gsc]$ show db;
データベース一覧
 DBNAME | SERVERID |     HOST      | PORT
------------------------------------------
 testdb |        0 | 172.19.188.33 | 5432
 testdb |        1 | 172.19.188.34 | 5432


[gsc]$ drop dbinstance testdb 1 force;
データベースインスタンス:testdbを、サーバID:1から削除しました。

[gsc]$ show db;
データベース一覧
 DBNAME | SERVERID |     HOST      | PORT
------------------------------------------
 testdb |        0 | 172.19.188.33 | 5432


[gsc]$

データベースから切り離したら、 drop instance コマンドでサーバのインスタンスを解除します。:

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中
        1 | 172.19.188.34 | 5432 | 稼動中


[gsc]$ drop instance 1;
インスタンスID:1 を削除しました。

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中


[gsc]$

7   データベースの作成と削除

7.1   データベースの表示

PostgresForestデータベース環境に作成されているデータベースを表示するには、 show db コマンドを使用します。:

[gsc]$ show db;
データベース一覧
 DBNAME | SERVERID |     HOST      | PORT
------------------------------------------
 testdb |        0 | 172.19.188.33 | 5432
 testdb |        1 | 172.19.188.34 | 5432

[gsc]$

7.2   データベースの作成

データベースを作成するには create db コマンドを使用し、作成するデー タベース名および作成するインスタンスのサーバIDを指定します。:

[gsc]$ create db testdb(0,1);
データベース:testdbを、サーバID:0,1,に作成しました。

[gsc]$

7.3   データベースの削除

データベースを削除するためには drop db コマンドを利用します。:

[gsc]$ drop db testdb;
データベース:testdbを削除しました。

[gsc]$

8   テーブルの作成・削除・パーティション化

8.1   データベースのオープンとクローズ

データベース内のテーブル操作(作成・削除・パーティション化など)を行う 場合には、環境構築ツールにおいてデータベースをオープンしておく必要があ ります。

データベースをオープンしている間は、コマンドプロンプトが:

[データベース名]>

という表示に変わります。

テーブルの操作が終わったら、データベースをクローズする必要があります。

8.1.1   データベースのオープン

データベースをオープンするには、 open db コマンドをデータベース名を指定して実行します。:

[gsc]$ open db testdb;
データベース:testdbをオープンしました。

[testdb]>

データベースをオープンすると、プロンプトの表示が変わります。

8.1.2   データベースのクローズ

データベースをクローズするには、 close db コマンドを実行します。:

[testdb]> close db;
データベース:testdbをクローズしました。

[gsc]$

データベースをクローズすると、プロンプトの表示が戻ります。

8.2   テーブル情報の表示

8.2.1   テーブル一覧の表示

データベースに作成されているテーブルの一覧を表示するには、 show table コマンドを使用します。

show table コマンドは、「テーブル名・テーブル種別・パーティション 化関数・ステータス」の情報を表示します。:

[testdb]> show table;
テーブル一覧
 TABLENAME |    TABLETYPE     | PARTITION_FUNC | STATUS
--------------------------------------------------------
 t1        | 多重化           |                | 稼動中
 t2        | パーティション化 | DEFAULT        | 稼動中


[testdb]>

8.2.2   テーブル構造の表示

特定のテーブルの構造(カラム名やカラムの型など)を表示するには、テーブ ル名を指定して show table コマンドを実行します。

テーブル名を指定して show table コマンドを実行すると、「パーティショ ンキー・カラム名・カラムの型」が表示されます。:

[testdb]> show table t2;
テーブル項目一覧[t2]
 PARTITION_KEY | COLUMNNAME | DATATYPE
---------------------------------------
  *            | uid        | int4
               | uname      | text


[testdb]>

8.3   テーブルの作成

テーブルを作成するには、 CREATE TABLE コマンドを使用します。:

[testdb]> CREATE TABLE t1 ( uid INTEGER PRIMARY KEY, uname TEXT );
[DDL]
create table t1 ( uid integer primary key, uname text )
[結果]-->
正常に実行されました。


[testdb]>

8.4   テーブルの削除

テーブルを削除するには、 DROP TABLE コマンドを使用します。:

[testdb]> drop table t1;
[DDL]
drop table t1
[結果]-->
正常に実行されました。


[testdb]>

8.5   テーブルのパーティション化

多重化テーブルをパーティションテーブルに構成変更することを「パーティショ ン化」と呼びます。

PostgresForestでは、テーブルを作成した際にはすべて多重化テーブルとして 作成されます。パーティションテーブルを利用する場合には、多重化テーブル を作成してからパーティション化する必要があります。

テーブルのパーティション化を行う場合には、 part table コマンドを利 用します。:

[testdb]> part table t2 ( uid ) 2;
パーティション1テーブル:t2 を作成しました。

[testdb]>

8.6   テーブルのパーティション化の解除

パーティション化テーブルを多重化テーブルに戻すには、 unpart table コマンドを使用します。:

[testdb]> unpart table t2;
パーティションテーブル:t2 を解除しました。

[testdb]>

8.7   複雑なパーティション化

特定のインスタンスに、特定のパーティションのみを配置する、などといった 複雑なパーティション化を行う場合には、 part table2 コマンドを使用 します。:

[testdb]> part table2 t2 (uid) 2 servid=0 partno=(0), servid=1 partno=(1);
パーティション2テーブル:t2 を作成しました。

[testdb]>

ただし、このコマンドを使ってパーティション化を行うと、パーティション化 の解除はできなくなりますので、多重化テーブルに戻す場合にはテーブルの削 除および再作成が必要になります。

9   データの操作(SELECT/INSERT/UPDATE/DELETE)

Jpsqlは、PostgresForestデータベース環境のデータベース内のテーブルに対し て、データの追加・更新・削除・検索を行うためのツールです。

Jpsqlから利用できるSQLコマンドは、以下の通りです。

9.1   Jpsqlの起動と終了

Jpsql.sh コマンドを実行すると、Jpsqlのコマンドプロンプトが表示され、 ユーザのSQL入力待ちとなります。ユーザは、このプロンプトに SELECT/INSERT/UPDATE/DELETE文を入力することで、データの操作を行うこと ができます。:

[forest@st13 PostgresForest-4.0.1]$ Jpsql.sh  -h 172.19.188.33 -p 5432 -g gsc -d testdb -U forest
JAVA:
    /usr/java/jdk1.5.0_09/bin/java

CLASSPATH:
    /usr/local/forest401/lib/Jpsql.jar
    /usr/local/forest401/share/postgresforest40.jar
    /usr/local/forest401/lib/commons-cli-1.0.jar

Connection URL :
    jdbc:postgresforest:GSC=//172.19.188.33:5432/gsc@testdb

Welcome to Jpsql, the PostgreSQL interactive terminal.
Password >

Connecting to Database URL = jdbc:postgresforest:GSC=//172.19.188.33:5432/gsc@testdb (user:forest)
Connected to PostgreSQL 8.1.6

[1]

起動時のコマンドラインオプションについては、「コマンドラインオプション 一覧 Jpsql.shコマンド」を参照してください。

Jpsqlを終了する際には、「 \q 」を入力してJpsqlのプロンプトを抜けます。:

[1] \q
Now closing the connection
[forest@st13 PostgresForest-4.0.1]$

9.2   対話的なSQL実行

ユーザがJpsqlプロンプトにSQLを対話的に入力して実行する場合には、各SQL 文の末尾に ; を付加して入力する必要があります。

9.2.1   INSERT文の実行

[2] insert into t1 values ( 1, 'test 1' );
SQL:
insert into t1 values ( 1, 'test 1' );
Updated 1 rows
[3]

9.2.2   SELECT文の実行

[3] select * from t1;
SQL:
select * from t1;
uid     name
1       test 1
[4]

9.2.3   UPDATE文の実行

[4] update t1 set name = 'update 1' where uid = 1;
SQL:
update t1 set name = 'update 1' where uid = 1;
Updated 1 rows
[5]

9.2.4   DELETE文の実行

[6] delete from t1 where uid=1;
SQL:
delete from t1 where uid=1;
Updated 1 rows
[7] select * from t1;

9.2.5   TRUNCATE文の実行

TRUNCATEコマンドは、バージョン4.0.1以降でサポートされています。:

[9] select * from t1;
SQL:
select * from t1;
uid     name
2       test 2
[10] truncate t1;
SQL:
truncate t1;
Updated 0 rows
[11] select * from t1;
SQL:
select * from t1;
uid     name
[12]

9.3   ファイル入力によるSQL一括実行

Jpsqlでは、プロンプトからユーザが逐一SQL文を入力するのだけではなく、ファ イルに記述されたSQLを一括して実行することができます。

ファイルに記述されたSQL文を一括して実行するには、コマンドラインオプショ ンの -f オプションを使います。

例えば、以下のSQLを記述したファイル test.sql をJpsqlで実行するには、:

truncate t1;
select * from t1;
insert into t1 values ( 1, 'test 1');
select * from t1;
update t1 set name='update 1' where uid=1;
select * from t1;
delete from t1 where uid=1;
select * from t1;

Jpsqlに -f test.sql を付加して、以下のように実行します。:

[forest@st13 PostgresForest-4.0.1]$ Jpsql.sh -f test.sql -h 172.19.188.33 -p 5432 -g gsc -d testdb -U forest -W forest
JAVA:
    /usr/java/jdk1.5.0_09/bin/java

CLASSPATH:
    /usr/local/forest401/lib/Jpsql.jar
    /usr/local/forest401/share/postgresforest40.jar
    /usr/local/forest401/lib/commons-cli-1.0.jar

Connection URL :
    jdbc:postgresforest:GSC=//172.19.188.33:5432/gsc@testdb

Welcome to Jpsql, the PostgreSQL interactive terminal.
Connecting to Database URL = jdbc:postgresforest:GSC=//172.19.188.33:5432/gsc@testdb (user:forest)
Connected to PostgreSQL 8.1.6

Using SQL file input from test.sql
SQL:truncate t1;
Updated 0 rows
SQL:
select * from t1;
uid     name
SQL: insert into t1 values ( 1, 'test 1');
Updated 1 rows
SQL:
select * from t1;
uid     name
1       test 1
SQL:
update t1 set name='update 1' where uid=1;
Updated 1 rows
SQL:
select * from t1; uid     name 1       update 1
SQL:
delete from t1 where uid=1;
Updated 1 rows
SQL:
select * from t1;
uid     name
[forest@st13 PostgresForest-4.0.1]$

10   既存のPostgreSQLデータベースからの移行

10.1   データベース移行の概要

10.1.1   データベース移行の手順

既存のPostgreSQLデータベースからの移行に伴う作業手順は、概ね以下のようになります。

  • 既存のPostgreSQLデータベースからのテーブルスキーマのエクスポート( pg_dump コマンド)
  • 既存のPostgreSQLデータベースからのテーブルデータのエクスポート( pg_dump コマンド)
  • PostgresForestデータベースの作成(環境構築ツール)
  • PostgresForestデータベース上へのテーブルの作成(環境構築ツール)
  • PostgresForestデータベース上のテーブルへのデータの投入( psql コマンド)

PostgresForestバージョン4.0の環境構築ツールでは、テーブルおよびインデッ クスの作成・削除に関するSQLコマンドのみをサポートしています。そのため、 既存PostgreSQLからデータをエクスポートする際に、テーブルスキーマとテー ブルデータを分けてエクスポートしておく必要があります。

10.1.2   移行に関わる注意点

  • シーケンス(SERIAL型)は移行できません

10.2   既存のPostgreSQLデータベースからのエクスポート

10.2.1   テーブルスキーマのエクスポート

既存PostgreSQLからテーブルスキーマをエクスポートするには pg_dump コマンドに --schema-only オプションを付加して 実行します。:

[forest@st13 ~]$ pg_dump --schema-only testdb0 > testdb.schema.sql

10.2.2   テーブルデータのエクスポート

既存PostgreSQLからテーブルデータをエクスポートするには pg_dump コマンドに --data-only オプションを付加して 実行します。:

[forest@st13 ~]$ pg_dump --data-only testdb0 > testdb.data.sql

10.3   PostgresForestデータベースへの移行

10.3.1   PostgresForestデータベースの作成

create db コマンドを用いて、データベースを作成します。:

[gsc]$ create db testdb(0,1);
データベース:testdbを、サーバID:0,1,に作成しました。

[gsc]$

10.3.2   テーブルスキーマの作成

作成したデータベースを open db コマンドでオープンし、 \i コマ ンドでテーブルスキーマのダンプファイルを読み込んで実行します。:

[gsc]$ open db testdb;
データベース:testdbをオープンしました。

[testdb]> \i testdb.schema.sql
execute command
  file:testdb.schema.sql
2007-02-02 20:58:57.336 ERROR: [Error] コマンドが存在しません。
2007-02-02 20:58:57.337 ERROR: [Error] コマンドが存在しません。
2007-02-02 20:58:57.337 ERROR: [Error] コマンドが存在しません。
(...省略...)
[DDL]
   create table cc_xacts (     cx_o_id numeric(10,0) not null,     cx_type character varying(10),
      cx_num numeric(16,0),     cx_name character varying(31),     cx_expiry date,
      cx_auth_id character(15),     cx_xact_amt numeric(15,2), cx_xact_date date,
      cx_co_id numeric(4,0))
[結果]-->
正常に実行されました。
(...省略...)
[DDL]
grant all on schema public to public
2007-02-02 20:58:58.168 WARNING: execute DDL
2007-02-02 20:58:58.169 WARNING: Not implemented yet
[結果]-->
2007-02-02 20:58:58.17 ERROR: 失敗しました。詳細はエラーログを参照して下さい。
2007-02-02 20:58:58.17 ERROR:


[testdb]>

このとき、環境構築ツールがエラーを出力する場合があります。

環境構築ツールでは、実行できるSQLコマンドとして

  • CREATE TABLE / ALTER TABLE / DROP TABLE
  • CREATE VIEW / DROP VIEW
  • CREATE INDEX / ALTER INDEX / DROP INDEX

のみをサポートしていますので、GRANT TABLEコマンドなども含まれている pg_dump の出力結果をそのまま実行すると、エラーが発生します。

ただし、この作業で必要なのはテーブルの作成ですので、 show table コ マンドでテーブルが作成されていれば問題はありません。:

[testdb]> show table;
テーブル一覧
  TABLENAME   | TABLETYPE | PARTITION_FUNC | STATUS
----------------------------------------------------
 address      | 多重化    |                | 稼動中
 author       | 多重化    |                | 稼動中
 cc_xacts     | 多重化    |                | 稼動中
 country      | 多重化    |                | 稼動中
 customer     | 多重化    |                | 稼動中
 iot_customer | 多重化    |                | 稼動中
 item         | 多重化    |                | 稼動中
 mm1          | 多重化    |                | 稼動中
 order_line   | 多重化    |                | 稼動中
 orders       | 多重化    |                | 稼動中


[testdb]>

10.3.3   テーブルデータの投入

psql コマンドを用いて、各インスタンスに直接データを投入します。:

[forest@st13 ~]$ psql -f testdb.data.sql -h 172.19.188.33 -p 5432 -U forest testdb
SET
SET
SET
SET
psql:testdb.data.sql:15: ERROR:  relation "addr_id" does not exist
psql:testdb.data.sql:22: ERROR:  relation "cust_id" does not exist
psql:testdb.data.sql:29: ERROR:  relation "odr_id" does not exist
[forest@st13 ~]$ psql -f testdb.data.sql -h 172.19.188.34 -p 5432 -U forest testdb
SET
SET
SET
SET
psql:testdb.data.sql:15: ERROR:  relation "addr_id" does not exist
psql:testdb.data.sql:22: ERROR:  relation "cust_id" does not exist
psql:testdb.data.sql:29: ERROR:  relation "odr_id" does not exist
[forest@st13 ~]$

この時、 pg_dump コマンドの出力をそのまま使用すると、シーケンス (SERIAL型)のデータのインポート処理でエラーが発生しますが、通常のテー ブルのデータの移行は問題ありません。

10.3.4   データの整合性の確認

最後に、 check gsc コマンドでデータの整合性を確認します。:

[gsc]$ check gsc;
グローバルシステムカタログの整合性をチェックしました。

[gsc]$

11   PostgresForestデータベースの監視

11.1   データベース監視の必要性

PostgresForestデータベース環境の運用されている状態には、大きく分けて以下の3つの状 態があります。

通常運転
ユーザデータベース、GSCのデータの整合がとれ、 すべてのノードが正常に稼動している状態。
縮退運転
一部のノードがなんらかの原因でダウン状態し、 クラスタから切り離されている状態。
サービスダウン
すべてのGSCへのアクセスが不可能である、 またはすべてのノードがダウンしていることにより、 システムが一切利用できない状態。

PostgresForestデータベース環境では、構成するインスタンスに何らかの障害が発生 したことが検出されると、仮想化モジュールがインスタンスのステータスを「障害中」 に変更することで自動的に縮退運転に移行します。

よって、計画されたメンテナンスなどを除き、「縮退運転」あるいは「サービスダウン」 になった場合には、何らかの対応を行う必要があります。

そのためにも、PostgresForestデータベース環境の監視を行っておく必要が あります。

11.2   インスタンスステータスの取得

インスタンスが正常に稼働中か、または障害などによって切り離されているかを取得 するには、環境構築ツールの show instance コマンドを使います。:

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中
        1 | 172.19.188.34 | 5432 | 稼動中

[gsc]$

通常運転時には、インスタンスのステータスは「稼働中」と表示されますが、障害ま たはメンテナンスなどで切り離されているインスタンスは、「障害中」と表示されま す。:

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中
        1 | 172.19.188.34 | 5432 | 障害中

[gsc]$

11.3   GSCの整合性チェック

GSCの整合性チェックでは、以下の処理を行います。

  • GSCに登録されているデータベースおよびテーブルが、各インスタンスに存在すること
  • 多重化されているテーブルのレコード数が全インスタンスで一致していること
  • 多重化されているGSCの内容が全インスタンスで一致していること

通常、GSCの整合性が取れている状態で check gsc コマンドを実行すると、 エラーを表示せずに終了します。:

[gsc]$ check gsc;
グローバルシステムカタログの整合性をチェックしました。

[gsc]$

テーブルが存在しない、あるいはデータベースが存在しない、といった場合に はエラーメッセージが表示されます。:

[gsc]$ check gsc;
2007-02-01 17:20:44.994 ERROR: ERROR: relation "t1" does not exist
2007-02-01 17:20:44.994 ERROR: Database `testdb' is under inconsistent.
2007-02-01 17:20:44.995 ERROR: [Error] グローバルシステムカタログの整合性チェック中にエラーが発生しました。
グローバルシステムカタログの整合性をチェックしました。

[gsc]$

また、レコード数が異なっている場合にもエラーメッセージが出力されます。:

[gsc]$ check gsc;
2007-02-02 13:34:09.77 ERROR: Record count is different between instance 0(1) and 1(2).
2007-02-02 13:34:09.77 ERROR: Database `testdb' is under inconsistent.
2007-02-02 13:34:09.771 ERROR: [Error] グローバルシステムカタログの整合性チェック中にエラーが発生しました。
グローバルシステムカタログの整合性をチェックしました。

[gsc]$

11.4   疎通の確認

アプリケーションサーバなど、PostgresForestデータベースへアクセスするサー バから、 psql コマンドを用いてGSCデータベースおよびユーザデータベー スへの接続を行えるかどうかを確認します。:

[forest@st12 ~]$ psql -h 172.19.188.33 -p 5432 -A -t -c 'select true' gsc
t
[forest@st12 ~]$ psql -h 172.19.188.33 -p 5432 -A -t -c 'select true' testdb
t
[forest@st12 ~]$ psql -h 172.19.188.34 -p 5432 -A -t -c 'select true' testdb
t
[forest@st13 ~]$

すべて「 t 」という結果が表示されたら疎通の確認の完了です。

何らかのエラーが出た場合は、データベースへの接続ができていないことにな りますので、その原因を取り除きます。

以下は、PostgreSQLインスタンスが起動していない場合のエラーです。:

[forest@st12 ~]$ psql -h 172.19.188.33 -p 5432 -A -t -c 'select true' testdb
psql: could not connect to server: Connection refused
        Is the server running on host "172.19.188.33" and accepting
        TCP/IP connections on port 5432?
[forest@st12 ~]$

12   PostgresForestデータベースのバックアップ

12.1   バックアップの概要

バックアップを行う際には、まず環境構築ツールの check gsc コマンドを用 いて、GSCおよびデータベースの整合性に問題が無いことを確認してください。

12.2   GSCのバックアップ

GSCのバックアップを取得するには、 pg_dump コマンドを使用します。:

[forest@st13 ~]$ pg_dump -Fc gsc > gsc.dmp

GSCを多重化している場合には、すべてのノードのGSCの内容は同じものとなり ますので、 show gsc コマンドで表示されたノードのうち、いずれかひと つのノードのGSCを選んでバックアップします。:

[gsc]$ show gsc;
グローバルシステムカタログ一覧
 DBNAME |     HOST      | PORT | SERVERID
------------------------------------------
 gsc    | 172.19.188.33 | 5432 |        0
 gsc    | 172.19.188.34 | 5432 |        1
[gsc]$

12.3   ユーザデータベースのバックアップ

ユーザデータベースのバックアップには pg_dump コマンドに -Fc オ プションを指定して実行します。

ユーザデータベースのバックアップを行う際には、原則としてデータベースを 保持しているノードすべてからバックアップを取る必要があります。

ただし、パーティションテーブル2が含まれていない場合には、 全ノードからのバックアップはすべて同等の内容となりますので、 すべてのノードのバックアップを取得する必要はありません。:

[gsc]$ show db;
データベース一覧
 DBNAME | SERVERID |     HOST      | PORT
------------------------------------------
 testdb |        0 | 172.19.188.33 | 5432
 testdb |        1 | 172.19.188.34 | 5432

[gsc]$ \q
Now closing the connection
[forest@st13 ~]$ pg_dump -h 172.19.188.33 -p 5432 -Fc testdb > 0.testdb.db
[forest@st13 ~]$ pg_dump -h 172.19.188.34 -p 5432 -Fc testdb > 1.testdb.db
[forest@st13 ~]$

13   PostgresForestデータベースのリカバリ

13.1   リカバリの概要

PostgresForestのリカバリには、大きく分けて三種類のリカバリがあります。

  • 縮退運転からのリカバリ(オフライン)
  • 縮退運転からのリカバリ(オンライン)
  • サービス停止状態からのリカバリ

13.2   縮退運転からのリカバリ(オフライン)

13.2.1   リカバリの手順

  1. 稼働データベースのダンプの取得
  2. 障害インスタンスのデータベースの削除
  3. 障害インスタンス上へのレストア
  4. インスタンスステータスの更新

この手順でのリカバリを行う場合には、障害の発生したノードも含め、各ノー ドのPostgreSQLインスタンスが稼働しており、かつPostgresForestデータベー スへの更新処理が停止している必要があります。

13.2.2   稼働データベースのダンプの取得

次に、稼働しているインスタンスのデータベースのダンプを取得します。

実行コマンド:

pg_dump -h [稼働インスタンスのIPアドレス] -p [稼働インスタンスのポート番号]
      -Fc [データベース名] > [ダンプファイル名]

実行例:

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中
        1 | 172.19.188.34 | 5432 | 障害中

[gsc]$ \q
Now closing the connection
[forest@st13 ~]$ pg_dump -h 172.19.188.33 -p 5432 -Fc testdb > testdb.db
[forest@st13 ~]$

13.2.3   障害インスタンスのデータベースの削除

次に、障害の発生したデータベースを削除します。

実行コマンド:

dropdb -h [障害インスタンスのIPアドレス] -p [障害インスタンスのポート番号]
    [データベース名]

実行例:

[forest@st13 ~]$ dropdb -h 172.19.188.34 -p 5432 testdb
DROP DATABASE
[forest@st13 ~]$

13.2.4   障害インスタンス上へのレストア

バックアップで取得したダンプデータを pg_restore コマンドを使って障害インスタンス上にレストアします。

実行コマンド:

pg_restore -h [障害インスタンスのIPアドレス] -p [障害インスタンスのポート番号]
    --create -Fc -d postgres [ダンプファイル名]

実行例:

[forest@st13 ~]$ pg_restore -h 172.19.188.34 -p 5432 --create -Fc -d postgres testdb.db

13.2.5   インスタンスステータスの更新

環境構築ツールで、 check gsc コマンドを用いてデータベースの整合性 を確認し、問題が無ければ、 set instance コマンドで障害インスタンスのステータスを「稼働中」に戻します。

実行コマンド:

check gsc;
set instance up [障害インスタンスのサーバID];

実行例:

[gsc]$ check gsc;
グローバルシステムカタログの整合性をチェックしました。

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中
        1 | 172.19.188.34 | 5432 | 障害中

[gsc]$ set instance up 1;
インスタンスID:1 の状態を稼動中に設定しました。

[gsc]$ show instance;
インスタンス一覧
 SERVERID |     HOST      | PORT | STATUS
------------------------------------------
        0 | 172.19.188.33 | 5432 | 稼動中
        1 | 172.19.188.34 | 5432 | 稼動中

[gsc]$

13.3   縮退運転からのリカバリ(オンライン)

13.3.1   リカバリの手順

サービスを停止せずに縮退運転からのリカバリを方法は、以下の手順となりま す。

  1. 稼働インスタンスから障害インスタンスへのデータベースコピー
  2. 仮想化モジュールの一時停止
  3. 更新ログの適用
  4. 仮想化モジュールの処理再開
  5. リカバリ関連オブジェクトのクリーンナップ

13.3.2   稼働インスタンスから障害インスタンスへのデータベースコピー

まず最初に、稼働中のインスタンスからリカバリを行うインスタンスへ、 データベースのスナップショットをコピーします。

実行コマンド:

ForestRecovery.sh -phase1 -user [ユーザ名] -pass [パスワード]
   -gsc_url jdbc:postgresql://[GSCサーバのIPアドレス]:[GSCサーバのポート番号]/[GSC名]
   [稼働インスタンスのサーバID] [障害インスタンスのサーバID] [データベース名]

実行例:

[forest@st14 ~]$ ForestRecovery.sh -phase1 -gsc_url jdbc:postgresql://172.19.188.33:5432/gsc -user forest -pass forest 0 1  testdb
2007-02-05 16:20:07.214 NOTICE: RECOVERING:
2007-02-05 16:20:07.215 NOTICE:   FROM [0]jdbc:postgresql://172.19.188.33:5432/testdb
2007-02-05 16:20:07.215 NOTICE:     TO [1]jdbc:postgresql://172.19.188.34:5432/testdb
2007-02-05 16:20:07.231 NOTICE: SERVER STATUS:
2007-02-05 16:20:07.233 NOTICE:   Src: Server 0, Status 1
2007-02-05 16:20:07.234 NOTICE:   Dst: Server 1, Status -1
2007-02-05 16:20:07.234 NOTICE: RECOVERY_MODE = 1
2007-02-05 16:20:07.235 NOTICE: RECOVERY / INITIALIZATION
2007-02-05 16:20:07.238 NOTICE: TABLE(S) TO COPY:
2007-02-05 16:20:07.238 NOTICE:   address
2007-02-05 16:20:07.238 NOTICE:   author
(...略...)
2007-02-05 16:20:48.19 NOTICE:   CREATE SNAPSHOT: done.
2007-02-05 16:20:48.19 NOTICE:   REBUILD FROM SNAPSHOT: start.
2007-02-05 16:24:02.99 NOTICE:   REBUILD FROM SNAPSHOT: done.
2007-02-05 16:24:02.99 NOTICE: COPYING ALL TABLES: done.
2007-02-05 16:24:02.99 NOTICE: APPLYING LOG RECORD(S): start.
2007-02-05 16:24:03.004 NOTICE: APPLYING LOG RECORD(S): done.
2007-02-05 16:24:03.004 NOTICE: RECOVERY / PHASE 1: done.
[forest@st14 ~]$

13.3.3   仮想化モジュールの一時停止

次に、GSCのテーブル情報を一時的に「メインテナンス状態」に変更し、仮想 化モジュールの処理を一時的に抑制します。

実行コマンド:

ForestRecovery.sh -stop_vm -user [ユーザ名] -pass [パスワード]
   -gsc_url jdbc:postgresql://[GSCサーバのIPアドレス]:[GSCサーバのポート番号]/[GSC名]
   [稼働インスタンスのサーバID] [障害インスタンスのサーバID] [データベース名]

実行例:

[forest@st14 ~]$ ForestRecovery.sh -stop_vm -gsc_url jdbc:postgresql://172.19.188.33:5432/gsc -user forest -pass forest 0 1  testdb
2007-02-05 16:32:12.956 NOTICE: RECOVERING:
2007-02-05 16:32:12.957 NOTICE:   FROM [0]jdbc:postgresql://172.19.188.33:5432/testdb
2007-02-05 16:32:12.957 NOTICE:     TO [1]jdbc:postgresql://172.19.188.34:5432/testdb
2007-02-05 16:32:12.974 NOTICE: SERVER STATUS:
2007-02-05 16:32:12.975 NOTICE:   Src: Server 0, Status 1
2007-02-05 16:32:12.976 NOTICE:   Dst: Server 1, Status -1
2007-02-05 16:32:12.976 NOTICE: RECOVERY_MODE = 4
2007-02-05 16:32:12.978 NOTICE: RECOVERY / INITIALIZATION
2007-02-05 16:32:12.981 NOTICE: TABLE(S) TO COPY:
2007-02-05 16:32:12.981 NOTICE:   address
(...略...)
2007-02-05 16:32:12.984 NOTICE:   orders
2007-02-05 16:32:12.984 NOTICE: RECOVERY / STOPPING VM: start.
2007-02-05 16:32:13.079 NOTICE:   WAITING 40 SECONDS...
2007-02-05 16:32:53.087 NOTICE:   READY TO GO RECOVERY PHASE 2
2007-02-05 16:32:53.087 NOTICE: RECOVERY / STOPPING VM: done.
[forest@st14 ~]$

13.3.4   更新ログの適用

テーブルを「データベースのスナップショットをコピーしてからテーブルをメ インテナンス状態にするまでの間」に更新された差分を、更新ログとしてリカバリ対象の インスタンスに適用します。

実行コマンド:

ForestRecovery.sh -phase2 -user [ユーザ名] -pass [パスワード]
   -gsc_url jdbc:postgresql://[GSCサーバのIPアドレス]:[GSCサーバのポート番号]/[GSC名]
   [稼働インスタンスのサーバID] [障害インスタンスのサーバID] [データベース名]

実行例:

[forest@st14 ~]$ ForestRecovery.sh -phase2 -gsc_url jdbc:postgresql://172.19.188.33:5432/gsc -user forest -pass forest 0 1  testdb
2007-02-05 16:37:38.866 NOTICE: RECOVERING:
2007-02-05 16:37:38.866 NOTICE:   FROM [0]jdbc:postgresql://172.19.188.33:5432/testdb
2007-02-05 16:37:38.867 NOTICE:     TO [1]jdbc:postgresql://172.19.188.34:5432/testdb
2007-02-05 16:37:38.883 NOTICE: SERVER STATUS:
2007-02-05 16:37:38.885 NOTICE:   Src: Server 0, Status 1
2007-02-05 16:37:38.886 NOTICE:   Dst: Server 1, Status -1
2007-02-05 16:37:38.886 NOTICE: RECOVERY_MODE = 2
2007-02-05 16:37:38.887 NOTICE: RECOVERY / INITIALIZATION
2007-02-05 16:37:38.89 NOTICE: TABLE(S) TO COPY:
2007-02-05 16:37:38.89 NOTICE:   address
(...略...)
2007-02-05 16:37:38.893 NOTICE:   orders
2007-02-05 16:37:38.893 NOTICE: RECOVERY / PHASE 2: start.
2007-02-05 16:37:38.932 NOTICE: RECOVERY / PHASE 2: done
[forest@st14 ~]$

13.3.5   仮想化モジュールの処理再開

更新ログの適用が終わったら、テーブルのメインテナンス情報を解除し、仮想 化モジュールの処理を再開します。

実行コマンド:

ForestRecovery.sh -start_vm -user [ユーザ名] -pass [パスワード]
   -gsc_url jdbc:postgresql://[GSCサーバのIPアドレス]:[GSCサーバのポート番号]/[GSC名]
   [稼働インスタンスのサーバID] [障害インスタンスのサーバID] [データベース名]

実行例:

[forest@st14 ~]$ ForestRecovery.sh -start_vm -gsc_url jdbc:postgresql://172.19.188.33:5432/gsc -user forest -pass forest 0 1  testdb
2007-02-05 16:38:28.368 NOTICE: RECOVERING:
2007-02-05 16:38:28.368 NOTICE:   FROM [0]jdbc:postgresql://172.19.188.33:5432/testdb
2007-02-05 16:38:28.369 NOTICE:     TO [1]jdbc:postgresql://172.19.188.34:5432/testdb
2007-02-05 16:38:28.385 NOTICE: SERVER STATUS:
2007-02-05 16:38:28.387 NOTICE:   Src: Server 0, Status 1
2007-02-05 16:38:28.388 NOTICE:   Dst: Server 1, Status -1
2007-02-05 16:38:28.388 NOTICE: RECOVERY_MODE = 3
2007-02-05 16:38:28.389 NOTICE: RECOVERY / INITIALIZATION
2007-02-05 16:38:28.392 NOTICE: TABLE(S) TO COPY:
2007-02-05 16:38:28.392 NOTICE:   address
(...略...)
2007-02-05 16:38:28.395 NOTICE:   orders
2007-02-05 16:38:28.395 NOTICE: RECOVERY / STARTING VM: start.
2007-02-05 16:38:28.423 NOTICE: RECOVERY / STARTING VM: done.
[forest@st14 ~]$

13.3.6   リカバリ関連オブジェクトのクリーンナップ

リカバリ中に使用したオブジェクトなどを削除します。

実行コマンド:

ForestRecovery.sh -cleanup -user [ユーザ名] -pass [パスワード]
   -gsc_url jdbc:postgresql://[GSCサーバのIPアドレス]:[GSCサーバのポート番号]/[GSC名]
   [稼働インスタンスのサーバID] [障害インスタンスのサーバID] [データベース名]

実行例:

[forest@st14 ~]$ ForestRecovery.sh -cleanup -gsc_url jdbc:postgresql://172.19.188.33:5432/gsc -user forest -pass forest 0 1  testdb
2007-02-05 16:39:11.588 NOTICE: RECOVERING:
2007-02-05 16:39:11.589 NOTICE:   FROM [0]jdbc:postgresql://172.19.188.33:5432/testdb
2007-02-05 16:39:11.589 NOTICE:     TO [1]jdbc:postgresql://172.19.188.34:5432/testdb
2007-02-05 16:39:11.606 NOTICE: SERVER STATUS:
2007-02-05 16:39:11.607 NOTICE:   Src: Server 0, Status 1
2007-02-05 16:39:11.608 NOTICE:   Dst: Server 1, Status 1
2007-02-05 16:39:11.609 NOTICE: RECOVERY_MODE = 5
2007-02-05 16:39:11.609 NOTICE: RECOVERY / INITIALIZATION
2007-02-05 16:39:11.611 NOTICE: TABLE(S) TO COPY:
2007-02-05 16:39:11.612 NOTICE:   address
(...略...)
2007-02-05 16:39:11.615 NOTICE:   orders
2007-02-05 16:39:11.615 NOTICE: RECOVERY / CLEANING UP
[forest@st14 ~]$

13.4   GSCのリカバリ

GSCのリカバリを行う際にはオフライン(サービス停止)である必要があります。

手順としては、以下のようになります。

  • 既存のGSCを削除(存在していれば)
  • バックアップからレストア

13.4.1   既存のGSCを削除

既存のGSCが存在している場合には、一旦削除します。

実行コマンド:

dropdb -h [GSCサーバのIPアドレス] -p [GSCサーバのポート番号] [GSC名]

実行例:

[forest@st13 ~]$ dropdb -h 172.19.188.33 -p 5432 gsc
DROP DATABASE
[forest@st13 ~]$

13.4.2   バックアップからレストア

次にバックアップからレストアします。

実行コマンド:

pg_restore -h [GSCサーバのIPアドレス] -p [GSCサーバのポート番号] --create -Fc -d postgres [GSCダンプファイル名]

実行例:

[forest@st13 ~]$ pg_restore -h 172.19.188.33 -p 5432 --create -Fc -d postgres gsc.dmp
[forest@st13 ~]$

14   その他のメンテナンス

14.1   VACUUMとREINDEX

PostgresForestの並列分散化されたデータベースの管理の場合でも、 スタンドアローンのPostgreSQLデータベースの場合と同様に、 VACUUMREINDEX などのメンテナンスを実行し、 不要領域の回収やトランザクションIDのリセットを行う必要があります。 これらのメンテナンス作業は環境構築ツールや仮想化ツールで行うことはできませんので、 それぞれのインスタンスに対して個別に行う必要があります。

メンテナンス作業の対象となるのは、大きく分けて

  • PostgreSQLのテンプレートデータベース ( template1 )
  • PostgresForestのテンプレートデータベース ( forest_template )
  • GSC
  • ユーザデータベース

という4つのデータベースです。とくにユーザデータベース以外の3つについて は、1日1回程度の頻度で VACUUM を行うことが推奨されます。

ユーザデータベースについては、その性質に合わせた頻度で、メンテナンスを 行ってください。

サーバに対する負荷を考慮すると、夜間などの利用率が低い時間帯に、それぞ れのインスタンスごとに時間をずらして実行されるように、 cron などを 利用して実行するのがよいでしょう。

また、オンラインで実行することができない VACUUM FULLREINDEX に関しては、オフラインメンテナンス時に確実に行うようにしてください。

15   コマンドラインオプション一覧

15.1   forest_ctlコマンド

forest_ctl コマンドは、PostgreSQLインスタンスの起動および停止を行うコマンドです。

書式:

forest_ctl [-w] -D DATADIR { start | stop }

オプション:

-w           PostgreSQLインスタンスの起動または停止の完了を待ち受けます。
-D DATADIR   PostgreSQLデータディレクトリとしてDATADIRを指定します。
start        PostgreSQLインスタンスを起動します。
stop         PostgreSQLインスタンスを停止します。

15.2   forest_initdbコマンド

forest_initdb コマンドは、PostgreSQLインスタンスで使用するデータディ レクトリを初期化し、PostgresForestで使用するテンプレートデータベースの 作成を行います。

書式:

forest_initdb

指定可能なオプションはありません。

15.3   forestadmコマンド

forestadm は、PostgresForestデータベース環境を構築・管理するための環境構築ツールです。

書式:

forestadm [-h HOST] [-p PORT] -g GSC -U USER [-W PASSWORD] [-i]

オプション:

-h HOST      接続先のホスト名を指定します。
-p PORT      接続先のポート番号を指定します。
-g GSC       使用するGSCのデータベース名を指定します。
-U USER      指定したロール USER で接続します。
-W PASSWORD  指定したパスワード PASSWORD を使って認証をします。
-i           GSCの初期化を行います。

forestadm コマンドの詳細については、「環境構築ツールリファレンス」 を参照してください。

15.4   Jpsql.shコマンド

Jpsql.sh は、PostgresForest環境のデータベースのデータを操作 (INSERT/UPDATE/DELETE/SELECT)するためのコマンドです。

書式:

Jpsql.sh [-h HOST] [-p PORT] -g GSC -d DBNAME -U USER [-W PASSWORD] [-f FILE]

オプション:

-h HOST       接続先のホスト名を指定します。省略時は "localhost" となります。
-p PORT       接続先のポート番号を指定します。省略時は "5432" となります。
-g GSC        使用するGSCのデータベース名を指定します。
-d DBNAME     指定したデータベース DBNAME に接続します。
-U USER       指定したロール USER で接続します。
-W PASSSWORD  指定したパスワード PASSWORD を使って認証をします。
-f FILE       FILE で指定したファイルに記述されたコマンドを実行します。

15.5   ForestRecovery.shコマンド

ForestRecovery.sh は、縮退運転状態からのオンラインリカバリを行うた めのコマンドです。

このコマンドは、障害で切り離され、これからリカバリされるノード上で実行 する必要があります。

書式:

ForestRecovery { -phase1 | -stop_vm | -phase2 | -start_vm | -cleanup }
  -gsc_url GSCのURL -user ユーザ名 [-pass パスワード]
  リカバリ元サーバID リカバリ先サーバID データベース名

オプション:

-user [str]       リカバリ時の接続ユーザ名
-pass [str]       リカバリ時の接続ユーザのパスワード
-gsc_url [str]    接続するGSCのJDBC URL
-timeout [num]    ネットワークのタイムアウト検出値(秒指定)

-phase1           データベースのスナップショットをコピーする
-stop_vm          仮想化モジュールの処理を一時停止する
-phase2           更新ログを適用する
-start_vm         仮想化モジュールの処理を再開する
-cleanup          リカバリに使用したオブジェクトを削除する

16   付録A. 用語一覧

PostgresForest
PostgresForestは、複数のPostgreSQLサーバ(インスタンス)を統合し、 仮想的な単一のデータベースとして並列分散動作させるオープンソースミドルウェアです。 独立行政法人情報処理推進機構(IPA)の 平成15年度オープンソースソフトウェア活用基盤整備事業の委託を受けて開発しました。 PostgresForest(R)は株式会社NTTデータの登録商標です。
仮想化モジュール
仮想化モジュールは、PostgresForestの機能「レプリケーション、負荷分散、並列処理」を実現するためのコアモジュールです。 JDBCドライバとして実装されており、他のJDBCドライバと高い互換性を提供します。
環境構築ツール
PostgresForestデータベース環境を構築・保守するためのツールです。
Jpsql
PostgresForestデータベース環境のデータを、対話的 または一括して操作(SELECT/INSERT/UPDATE/DELETE)するためのツールです。
データベースクラスタ
PostgreSQLが利用するデータが格納されているデータディレクトリの呼称です。 データベースクラスタは、1つのPostgreSQLインスタンスを通して管理され、 設定ファイル、テーブルやインデックスファイル、トランザクションログなどの ファイルが格納されます。
PostgreSQLインスタンス
PostgreSQLのサービスを構成するために必要な プロセス群やメモリ空間などをまとめて 「PostgreSQLインスタンス」と呼びます。
多重化テーブル
テーブルを構成配置する方法のひとつです。 論理的に1つのテーブルについて、 同一内容の物理テーブルを複数のインスタンス上に 多重化して配置します。 システムの冗長性を向上させ、また負荷分散を行うことができます。
パーティションテーブル
テーブルを構成配置する方法のひとつです。 1つのテーブルを、物理的に複数のテーブル(パーティション)に分割して配置します。 すべてのインスタンスにすべてのパーティションを持たせたり、 または特定のインスタンスに特定のパーティションを持たせるなど、 柔軟な配置をすることも可能です。
グローバルシステムカタログ(GSC)
GSCは、PostgresForestデータベース環境を管理するためのメタ情報を格納する領域です。 PostgreSQLの一つのデータベースとして実装されており、 インスタンスの構成情報や、多重化あるいはパーティション化したテーブルの情報、 インスタンスの障害情報などが格納されます。
パーティション関数
パーティションテーブルにおいて、 レコードがどのパーティションに格納されるのかを、 決定するための関数です。 PostgresForestでは、よく利用されるデータ型のための デフォルトのハッシュ関数が用意されているほか、 利用者が新たに分割ルールを定義して関数を作成することもできます。