createdbとは?PostgreSQLで新規データベースを作る方法

はい、承知いたしました。PostgreSQLで新規データベースを作成する方法、特にcreatedbコマンドに焦点を当てた詳細な記事を作成します。約5000語を目標に、関連する概念や注意点を含めて網羅的に解説します。


createdbとは?PostgreSQLで新規データベースを作る方法

リレーショナルデータベース管理システム(RDBMS)であるPostgreSQLは、堅牢性、拡張性、標準準拠性の高さから、世界中の多くのシステムで利用されています。Webアプリケーションのバックエンド、データウェアハウス、地理空間データの管理など、その用途は多岐にわたります。

PostgreSQLを利用する上で、最初に行う重要なステップの一つが、新しいデータベースを作成することです。データやテーブルは、特定のデータベースの中に格納されます。システムやアプリケーションごとに異なるデータベースを作成することで、データを論理的に分離し、管理を容易にすることができます。

PostgreSQLで新しいデータベースを作成するには、主に二つの方法があります。

  1. createdb コマンドラインユーティリティを使用する
  2. SQLコマンド CREATE DATABASE を使用する

この記事では、これら二つの方法、特にコマンドラインツールであるcreatedbに焦点を当てて、その使い方、オプション、背後にある概念、そしてどのような状況でどちらの方法を使うのが適切かについて、約5000語の詳細な解説を行います。

1. はじめに:なぜ新しいデータベースが必要なのか

PostgreSQLをインストールすると、デフォルトでいくつかのデータベースが作成されます。代表的なものは以下の通りです。

  • postgres: 管理作業やユーティリティのためのデフォルトデータベース。クライアントが接続する際にデータベース名を指定しない場合、多くはこのデータベースに接続されます。
  • template1: 新しいデータベースを作成する際の標準的なテンプレートとして使用されます。作成されるデータベースは、このtemplate1の複製として作成されます。
  • template0: template1と同様にテンプレートとして使用されますが、こちらは「まっさら」な状態(標準的なカタログ情報のみ)で、エンコーディングやロケールが指定されていないテンプレートです。異なるエンコーディングやロケールを持つデータベースを作成する際に特に有用です。

これらのデフォルトデータベースとは別に、開発するアプリケーションや管理するシステムごとに専用のデータベースを作成するのが一般的です。これにより、以下のようなメリットが得られます。

  • データの分離: アプリケーションAのデータとアプリケーションBのデータを明確に区別し、混ざり合うことを防ぎます。
  • 権限管理: データベースごとに異なるユーザーに対してアクセス権限を設定できます。特定のユーザーは特定のデータベースにしかアクセスできないように制限できます。
  • 管理の容易さ: バックアップやリストアなどの管理作業をデータベース単位で行えます。特定のアプリケーションのデータのみをバックアップ・リストアしたい場合に便利です。
  • 設定の独立性: データベースごとにエンコーディングやロケールなどの設定を持つことができます(これらの設定はデータベース作成時に決定され、後から変更できません)。

このように、PostgreSQLを効果的に利用するためには、目的に応じた新しいデータベースを作成することが不可欠です。

2. createdb コマンドとは

createdbは、PostgreSQLのインストールに含まれるコマンドラインユーティリティです。このコマンドは、PostgreSQLサーバー上で新しいデータベースを作成するための簡単な方法を提供します。

2.1. createdbの正体:CREATE DATABASEのラッパー

重要な点として、createdbコマンド自身が直接データベースを作成するわけではありません。createdbコマンドは、実際にはPostgreSQLサーバーに対してSQLコマンド CREATE DATABASE を発行するクライアントプログラムです。

これは、psqlのようなSQLコマンドラインツールを使ってCREATE DATABASE文を実行するのと本質的には同じ操作です。しかし、createdbはデータベース作成という特定のタスクに特化しており、SQLクライアントを起動して接続し、SQL文を入力するという手順を踏むことなく、シェルから直接簡単にデータベースを作成できる利便性を提供します。

2.2. なぜcreatedbが便利なのか

createdbコマンドが提供される主な理由は、その手軽さスクリプト化の容易さにあります。

  • 手軽さ: データベース名を指定するだけで、最も基本的な形でデータベースを作成できます。例えば、createdb mydatabase と実行するだけで、「mydatabase」という名前のデータベースが作成されます。
  • スクリプト化: シェルスクリプトやバッチファイルから簡単に呼び出すことができます。アプリケーションのデプロイメントスクリプトや初期設定スクリプトの中で、必要なデータベースを自動的に作成するために広く利用されます。

また、createdbは様々なオプションを提供しており、データベース作成時に所有者、エンコーディング、ロケール、テンプレートなどを柔軟に指定できます。これらのオプションも、コマンドライン引数としてシンプルに渡すことができます。

3. createdbコマンドの詳細な使い方

createdbコマンドの基本的な書式は以下の通りです。

bash
createdb [option...] [dbname [description]]

  • option...: データベース作成に関する様々な設定を指定するオプションです。
  • dbname: 作成する新しいデータベースの名前を指定します。省略すると、現在接続しているユーザー名と同じ名前のデータベースを作成しようとします。通常は明示的に指定します。
  • description: オプションでデータベースの説明を指定できます。これはデータベースのコメントとして格納されますが、必須ではありません。

3.1. 最も基本的な使い方

新しいデータベース「mydatabase」を作成する最も簡単なコマンドは以下の通りです。

