テンプレートデータベース

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 18章データベース管理 | 早送り | 次のページ

# 18.3. テンプレートデータベース

実際の`CREATE DATABASE`の動作は、既存のデータベースをコピーすることです。 デフォルトでは、`template1`という名前の標準のシステムデータベースをコピーします。 従って、このデータベースは新しく作成するデータベースの元になる"テンプレート"となります。 `template1` にオブジェクトを追加した場合、追加したオブジェクトはその後に作成されるユーザデータベースにコピーされます。 この振舞いによって、データベース標準オブジェクト群にサイト独自の変更を行うことができます。 例えば、PL/pgSQL手続き言語を`template1`にインストールした場合、データベースを作成する時に追加操作を行うことなく、自動的にこの言語をユーザデータベースで使用することができます。

`template0`という名前の二次的な標準システムデータベースがあります。 このデータベースには`template1`の初期内容と同じデータが含まれています。 つまり、使用しているバージョンのPostgreSQLで定義済みの標準オブジェクトのみから構成されています。 `template0`を`initdb`実行後に変更してはいけません。 `CREATE DATABASE`を`template1`ではなく`template0`をコピーするように実行することで、`template1`に追加されたサイト独自のものを含まない、"汚れがない"ユーザデータベースを作成することができます。 これは特に、`pg_dump`ダンプからリストアする時に便利です。 このダンプスクリプトは、現時点で `template1` に存在する可能性がある追加されたものと衝突しないようにダンプしたデータベースの内容を正しく再作成するために、汚れのないデータベースにリストアされなければなりません。

`template0`をコピーしてデータベースを作成するには、

    CREATE DATABASE dbname TEMPLATE template0;

をSQL環境から実行するか、または

    createdb -T template0 dbname

をシェルから実行します。

更にテンプレートデータベースを作成することができます。 また、実際のところ`CREATE DATABASE`のテンプレートとして名前を指定することで、インストレーション内の全てのデータベースをコピーすることができます。 しかし、この機能は、(まだ)汎用目的の"`COPY DATABASE`"能力を意図したものではないことは理解しておいてください。 特に、コピー操作の間、ソースデータベースが待機状態(実行中のデータ変更トランザクションがない状態)であることが基本です。 `CREATE DATABASE`は、処理を始める時に(自身を除く)バックエンドプロセスがソースデータベースに接続していないことをチェックします。 しかし、コピー先のデータベースの一貫性が失われる結果になる、コピー処理中の変更ができないことを保証しません。 従って、テンプレートとして使用するデータベースは読み取りのみとして扱うことを推奨します。

`datistemplate`列と`datallowconn`列という、データベースそれぞれに有用なフラグが`pg_database`に存在します。 `datistemplate`はそのデータベースが`CREATE DATABASE`のテンプレートとして使用されることを目的としているものであることを意味するために設定される可能性があります。 このフラグが設定された場合、`CREATEDB`権限を持つ全てのユーザはそのデータベースを複製することができます。 設定されていない場合は、スーパーユーザとそのデータベース所有者のみがそれを複製することができます。 `datallowconn`が偽の場合、そのデータベースへの新規接続はできません(しかし、このフラグを偽にするだけでは既存のセッションは閉ざされません)。 `template0`データベースは、変更を防ぐために、通常`datallowconn` = `false`とされています。 `template0`と`template1`の両方は、常に`datistemplate` = `true`とされていなければなりません。

テンプレートデータベースを準備した後、または、テンプレートデータベースに変更を加えた後に、そのデータベースに対して`VACUUM FREEZE`を実行してください。 そのデータベースを開くトランザクションが存在しない時にこれを実行した場合、データベース内の全ての行は"凍結"され、トランザクションID周回問題を防ぐことができます。 これは特に、`datallowconn`の値が偽に設定されたデータベースでは重要です。 なぜなら、そのようなデータベースに対して、定常的な `VACUUM`保守作業ができないからです。 より詳細については項21.1.3を参照してください。

> 注意: `template1`と`template0`には、`template1`という名前が`CREATE DATABASE`のデフォルトのソースデータベースの名前であること、および、`createdb`などの各種プログラムのデフォルトの接続データベースであること以上の特別な地位はありません。 例えば、`template1`を削除し、`template0`から再作成しても何も問題ありません。 この操作は、不注意にゴミを`template1`に追加してしまった場合にお勧めします。

前のページ | ホーム | 次のページ
データベースの作成 | 上に戻る | データベースの設定