PostgreSQLのテーブル空間により、データベース管理者はデータベースオブジェクトを表すファイルを格納できるファイルシステム上の場所を定義することができます。 テーブル空間を一度作成すると、データベースオブジェクトを作成する時に名前により参照することができます。
テーブル空間を使用することで、管理者はPostgreSQLインストレーションのディスクレイアウトを制御することができます。 これは、少なくとも2つの点で有用です。 1つは、クラスタを初期化したパーティションもしくはボリュームの容量が不足し、拡張を行うことができない場合、システムを再構成するまで、別のパーティションにテーブル空間を作成して、このテーブル空間を使用することができます。
もう1つは、テーブル空間により、管理者はデータベースオブジェクトの使用パターンに基づいてデータ格納場所を調整することができることです。 例えば、非常によく使用されるインデックスを、例えば、高価なソリッドステートディスクなどの高速・高可用性ディスクに格納することができます。 同時に、めったに使用されない保存用のデータや性能が求められていない保存用のデータを格納するテーブルを低価格・低速ディスクシステムに格納することもできます。
主PostgreSQLデータディレクトリの外に位置していたとしても、テーブル空間はデータベースクラスタの不可欠な部分であり、データファイルの自律的な集合として扱うことはできません。 それらは主データディレクトリに含まれるメタデータに依存しますので、異なるデータベースクラスタに所属させたり、個別にバックアップしたりすることはできません。 同様に、テーブル空間を失えば(ファイル削除、ディスクの破損など)、データベースクラスタは読み取れなくなったり、開始できなくなったりするかもしれません。 テーブル空間をRAMディスクのような一時ファイルシステムに置くことは、クラスタ全体の信頼性を危険にさらします。
テーブル空間を定義するにはCREATE TABLESPACEコマンドを使用してください。 以下に例を示します。
CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';
この場所は、既存かつ空のディレクトリでなければならず、また、PostgreSQLオペレーティングシステムユーザが所有していなければなりません。 その後に、テーブル空間内に作成されるオブジェクトはすべてこのディレクトリ以下のファイルに格納されます。 テーブル空間が見つからなかったり失われたりするとクラスタは機能しませんので、この場所は取り外し可能な記憶装置や一時的な記憶装置上にあってはいけません。
通常、論理ファイルシステム内の個々のファイルの場所を制御することができませんので、1つの論理ファイルシステムに複数のテーブル空間を作成することは意味がありません。 しかし、PostgreSQLにはこうした制限はありません。 実際、システムのファイルシステムの境を直接意識しません。 単に使用することを宣言したディレクトリにファイルを格納します。
テーブル空間自体の生成はデータベーススーパーユーザが行う必要があります。
しかし、その後に、データベース一般ユーザにそのテーブル空間を使用させることができます。
これを行うには、ユーザにテーブル空間に対するCREATE
権限を与えてください。
テーブル、インデックス、およびデータベース全体は特定のテーブル空間に割り当て可能です。
これを行うには、指定テーブル空間にCREATE
権限を持つユーザが関連するコマンドにテーブル空間をパラメータとして渡す必要があります。
例えば、以下はspace1
テーブル空間にあるテーブルを作成しています。
CREATE TABLE foo(i int) TABLESPACE space1;
他の方法として、以下のようにdefault_tablespaceパラメータの使用があります。
SET default_tablespace = space1; CREATE TABLE foo(i int);
default_tablespace
が空文字以外の何かに設定された場合、この値が、明示的なテーブル空間の指定がないCREATE TABLE
コマンドやCREATE INDEX
コマンドの暗黙的な TABLESPACE
句として適用されます。
temp_tablespacesというパラメータも存在します。 これは、一時テーブルとそのインデックス、大規模データ集合のソートなどを目的に使用される一時ファイルの場所を決定するものです。 これは、テーブル空間名を1つだけ指定するものではなく、テーブル空間名のリストを取ることができます。 このため、一時的なオブジェクトに関連する負荷を、複数のテーブル空間にわたって分散することができます。 一時的なオブジェクトを作成する度に、このリストから無作為に要素が選択されます。
データベースに関連付けされたテーブル空間は、そのデータベースのシステムカタログを格納するために使用されます。
さらに、TABLESPACE
句を付けずに、または、(適切な)default_tablespace
やtemp_tablespaces
で指定された選択肢がなければ、データベース内に作成されたテーブルやインデックスのデフォルトのテーブル空間としても使用されます。
テーブル空間の指定なしで作成されたデータベースは、コピー元のテンプレートデータベースのテーブル空間と同じものを使用します。
データベースクラスタが初期化される時に2つのテーブル空間が自動的に作成されます。
pg_global
テーブル空間は共有システムカタログ用に使用されます。
pg_default
テーブル空間はtemplate1
とtemplate0
データベースのデフォルトテーブル空間です
(したがって、CREATE DATABASE
のTABLESPACE
句で変更されない限り、このテーブル空間が同様に他のデータベースに対するデフォルトのテーブル空間になります)。
テーブル空間は、一度作成すると、要求しているユーザが十分な権限を持っていればすべてのデータベースから使用することができます。 これは、テーブル空間を使用するすべてのデータベースのすべてのオブジェクトが削除されるまで、そのテーブル空間を削除できないことを意味します。
空のテーブル空間を削除するには、DROP TABLESPACEコマンドを使用してください。
既存のテーブル空間群を求めるには、以下の例のようにpg_tablespace
を確認してください。
SELECT spcname FROM pg_tablespace;
また、psqlプログラムの\db
メタコマンドも既存のテーブル空間を列挙する際に役に立ちます。
テーブル空間の実装を単純化するために、PostgreSQLはシンボリックリンクを使用します。 これは、テーブル空間はシンボリックリンクをサポートするシステムでのみ使用することができるということを意味します。
$PGDATA/pg_tblspc
ディレクトリには、そのクラスタで定義された非組み込みテーブル空間1つひとつを指し示すシンボリックリンクがあります。
推奨はしませんが、こうしたリンクを手作業で再定義してテーブル空間のレイアウトを調整することができます。
2点警告します。
これをサーバが実行している時に行わないでください。
PostgreSQL 9.1およびそれ以前の場合、pg_tablespace
カタログを新規の場所に更新してください。
(これを行わないと、pg_dump
は古いテーブル空間の場所に出力し続けます。)