bash
createdb mydatabase

このコマンドを実行すると、デフォルトの設定で「mydatabase」という名前の新しいデータベースが作成されます。デフォルト設定には、以下のようなものが含まれます。

  • 所有者: コマンドを実行したOSユーザーと同じ名前のデータベースユーザー(ロール)が所有者となります。
  • テンプレート: template1データベースをテンプレートとして使用します。したがって、template1と同じエンコーディング、ロケール設定になります。
  • エンコーディング: template1のエンコーディングが使用されます。通常、PostgreSQLサーバーが初期化された際に設定されたエンコーディング(多くはUTF8)です。
  • ロケール: template1のロケール(LC_COLLATELC_CTYPE)が使用されます。通常、PostgreSQLサーバーが初期化された際に設定されたロケールです。

3.2. 主要なオプションの詳細

createdbコマンドは、データベース作成時の様々な設定をカスタマイズするための多くのオプションを提供しています。ここでは、特に重要なオプションを詳しく見ていきます。

-D template または --template=template

このオプションは、新しいデータベースを作成する際に基となるテンプレートデータベースを指定します。

PostgreSQLでは、新しいデータベースを作成する際に、既存のデータベースを複製するという方法をとります。この複製元のデータベースを「テンプレートデータベース」と呼びます。デフォルトではtemplate1が使用されます。

  • template1: 標準的なテンプレートです。PostgreSQLの初期化によって作成され、基本的なシステムカタログ情報などが含まれています。通常、ユーザーがテーブルや関数などを追加してカスタマイズすることも可能です。新しいデータベースはtemplate1の複製として作成されるため、template1に存在するもの(スキーマ、テーブル、関数など)は新しいデータベースにも引き継がれます。
  • template0: もう一つの標準テンプレートです。template1とは異なり、template0はユーザーによる変更が加えられていない、「まっさら」な状態を保っています。最も重要な特徴は、template0はデータベース作成時にエンコーディングやロケールを指定するための基盤となるという点です。template1を使用する場合、新しいデータベースはtemplate1のエンコーディングとロケールを強制的に引き継ぎます。しかし、template0を使用する場合は、新しいデータベースに任意のエンコーディングとロケールを指定できます。

使用例:

  • template1をテンプレートとして使用(デフォルトと同じ、冗長だが明示的に指定):
    bash
    createdb -D template1 mydatabase
  • template0をテンプレートとして使用(異なるエンコーディング/ロケールで作成する際に必須):
    bash
    createdb -D template0 mydatabase_utf8_c

注意点: template0以外のテンプレートを指定する場合、新しいデータベースは指定されたテンプレートの「正確な複製」として作成されます。つまり、テンプレートデータベース内で進行中のトランザクションがあってはなりません。createdbは、指定されたテンプレートデータベースへの新しい接続を一時的に禁止してから複製を行います。

-E encoding または --encoding=encoding

このオプションは、新しいデータベースの文字エンコーディングを指定します。

文字エンコーディングは、コンピュータが文字をどのようにバイト列として表現するかを定義する規則です。データベースのエンコーディングは、そのデータベース内に格納されるテキストデータがどのようなエンコーディングで表現されるかを決定します。

エンコーディングの選択は非常に重要です。

  • 互換性: アプリケーションやクライアントからの接続時には、クライアント側のエンコーディングとデータベースのエンコーディングの間の変換が行われます。エンコーディングが適切でないと、文字化けやデータの破損の原因となります。
  • 格納可能な文字: 選択したエンコーディングによって、データベースが格納できる文字の種類が決まります。例えば、日本語を扱うにはShift_JISやEUC_JP、UTF-8が必要です。世界中の様々な言語を扱うには、UTF-8が最も一般的で推奨されるエンコーディングです。
  • **後から変更できない: データベースを作成した後にそのエンコーディングを変更することは、非常に困難または不可能です。変更するには、データベースをダンプ(エクスポート)し、目的のエンコーディングを持つ新しいデータベースを作成してからリストア(インポート)する必要があります。

指定できるエンコーディング:

PostgreSQLは、多くの標準的なエンコーディングをサポートしています。主なものは以下の通りです。

  • UTF8: Unicodeの可変長エンコーディング。最も推奨されるエンコーディングで、ほぼすべての文字を扱うことができます。
  • EUC_JP: 日本語EUC。
  • SHIFT_JIS: 日本語Shift_JIS。
  • EUC_KR: 韓国語EUC。
  • BIG5: 繁体字中国語。
  • GBK: 簡体字中国語。
  • LATIN1 (or ISO-8859-1): 西ヨーロッパ言語。
  • SQL_ASCII: これは特殊なエンコーディングで、実際にはエンコーディングのチェックを行いません。ASCII文字だけを含むデータには使えますが、それ以外の文字を扱う場合や、異なるシステムとの間でデータをやり取りする場合には絶対に使用しないでください。文字化けやデータの破損が容易に発生します。

有効なエンコーディング名のリストは、PostgreSQLのドキュメントを参照するか、SQLクライアントで SELECT * FROM pg_encoding_names; を実行して確認できます。

注意点: このオプションを使用する場合、テンプレートとしてtemplate0を指定するか、指定するエンコーディングがテンプレートデータベース(デフォルトではtemplate1)のエンコーディングと互換性がある必要があります。異なるエンコーディングのtemplate1をテンプレートとして使用しようとするとエラーになる場合があります。そのため、エンコーディングを指定する際は、慣習的に-D template0も同時に指定することが多いです。

