はい、承知いたしました。PostgreSQLで新規データベースを作成する方法、特にcreatedb
コマンドに焦点を当てた詳細な記事を作成します。約5000語を目標に、関連する概念や注意点を含めて網羅的に解説します。
createdbとは?PostgreSQLで新規データベースを作る方法
リレーショナルデータベース管理システム(RDBMS)であるPostgreSQLは、堅牢性、拡張性、標準準拠性の高さから、世界中の多くのシステムで利用されています。Webアプリケーションのバックエンド、データウェアハウス、地理空間データの管理など、その用途は多岐にわたります。
PostgreSQLを利用する上で、最初に行う重要なステップの一つが、新しいデータベースを作成することです。データやテーブルは、特定のデータベースの中に格納されます。システムやアプリケーションごとに異なるデータベースを作成することで、データを論理的に分離し、管理を容易にすることができます。
PostgreSQLで新しいデータベースを作成するには、主に二つの方法があります。
createdb
コマンドラインユーティリティを使用する- 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_COLLATE
とLC_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 mydatabasetemplate0
をテンプレートとして使用(異なるエンコーディング/ロケールで作成する際に必須):
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
(orISO-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サーバーに接続する必要があります。接続先のサーバーや認証情報を指定するために、以下の標準的な接続オプションを使用できます。これらのオプションは、psql
やpg_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_COLLATE
とLC_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_COLLATE
とLC_CTYPE
を個別に指定するなど)が可能ですが、基本的にはcreatedb
コマンドで指定できる範囲の設定をカバーしています。
6. createdb
とCREATE 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_COLLATE
とLC_CTYPE
を異なる値にする)が必要な場合(ただし、これは稀です)。 - データベース作成を含む一連の操作を、単一のSQLスクリプト内で実行したい場合。
- アプリケーションコード内で、プログラム的にデータベースを作成したい場合(JDBCやpsycopg2などのライブラリを通じてSQLを実行)。
- 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_COLLATE
とLC_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
)により接続が拒否されている、などの理由が考えられます。
対処法:
- PostgreSQLサーバーが起動しているか確認します。
- サーバーが正しいホストとポートで接続を待ち受けているか確認します(
postgresql.conf
のlisten_addresses
とport
設定)。 - クライアントからサーバーへのネットワーク経路が確保されているか(ファイアウォール設定など)確認します。
- サーバーの
pg_hba.conf
ファイルを確認し、接続しようとしているホスト、ユーザー、データベース(通常postgres
またはtemplate1
)からの接続が許可されているか確認します。必要であれば設定を変更し、PostgreSQLサーバーをリロードまたは再起動します。 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
を指定していない。
対処法:
- 有効なエンコーディング名、ロケール名を使用しているか確認します。SQLクライアントで
SELECT * FROM pg_encoding_names;
や OS上でlocale -a
を実行して確認できます。 - エンコーディングまたはロケールを指定してデータベースを作成する場合、特に
template1
のエンコーディング/ロケールと異なる設定にする場合は、-D template0
オプションを必ず指定します。 - 指定するロケール(例:
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. データベース作成後のステップ
新しいデータベースを作成しただけでは、まだ中に何もデータ構造(テーブルなど)は含まれていません。データベース作成後には、通常以下のステップに進みます。
- 新しいデータベースへの接続:
psql
コマンドやGUIツール、アプリケーションから、作成したデータベース名(例:mydatabase
)を指定して接続します。
bash
psql mydatabase - スキーマ、テーブル、その他のオブジェクトの作成: 接続したデータベース内で、
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
); - ユーザーと権限の設定: アプリケーションが使用するデータベースユーザーを作成し、作成したデータベースやその中のオブジェクトに対する適切な権限(
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; -- 特定のテーブルへの権限
-- 必要に応じて他のテーブルやオブジェクトへの権限も付与 - データのインポート(必要に応じて): 既存のデータがある場合は、
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
コマンドの使い方を深く理解し、適切な設定で新しいデータベースを効率的に作成するための一助となれば幸いです。