データベースとは、SQLオブジェクト("データベースオブジェクト")の集合に名前を付けたものです。一般的には、全てのデータベースオブジェクト(テーブル、関数など)は、1つのデータベースのみに属します(しかし、例えば、 pg_database といったシステムカタログのごく一部には、インストレーション全体に属するものもあり、そのインストレーション内の全てのデータベースからアクセスすることができます)。データベースサーバに接続するアプリケーションは、その接続要求の際に接続するデータベース名を指定します。1つの接続で複数のデータベースにアクセスすることはできません(しかし、アプリケーションには同じデータベースや他のデータベースへの接続に接続数の制限はありません。)。
Note: SQLでは、データベースを"カタログ"(catalogs)と呼ぶこともありますが、実際のところ違いはありません。
データベースを作成、もしくは削除する場合、PostgreSQL postmasterが起動している必要があります( Section 3.3を参照してください)。
問い合わせ言語コマンドのCREATE DATABASEでデータベースを作成することができます。
CREATE DATABASE name
name は SQL 識別子の通常の規則に従います。現在のユーザが自動的に新しいデータベースの所有者になります。作成後、データベースを削除する権限はこの所有者にあります(この作業はそのデータベースに属している、所有者のものではないオブジェクトでも、すべて削除されます)。
データベースの作成は限定された作業です。権限の付与に関する詳細は Section 7.1.1を参照してください。
ブートストラッピング(Bootstrapping). CREATE DATABASEコマンドを実行するためには、データベースサーバに接続している必要があります。そこで、まずあるサイトの 最初のデータベースはどのようにして作成するのかということが問題となります。最初のデータベースはinitdbコマンドでデータの格納領域スペースが初期化されるとき必ず作成されます( Section 3.2を参照して下さい)。慣習的にこのデータベースはtemplate1 と呼ばれます。したがって、最初の "本当の"データベースを作成するにはtemplate1に接続してください。
"template1"という名前はたまたまではありません。新しいデータベースが作成されたら、実際にテンプレートデータベースが複製されます。したがって、template1に変更を与えるとその後に作成されるデータベースすべてにその変更が反映されます。つまり、実際の作業で、その効果が有効である場合以外はテンプレートデータベースを実際に使用することは避けてください。
また、便利にするために、シェルからcreatedbを実行して、新しいデータベースを作成することができます。
createdb dbname
createdbは魔法ではありません、それは template1データベースに接続し、先に解説した通りに CREATE DATABASEコマンドを実行します。内部的にpsqlプログラムを使用しています。createdb のリファレンスページに起動の詳細が説明されています。また、引数のない createdb は現在のユーザ名のデータベースを作成しますので、注意してください。
実際の CREATE DATABASE の動作は、既存のデータベースをコピーすることです。デフォルトでは、template1という名前の標準のシステムデータベースをコピーします。従って、このデータベースは新しく作成するデータベースの元になる"テンプレート"となります。template1 にオブジェクトを追加した場合、追加したオブジェクトはその後に作成されるユーザデータベースにコピーされます。この振舞いによって、データベース標準オブジェクト群にサイト独自の変更を行うことができます。例えば、plpgsql 手続き言語をtemplate1にインストールした場合、データベースを作成する時に追加操作を行うことなく、自動的にこの言語をユーザデータベースで使用することができます。
template0 という名前の二次的な標準システムデータベースがあります。このデータベースには template1 の初期内容と同じデータが含まれています。つまり、使用しているバージョンの PostgreSQL で定義済みの標準オブジェクトのみから構成されています。template0 を initdb 実行後に変更してはいけません。CREATE DATABASE を template1 ではなく template0 をコピーするように実行することで、template1 に追加されたサイト独自のものを含まない、 "汚れがない" ユーザデータベースを作成することができます。これは特に、 pg_dump ダンプからリストアする時に便利です。このダンプスクリプトは、現時点で template1 に存在する可能性がある追加されたものと衝突しないようにダンプしたデータベースの内容を正しく再作成するために、汚れのないデータベースにリストアされなければなりません。
更にテンプレートデータベースを作成することができます。また、実際のところ CREATE DATABASE のテンプレートとして名前を指定することで、インストレーション内の全てのデータベースをコピーすることができます。しかし、この機能は、(まだ)汎用目的の "COPY DATABASE" 能力を意図したものではないことは理解しておいて下さい。特に、コピー操作の間、ソースデータベースが待機状態(実行中のデータ変更トランザクションがない状態)であることが基本です。 CREATE DATABASE は、処理を始める時に(自身を除く)バックエンドプロセスがソースデータベースに接続していないことをチェックします。しかし、コピー先のデータベースの一貫性が失われる結果になる、コピー処理中の変更ができないことを保証しません。従って、テンプレートとして使用するデータベースは読み取りのみとして扱うことを推奨します。
datistemplate とdatallowconn という、データベースそれぞれに有用なフラグが pg_database に存在します。datistemplate はそのデータベースが CREATE DATABASE のテンプレートとして使用されることを目的としているものであることを意味するために設定される可能性があります。このフラグが設定された場合、CREATEDB 権限を持つ全てのユーザはそのデータベースを複製することができます。設定されていない場合は、スーパユーザとデータベース所有者のみがそれを複製することができます。 datallowconn が偽の場合、そのデータベースへの新規接続はできません(しかし、このフラグを偽にするだけでは既存のセッションは閉ざされません)。template0 データベースは、変更を防ぐために、通常 datallowconn = false とされています。 template0 と template1 の両方は、常に datistemplate = true とされていなければなりません。
テンプレートデータベースを準備した後、または、テンプレートデータベースに変更を加えた後に、そのデータベースに対して VACUUM FREEZE か VACUUM FULL FREEZE を実行して下さい。そのデータベースを開くトランザクションが存在しない時にこれを実行した場合、データベース内の全てのタプルは"凍結"され、トランザクション周回問題を防ぐことができます。これは特に、datallowconnが偽のデータベースでは重要です。なぜなら、そのようなデータベースに対して、定常的な VACUUM 保守作業ができないからです。より詳細については Section 8.2.3 を参照して下さい。
Note: template1 と template0 には、 template1 という名前が CREATE DATABASE のデフォルトのソースデータベースの名前であること、および、createdb などの各種スクリプトのデフォルトの接続データベースであること以上の特別な地位はありません。例えば、template1 を削除し、template0 から再作成しても何も問題ありません。この操作は、不注意にゴミを template1 に追加してしまった場合にお勧めします。
インストーレーションのデフォルトの領域以外にも、データベースを作成することが可能です。しかし、すべてのデータベースアクセスはデータベースバックエンドを通じて発生するため、指定されたいかなる領域もバックエンドからアクセスできる必要があります。
作成された代替のデータベース領域へは、意図された記憶領域への絶対パスを指定する環境変数を使って参照されます。この環境変数はサーバの環境に存在し、また、サーバが起動する前に設定されていなければなりません(従って、利用可能な代替領域群はサイト管理者の管理下にあります。一般ユーザは変更することができません)。いかなる名前の環境変数を代替領域を参照するために使用することができます。しかし、他の変数との衝突や混乱をさけるために、環境変数を PGDATA から始まる名前にすることを推奨します。
サーバプロセス環境に変数を作成するために、まず、サーバを停止し、変数を定義し、データ領域を初期化し、最後にサーバを再起動する必要があります( Section 3.6 とSection 3.3を参照して下さい)。環境変数を設定するには、Bourne シェルの場合は、
と、csh や tcsh の場合は、 と入力して下さい。この環境変数が常にサーバの環境で定義されることを確認して下さい。さもないと、そのデータベースへアクセスすることができません。ですので、シェルの初期化ファイルやサーバの起動スクリプトなどに設定する方が良いでしょう。データ格納領域を PGDATA2 に作成する場合、対応するディレクトリ(ここでは、/home/postgres)が常に存在し、サーバを起動するユーザアカウント(Section 3.1を参照)によって書き込み可能であることを確認して下さい。その後、コマンドラインから以下を入力して下さい。
そして、サーバを再起動します。新しい領域にデータベースを作成するためには、以下のコマンドを使用します。
CREATE DATABASE name WITH LOCATION = 'location'
ここで、location は使用した環境変数です。今回の例では PGDATA2 です。createdb には、この目的用の -D オプションがあります。
代替領域に作成されたデータベースは他のデータベースと同じようにアクセスすることができます。
Note: 環境変数を設定することなく、絶対パスを直接 CREATE DATABASE コマンドに指定することも可能です。これは、セキュリティ上の問題がありますので、デフォルトでは使用することができません。使用できるようにするには、 ALLOW_ABSOLUTE_DBPATHS という C プリプロセッサマクロを定義して PostgreSQL をコンパイルしなければなりません。コンパイル時に以下のようにすることが、実現方法の1つです。
gmake CPPFLAGS=-DALLOW_ABSOLUTE_DBPATHS all