使用例:

  • UTF8エンコーディングでデータベースを作成する:
    bash
    createdb -E UTF8 mydatabase_utf8
  • Shift_JISエンコーディングでデータベースを作成する(template0を明示的に指定):
    bash
    createdb -D template0 -E SJIS mydatabase_sjis
-l locale または --locale=locale

このオプションは、新しいデータベースのロケール設定を指定します。ロケールは、特定の地域や言語における様々な文化的な規則(文字の分類、ソート順、日付/時刻の書式、数値の書式など)を定義します。

PostgreSQLでは、特に以下の二つのロケール設定が重要です。

  • LC_COLLATE: 文字列のソート順を決定します。例えば、大文字と小文字を区別するか、アクセント記号付きの文字をどのように扱うか、記号をどのように並べるかなどがロケールによって変わります。
  • LC_CTYPE: 文字の分類(文字、数字、空白文字など)や大文字/小文字の変換規則を決定します。

ロケールの選択もエンコーディングと同様に重要です。

  • ソート結果: クエリ結果のORDER BY句によるソート順がロケールに依存します。異なるロケールでソートすると、結果の並び順が変わる可能性があります。
  • LIKE演算子など: 文字列比較を行う関数や演算子(LIKE, ILIKEなど)の挙動も影響を受けます。
  • 正規表現: 正規表現のマッチングにおける文字クラス([:upper:]など)の定義もロケールに依存します。
  • 後から変更できない: エンコーディングと同様に、データベースを作成した後にそのロケールを変更することはできません。

指定できるロケール:

指定できるロケール名は、PostgreSQLサーバーが動作しているOSがサポートしているロケールに依存します。OSがサポートしているロケールは、Linuxシステムであれば locale -a コマンドなどで確認できます。一般的なロケール名としては、「言語_地域.エンコーディング」のような形式が多く使われます(例: ja_JP.UTF-8, en_US.UTF-8)。

PostgreSQLでは、特別なロケールとして以下の二つも使用できます。

  • C (または POSIX): これは最も基本的なロケールで、標準的なASCIIの順序でソートを行います。バイト値に基づくソートとなり、予測可能な挙動を示します。多言語対応が必要なく、予測可能なソート順やパフォーマンスを重視する場合に選択されることがあります。
  • DEFAULT: OSの環境変数(LC_ALL, LC_CTYPE, LANGなど)で設定されているロケールを使用します。createdbコマンドを実行したユーザーの環境設定に依存します。

注意点: ロケールを指定する場合も、エンコーディングと同様に、テンプレートとしてtemplate0を指定するか、指定するロケールがテンプレートデータベース(デフォルトではtemplate1)のロケールと互換性がある必要があります。異なるロケールのtemplate1をテンプレートとして使用しようとするとエラーになる場合があります。そのため、ロケールを指定する際も-D template0を同時に指定することが多いです。また、指定するロケールは、そのデータベースが作成されるサーバーマシンにインストールされ、サポートされている必要があります。

使用例:

  • 日本語(日本)のUTF-8ロケールでデータベースを作成する:
    bash
    createdb -l ja_JP.UTF-8 mydatabase_ja
  • Cロケール(バイト順ソート)でデータベースを作成する(template0と組み合わせる):
    bash
    createdb -D template0 -l C mydatabase_c
  • ロケールとエンコーディングの両方を指定する:
    bash
    createdb -D template0 -E UTF8 -l ja_JP.UTF-8 mydatabase_utf8_ja
-O owner または --owner=owner

このオプションは、作成する新しいデータベースの所有者となるデータベースユーザー(ロール)を指定します。

データベースの所有者は、そのデータベースに対するすべての権限を持ちます。例えば、データベースの削除、設定変更、データベース内のオブジェクト(テーブル、スキーマなど)の作成・変更・削除などを行うことができます。

所有者を明示的に指定しない場合、createdbコマンドを実行したOSユーザーと同じ名前のPostgreSQLユーザー(ロール)が所有者となります。データベース作成前に、指定したい名前のPostgreSQLユーザーが既に存在している必要があります。存在しないユーザーを所有者に指定することはできません。

使用例:

  • myapp_userというPostgreSQLユーザーを所有者としてデータベースを作成する:
    bash
    createdb -O myapp_user myapp_db
-T tablespace または --tablespace=tablespace

このオプションは、新しいデータベースのデフォルトテーブル空間を指定します。

テーブル空間は、データベースオブジェクト(テーブル、インデックスなど)が物理的に格納されるディスク上の場所を定義するPostgreSQLの機能です。異なるテーブル空間を使用することで、特定のテーブルやインデックスを、高速なSSDや大容量のHDDなど、異なる特性を持つストレージデバイスに配置することができます。

このオプションで指定されたテーブル空間は、そのデータベース内でオブジェクトを作成する際に明示的にテーブル空間を指定しなかった場合のデフォルトとなります。このオプションを指定しない場合、データベースのデフォルトテーブル空間は、テンプレートデータベース(通常template1)のデフォルトテーブル空間が引き継がれます。

指定するテーブル空間は、データベース作成前にサーバー上で既に作成されている必要があります。テーブル空間はCREATE TABLESPACE SQLコマンドで作成します。

使用例:

  • my_tablespaceという名前の既存のテーブル空間をデフォルトとしてデータベースを作成する:
    bash
    createdb -T my_tablespace mydatabase
-c connection-limit または --connection-limit=limit

このオプションは、新しいデータベースへの同時接続数の上限を指定します。

特定のデータベースへの接続数が、指定した制限値を超えると、それ以上の接続は拒否されます。これにより、特定のアプリケーションやユーザーがデータベースへの接続を使い果たしてしまうことを防ぎ、サーバー全体のリソース枯渇を避けるのに役立ちます。

limitには非負の整数を指定します。-1を指定すると、接続数に制限がなくなります(デフォルト)。

使用例:

  • 同時接続数を100に制限してデータベースを作成する:
    bash
    createdb -c 100 mydatabase
-e または --echo

このオプションは、createdbコマンドが内部で実行しているSQLコマンド(CREATE DATABASE文)を表示します。

デバッグや学習のために非常に役立ちます。createdbがどのようにオプションをSQL文に変換しているかを確認できます。

使用例:

bash
createdb -e -D template0 -E UTF8 -l ja_JP.UTF8 mydatabase

出力例(バージョンやオプションにより異なります):

CREATE DATABASE mydatabase TEMPLATE template0 ENCODING 'UTF8' LC_COLLATE 'ja_JP.UTF8' LC_CTYPE 'ja_JP.UTF8';

-q または --quiet

このオプションは、通常createdbコマンドが出力する処理メッセージを抑制します。

スクリプトの中でcreatedbを使用する場合など、成功時のメッセージが不要な場合に指定すると、スクリプトの出力を簡潔に保つことができます。エラーメッセージは通常通り表示されます。

使用例:

bash
createdb -q mydatabase

-V または --version

createdbコマンドのバージョン情報を表示します。

-? または --help

createdbコマンドのヘルプメッセージ(オプションリストなど)を表示します。

3.3. サーバーへの接続オプション

createdbコマンドは、データベースを作成するためにPostgreSQLサーバーに接続する必要があります。接続先のサーバーや認証情報を指定するために、以下の標準的な接続オプションを使用できます。これらのオプションは、psqlpg_dumpなど、他のPostgreSQLクライアントユーティリティと共通です。

  • -h host または --host=host: サーバーが稼働しているホスト名またはIPアドレスを指定します。指定しない場合、ローカルホスト(localhostまたはUnixドメインソケット)とみなされます。
  • -p port または --port=port: サーバーが接続を待ち受けているTCPポート番号を指定します。指定しない場合、デフォルトのポート番号(通常5432)または環境変数PGPORTの値が使用されます。
  • -U username または --username=username: サーバーに接続するユーザー名(ロール)を指定します。指定しない場合、コマンドを実行したOSユーザー名と同じ名前のPostgreSQLユーザー名が使用されます。データベースを作成するためには、このユーザーにCREATEDB権限が付与されている必要があります。
  • -W または --password: サーバーに接続する前に、パスワードの入力を強制します。通常、パスワード認証が必要な場合は、PGPASSWORD環境変数を使用するか、パスワードファイルを設定することが推奨されます。-Wオプションを使うと、コマンド実行後にパスワード入力プロンプトが表示されます。
  • --single-transaction: (これはあまり一般的ではありませんが)データベース作成を単一のトランザクションとして実行します。

使用例:

  • リモートホスト上のサーバーに特定のユーザーで接続してデータベースを作成する:
    bash
    createdb -h db.example.com -p 5432 -U admin_user mydatabase

3.4. 環境変数

createdbを含むPostgreSQLクライアントユーティリティの多くのオプションは、環境変数によってデフォルト値を設定できます。これにより、毎回コマンドラインでオプションを指定する手間を省くことができます。

  • PGHOST: 接続先ホストのデフォルト値。
  • PGPORT: 接続先ポートのデフォルト値。
  • PGUSER: 接続ユーザー名のデフォルト値。
  • PGPASSWORD: パスワード。セキュリティ上の理由から、この環境変数にパスワードを設定することは推奨されません。代わりに、パスワードファイル(~/.pgpassなど)を使用する方が安全です。
  • PGDATABASE: 接続するデフォルトデータベース名。createdbの場合、通常はpostgresデータベースなどに接続して、新しいデータベースを作成します。この環境変数が設定されていると、そのデータベースに接続しようとします。

環境変数を使用することで、コマンドラインはよりシンプルになります。

“`bash
export PGHOST=db.example.com
export PGPORT=5432
export PGUSER=admin_user

createdb mydatabase # ホスト、ポート、ユーザーは環境変数から取得される
“`

4. createdbの使用例

いくつかの具体的なシナリオにおけるcreatedbコマンドの使用例を示します。

例1: 最も基本的なデータベース作成

ユーザー名myuserでログインし、myuserというPostgreSQLユーザーが存在する場合、以下のコマンドでmydatabaseを作成します。所有者はmyuserとなり、テンプレート、エンコーディング、ロケールはtemplate1の設定が引き継がれます。

bash
createdb mydatabase

例2: エンコーディングとロケールを指定したデータベース作成

日本語環境でUTF8エンコーディング、日本語ロケール(ja_JP.UTF-8)のデータベースを作成します。異なるエンコーディング/ロケールを指定するため、テンプレートにはtemplate0を使用します。

bash
createdb -D template0 -E UTF8 -l ja_JP.UTF8 my_jp_db

注意: -l ja_JP.UTF8 の部分は、サーバーが稼働しているOSでja_JP.UTF-8ロケールが利用可能である必要があります。利用可能なロケールはOSによって異なります。

例3: 特定の所有者を持つデータベース作成

既に存在するPostgreSQLユーザーapp_ownerを所有者として、app_dbデータベースを作成します。

bash
createdb -O app_owner app_db

注意: コマンドを実行するユーザー(例: postgresスーパーユーザー)には、app_ownerを所有者に指定する権限(通常はスーパーユーザー自身であるか、特定のロールにCREATEDB権限と、指定するロールに対する権限がある場合)が必要です。

例4: リモートサーバー上のデータベース作成

IPアドレス192.168.1.100、ポート番号5433で稼働するPostgreSQLサーバーに、ユーザー名remote_adminとして接続し、remote_dbを作成します。パスワードはコマンド実行後にプロンプトで入力します。

bash
createdb -h 192.168.1.100 -p 5433 -U remote_admin -W remote_db

パスワードを毎回入力したくない場合は、環境変数PGPASSWORDを使用するか、より安全なパスワードファイルを使用します。

例5: 作成されるSQLコマンドを確認する

mydatabaseをデフォルト設定で作成する際に、どのようなSQLコマンドが実行されるかを確認します。

bash
createdb -e mydatabase

例6: 同時接続数制限とデフォルトテーブル空間を指定

同時接続数を50に制限し、デフォルトテーブル空間としてfast_storageを指定してlimited_dbを作成します。

bash
createdb -c 50 -T fast_storage limited_db

注意: fast_storageテーブル空間は、事前にCREATE TABLESPACE fast_storage LOCATION '/path/to/storage'; のようなSQLコマンドで作成しておく必要があります。

これらの例からわかるように、createdbコマンドは非常に柔軟でありながら、シンプルなインターフェースでデータベース作成に必要な多くの設定を行うことができます。

5. CREATE DATABASE SQLコマンド

createdbコマンドはCREATE DATABASE SQLコマンドのラッパーであることを説明しました。では、直接CREATE DATABASE文を使用する場合はどのように記述するのでしょうか。

CREATE DATABASE文の基本的な書式は以下の通りです。

sql
CREATE DATABASE dbname
[ [ WITH ] parameter [ = value ] [, ... ] ];

  • dbname: 作成するデータベースの名前です。
  • parameter [ = value ]: データベース作成に関する様々な設定をキーと値のペアで指定します。複数の設定はカンマ区切りで指定します。WITHキーワードは省略可能です。

5.1. CREATE DATABASEで指定できるパラメータ

createdbコマンドのオプションに対応する、CREATE DATABASE文で指定できる主なパラメータは以下の通りです。

  • TEMPLATE = template: テンプレートデータベースの名前を指定します。createdb-Dオプションに対応します。デフォルトはtemplate1です。
  • ENCODING = encoding: データベースの文字エンコーディングを指定します。createdb-Eオプションに対応します。エンコーディング名はシングルクォートで囲む必要があります。
  • LC_COLLATE = locale: 文字列のソート順に使用するロケールを指定します。createdb-lオプションに対応します。ロケール名はシングルクォートで囲む必要があります。
  • LC_CTYPE = locale: 文字の分類に使用するロケールを指定します。createdb-lオプションは通常、LC_COLLATELC_CTYPEの両方に同じ値を設定します。CREATE DATABASE文では個別に指定することも可能ですが、通常は両方に同じ値を設定することが推奨されます。ロケール名はシングルクォートで囲む必要があります。
  • OWNER = owner: データベースの所有者となるロール名を指定します。createdb-Oオプションに対応します。ロール名はシングルクォートで囲むか、識別子としてダブルクォートで囲みます(ロール名がSQLのキーワードと同じ場合など)。
  • TABLESPACE = tablespace: データベースのデフォルトテーブル空間を指定します。createdb-Tオプションに対応します。テーブル空間名は識別子として扱われるため、ダブルクォートが必要な場合があります。
  • CONNECTION LIMIT = limit: 同時接続数の上限を指定します。createdb-cオプションに対応します。
  • IS_TEMPLATE = boolean: このデータベースを他のデータベースを作成する際のテンプレートとして使用できるかどうかを設定します。TRUEまたはFALSEを指定します。通常、ユーザーが作成したデータベースをテンプレートとして使うことは稀ですが、特殊な用途では設定することがあります。デフォルトはFALSEです。
  • ALLOW_CONNECTIONS = boolean: このデータベースへの接続を許可するかどうかを設定します。TRUE(デフォルト)またはFALSEを指定します。一時的に接続を禁止したい場合などに使用できます。

5.2. CREATE DATABASEの使用例

SQLクライアント(例:psql)に接続した状態で、以下のSQL文を実行してデータベースを作成します。

例1: 最も基本的なデータベース作成

sql
CREATE DATABASE mydatabase;

(これはcreatedb mydatabaseとほぼ同じです)

例2: エンコーディングとロケールを指定

sql
CREATE DATABASE my_jp_db
WITH
TEMPLATE = template0
ENCODING = 'UTF8'
LC_COLLATE = 'ja_JP.UTF8'
LC_CTYPE = 'ja_JP.UTF8';

例3: 特定の所有者と接続数制限を指定

sql
CREATE DATABASE app_db
WITH
OWNER = 'app_owner'
CONNECTION LIMIT = 50;

例4: 複数のオプションを指定

sql
CREATE DATABASE my_full_config_db
WITH
TEMPLATE = template0
ENCODING = 'UTF8'
LC_COLLATE = 'en_US.UTF-8'
LC_CTYPE = 'en_US.UTF-8'
OWNER = 'admin_user'
TABLESPACE = 'ssd_storage'
CONNECTION LIMIT = 100;

CREATE DATABASE文は、より詳細な設定(例えばLC_COLLATELC_CTYPEを個別に指定するなど)が可能ですが、基本的にはcreatedbコマンドで指定できる範囲の設定をカバーしています。

6. createdbCREATE DATABASEの比較と使い分け

createdbコマンドとCREATE DATABASE SQL文は、どちらもPostgreSQLで新しいデータベースを作成する方法ですが、それぞれに利点と欠点があります。

特徴 createdb コマンド CREATE DATABASE SQL文
実行環境 OSのコマンドライン(シェル、バッチファイル) SQLクライアント(psql、GUIツール、アプリケーション内のSQL実行)
手軽さ シンプルな書式で簡単に実行できる SQLクライアントの起動と接続が必要
スクリプト化 非常に容易(シェルスクリプトなど) SQLスクリプトとして実行可能
オプション 主要なオプションをコマンド引数で指定可能 SQL文のパラメータとして柔軟に指定可能(一部、createdbより細かい設定も可能)
トランザクション 通常、自身の単一トランザクションで実行する 他のSQL文と同じトランザクション内で実行可能
エラー処理 コマンドの終了コードや標準エラー出力で判断 SQLエラーコードやメッセージで判断
学習コスト コマンドとオプションを覚えるだけ SQL文の書式とパラメータを覚える必要あり

どのような場合にどちらを選ぶか?

  • createdb を使うのが適している場面:

    • 新しいデータベースを素早く簡単に作成したい場合。
    • インストール手順やデプロイメントスクリプトなどで、データベース作成を自動化したい場合。
    • シェルスクリプトやバッチファイルからデータベースを作成したい場合。
    • 基本的な設定(エンコーディング、ロケール、所有者など)のみで十分な場合。
    • リモートサーバー上のデータベースをコマンドラインから直接作成したい場合。
  • CREATE DATABASE を使うのが適している場面:

    • SQLクライアント(psqlなど)で作業しており、そのままデータベースを作成したい場合。
    • より詳細な設定(例: LC_COLLATELC_CTYPEを異なる値にする)が必要な場合(ただし、これは稀です)。
    • データベース作成を含む一連の操作を、単一のSQLスクリプト内で実行したい場合。
    • アプリケーションコード内で、プログラム的にデータベースを作成したい場合(JDBCやpsycopg2などのライブラリを通じてSQLを実行)。

多くの一般的な用途では、createdbコマンドの手軽さが非常に役立ちます。特に自動化のシナリオでは、createdbが標準的な選択肢となります。しかし、createdbはあくまでCREATE DATABASE文のラッパーであることを理解しておけば、createdbで実現できない詳細な設定が必要になった場合に、CREATE DATABASE文を直接利用するという選択肢があることを知っておくことが重要です。また、-eオプションを使ってcreatedbが発行するCREATE DATABASE文を確認することは、SQLの学習にも繋がります。

7. データベース作成時の考慮事項

新しいデータベースを作成する際には、いくつかの重要な点を考慮する必要があります。これらの設定はデータベース作成後に変更できない(または非常に困難な)ものが多いため、慎重に決定する必要があります。

7.1. データベース名の規則

データベース名は、以下の規則に従う必要があります。

  • 英数字およびアンダースコアを使用できます。
  • 大文字と小文字は区別されます(ただし、SQL文中で引用符なしで使用すると、慣習的に小文字に変換されます)。慣習として、データベース名には小文字の英数字とアンダースコアのみを使用することが推奨されます。
  • PostgreSQLの予約語(user, table, selectなど)と同じ名前は、引用符なしでは使用できません。引用符(ダブルクォート)で囲めば使用できますが、管理が複雑になるため避けるのが賢明です。
  • 名前の長さにはシステムによって制限があります(通常は63バイト程度)。
  • 既に存在するデータベース名と同じ名前は使用できません。

7.2. エンコーディングの選択の重要性

前述の通り、エンコーディングはデータベースの根幹に関わる設定であり、作成後に変更はほぼ不可能です。

  • UTF8の推奨: 世界中のほぼ全ての言語の文字を表現できるUTF8は、最も一般的で推奨されるエンコーディングです。特別な理由がない限り、UTF8を選択することを強く推奨します。
  • クライアントとの整合性: アプリケーションやクライアントツールからの接続時には、クライアント側のエンコーディングとデータベースのエンコーディングの間で変換が行われます。多くのPostgreSQLクライアントはデフォルトでUTF8を使用するため、データベースもUTF8にしておくと、変換が不要になり、シンプルでトラブルが少なくなります。クライアント側のエンコーディングは、client_encoding設定や環境変数PGCLIENTENCODINGで制御できます。
  • OSのエンコーディング: データベース作成時にエンコーディングを明示的に指定しない場合、テンプレートデータベースのエンコーディングが引き継がれます。template1のエンコーディングは、多くの場合、サーバーが初期化(initdb)された際のOSのエンコーディング設定に基づいて決定されます。OSのエンコーディングと異なるエンコーディングでデータベースを作成したい場合は、-D template0 -E <encoding> と明示的に指定する必要があります。

7.3. ロケールの選択の重要性

ロケール設定(特にLC_COLLATELC_CTYPE)も作成後に変更できません。

  • ソート順と文字分類: アプリケーションで文字列のソート順や文字分類(例: 大文字小文字の区別、空白文字の定義)が重要な場合、適切なロケールを選択することが不可欠です。日本のユーザー向けアプリケーションであればja_JP.UTF-8などが適切かもしれません。
  • パフォーマンス: ロケールによっては、文字列比較やソートの処理が複雑になり、パフォーマンスに影響を与える場合があります。特にCロケールやPOSIXロケールは、バイト値に基づく単純なソートを行うため、他のロケールに比べて高速な場合があります。
  • OSのロケール: エンコーディングと同様に、ロケールを明示的に指定しない場合、テンプレートデータベースのロケールが引き継がれます。template1のロケールは、サーバーが初期化された際のOSのロケール設定に基づいて決定されます。OSのロケールと異なるロケールでデータベースを作成したい場合は、-D template0 -l <locale> と明示的に指定する必要があります。指定するロケールがOSにインストールされ、利用可能である必要があります。
  • Cロケールの利用: グローバルなアプリケーションや、予測可能で環境に依存しないソート順が必要な場合、またはパフォーマンスを重視する場合には、Cロケールを選択することがあります。Cロケールでは、文字はバイト値の順にソートされます。

7.4. 所有者の権限

データベースの所有者は、そのデータベース内のすべてのオブジェクトに対する全ての権限を持ちます。データベースを管理する上で、所有者のロールは非常に重要です。

  • 最小権限の原則: アプリケーションがデータベースに接続する際に使用するユーザー(ロール)は、必要最低限の権限のみを持つようにするのがセキュリティ上のベストプラクティスです。アプリケーションユーザーをデータベースの所有者にするのではなく、データベース作成時や作成後に、専用のアプリケーションユーザーに必要な権限(テーブルのSELECT/INSERT/UPDATE/DELETEなど)をGRANTするのが一般的です。
  • スーパーユーザー: データベースを作成するには、通常スーパーユーザー権限を持つロール(例: postgres)か、CREATEDB属性が付与されたロールが必要です。createdbコマンドを実行するユーザーが、これらの権限を持っている必要があります。

7.5. テンプレートデータベースの役割

template1はカスタマイズ可能ですが、template0は「まっさら」な状態を保つという設計意図があります。異なるエンコーディングやロケールを持つデータベースを作成する際には、必ずtemplate0をテンプレートとして使用してください。これにより、テンプレートデータベースのエンコーディング/ロケールが新しいデータベースに強制的に引き継がれる問題を回避できます。

もし、特定のスキーマや関数など、共通のオブジェクトを全ての新しいデータベースに含めたい場合は、template1をカスタマイズする方法もあります。しかし、template1に不注意な変更を加えると、以降作成される全てのデータベースに影響するため、慎重に行う必要があります。また、template1をカスタマイズした場合でも、異なるエンコーディングやロケールのデータベースを作成する際には、やはりtemplate0を使用する必要があります。

8. トラブルシューティング

createdbコマンドの実行中に発生する可能性のある一般的なエラーとその対処法について説明します。

8.1. 権限エラー (permission denied)

createdb: error: permission denied to create database "mydatabase"
または
createdb: error: role "myuser" is not permitted to create databases

原因: データベースを作成しようとしているユーザー(createdbコマンドを実行しているユーザー、または-Uオプションで指定したユーザー)に、データベースを作成するためのCREATEDB属性が付与されていません。

対処法: PostgreSQLのスーパーユーザー(例: postgres)または既にCREATEDB属性を持つ別のユーザーで接続し、問題のユーザーにCREATEDB属性を付与します。

sql
-- psqlなどでスーパーユーザーとして接続
ALTER ROLE myuser CREATEDB;

または
sql
-- 新しいロールを作成し、CREATEDB属性を付与
CREATE ROLE new_creator LOGIN CREATEDB PASSWORD 'mypassword';

その後、new_creatorユーザーとしてcreatedbコマンドを実行します。

8.2. サーバーへの接続エラー

createdb: error: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?

原因: PostgreSQLサーバーが起動していない、指定したホストやポートで接続を待ち受けていない、ファイアウォールによって接続がブロックされている、クライアント認証設定(pg_hba.conf)により接続が拒否されている、などの理由が考えられます。

対処法:

  1. PostgreSQLサーバーが起動しているか確認します。
  2. サーバーが正しいホストとポートで接続を待ち受けているか確認します(postgresql.conflisten_addressesport設定)。
  3. クライアントからサーバーへのネットワーク経路が確保されているか(ファイアウォール設定など)確認します。
  4. サーバーのpg_hba.confファイルを確認し、接続しようとしているホスト、ユーザー、データベース(通常postgresまたはtemplate1)からの接続が許可されているか確認します。必要であれば設定を変更し、PostgreSQLサーバーをリロードまたは再起動します。
  5. createdbコマンドで指定したホスト名、ポート番号、ユーザー名、パスワードが正しいか確認します。

8.3. エンコーディングまたはロケールのエラー

createdb: error: invalid encoding name "UTF-8" (unterminated identifier)
(エンコーディング名が正しくない、または引用符が必要な場合に発生しやすい)

createdb: error: encoding "UTF-8" does not match locale "C"
Detail: The selected LC_CTYPE setting requires encoding "ASCII".

(指定したエンコーディングとロケールが互換性がない、またはテンプレートのエンコーディング/ロケールと矛盾する場合)

createdb: error: could not create locale "ja_JP.UTF-8": No such file or directory
(指定したロケールがサーバーが稼働しているOSにインストールされていない、または有効になっていない)

原因:

  • 指定したエンコーディング名が間違っているか、PostgreSQLでサポートされていない。
  • 指定したロケール名が間違っているか、サーバーのOSにインストールされていない。
  • 指定したエンコーディングとロケール(特にLC_CTYPE)の組み合わせが互換性がない。
  • テンプレートデータベース(デフォルトtemplate1)が指定したエンコーディングまたはロケールと異なる設定になっているのに、-D template0を指定していない。

対処法:

  1. 有効なエンコーディング名、ロケール名を使用しているか確認します。SQLクライアントでSELECT * FROM pg_encoding_names; や OS上で locale -a を実行して確認できます。
  2. エンコーディングまたはロケールを指定してデータベースを作成する場合、特にtemplate1のエンコーディング/ロケールと異なる設定にする場合は、-D template0オプションを必ず指定します。
  3. 指定するロケール(例: ja_JP.UTF-8)が、PostgreSQLサーバーが稼働しているOSにインストールされ、有効になっているか確認します。必要であればOSのロケール設定を行います。

8.4. データベース名重複エラー

createdb: error: database "mydatabase" already exists

原因: 指定した名前のデータベースが既に存在しています。

対処法: 別のデータベース名を指定するか、既存のデータベースが不要であれば、dropdbコマンドまたはDROP DATABASE SQL文で削除してから再度作成します。

bash
dropdb mydatabase # コマンドライン

または
sql
-- psqlなどで接続
DROP DATABASE mydatabase;

注意: データベースを削除すると、そのデータベース内の全てのデータが失われます。慎重に実行してください。

9. データベース作成後のステップ

新しいデータベースを作成しただけでは、まだ中に何もデータ構造(テーブルなど)は含まれていません。データベース作成後には、通常以下のステップに進みます。

  1. 新しいデータベースへの接続: psqlコマンドやGUIツール、アプリケーションから、作成したデータベース名(例: mydatabase)を指定して接続します。
    bash
    psql mydatabase
  2. スキーマ、テーブル、その他のオブジェクトの作成: 接続したデータベース内で、CREATE SCHEMA, CREATE TABLE, CREATE INDEX, CREATE SEQUENCE, CREATE VIEW, CREATE FUNCTIONなどのSQLコマンドを実行して、アプリケーションが必要とするデータ構造やオブジェクトを作成します。
    sql
    -- psql接続後
    CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE
    );
  3. ユーザーと権限の設定: アプリケーションが使用するデータベースユーザーを作成し、作成したデータベースやその中のオブジェクトに対する適切な権限(SELECT, INSERT, UPDATE, DELETEなど)をGRANTコマンドで付与します。データベースの所有者には全ての権限がありますが、セキュリティのために専用のユーザーを作成し、最小権限を与えます。
    sql
    -- psql接続後、スーパーユーザーまたはデータベース所有者として
    CREATE ROLE app_user LOGIN PASSWORD 'secure_password';
    GRANT CONNECT ON DATABASE mydatabase TO app_user; -- データベースへの接続権限
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE users TO app_user; -- 特定のテーブルへの権限
    -- 必要に応じて他のテーブルやオブジェクトへの権限も付与
  4. データのインポート(必要に応じて): 既存のデータがある場合は、COPYコマンドやpg_restoreなどのツールを使用して新しいデータベースにデータをインポートします。

10. まとめ

この記事では、PostgreSQLで新しいデータベースを作成するための二つの主要な方法、createdbコマンドとCREATE DATABASE SQL文について、その詳細、オプション、使用例、そして重要な考慮事項やトラブルシューティングを含めて網羅的に解説しました。

  • createdb は、コマンドラインから手軽にデータベースを作成するためのユーティリティであり、自動化スクリプトなどで広く利用されます。
  • CREATE DATABASE は、SQLレベルでのデータベース作成方法であり、SQLクライアントから実行する場合や、より詳細な設定が必要な場合に利用されます。createdbはこのSQL文のラッパーです。

データベース作成時には、特に以下の点を慎重に検討し、設定する必要があります。

  • データベース名: 規則に従い、分かりやすい名前を選びます。
  • エンコーディング (-E または ENCODING): 通常はUTF8を強く推奨します。作成後に変更は非常に困難です。
  • ロケール (-l または LC_COLLATE/LC_CTYPE): 文字列のソート順などに影響します。作成後に変更は困難です。-D template0オプションとの組み合わせが重要です。
  • 所有者 (-O または OWNER): データベース管理権限を持つロールを指定します。
  • テンプレート (-D または TEMPLATE): 異なるエンコーディング/ロケールで作成する場合は必ずtemplate0を使用します。

PostgreSQLでのデータベース作成は、データベース管理の基本的なスキルです。この記事が、createdbコマンドの使い方を深く理解し、適切な設定で新しいデータベースを効率的に作成するための一助となれば幸いです。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール