このエントリーをはてなブックマークに追加


PostgreSQLのtemplate0とtemplate1の違いについて

psql -lコマンドでデータベース一覧を見るとtemplate0とtemplate1があります。
template0とtemplate1は、createdbやcreate databaseをした時のひな形として利用されます。
この資料は、template0とtemplate1の違いなどについて記述します。

関連記事

本資料で使用した環境

  • OS
    CentOS6(X86_64)
     
  • PostgreSQL(CentOSのRPMパッケージを使用)
    PostgreSQL 8.4.13 on x86_64-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4), 64-bit

initdbによりデータベースクラスタを作成すると作成される

initdbによりデータベースクラスタを作成すると以下の3つのデータベースが作成されます。

  1. postgres
  2. template0
  3. template1 この3つはPostgreSQLに必要なデータベースなので削除してはいけません。

template0, template1に接続してみる

psqlコマンドを使用してtemplate0, template1に接続してみます。

  1. psql -lでデータベースの一覧を表示
    -bash-4.1$ psql -l
                                             データベース一覧
       名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセス権
    -----------+----------+------------------+-------------+-------------------+-----------------------
     postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
     template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres
                                                                               : postgres=CTc/postgres
     template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres
                                                                               : postgres=CTc/postgres
    (3 行)
     
  2. psqlコマンドでtemplate0に接続してみると接続拒否されます。
    -bash-4.1$ psql template0
    psql: FATAL:  現在データベース"template0"は接続を受け付けません
    -bash-4.1$
     
  3. psqlコマンドでtemplate1には接続が可能です。
    -bash-4.1$ psql template1
    psql (8.4.13)
    "help" でヘルプを表示します.
    
    template1=# \q
    -bash-4.1$

上記の操作によりtemplate0は接続拒否されtemplate1には接続が可能です。

template1に接続しテーブルを作成し新規にデータベースを作成してみる

  1. template1に接続し以下のように操作しt1テーブルを作成しました。
    -bash-4.1$ psql template1
    psql (8.4.13)
    "help" でヘルプを表示します.
    
    template1=# create table t1 (c1 int, c2 int);
    CREATE TABLE
    template1=# \d
              リレーションの一覧
     スキーマ | 名前 |    型    |  所有者
    ----------+------+----------+----------
     public   | t1   | テーブル | postgres
    (1 行)
     
  2. create databaseコマンドでdb1データベースを新規に作成してみると、
    template1のひな形が使用されるため、t1テーブルがすでに作成された状態になります。(複製されます。)
    (template1をひな形として使用したため)
    template1=# create database db1;
    CREATE DATABASE
    template1=# \c db1
    psql (8.4.13)
    データベース "db1" に接続しました。.
    db1=# \d
              リレーションの一覧
     スキーマ | 名前 |    型    |  所有者
    ----------+------+----------+----------
     public   | t1   | テーブル | postgres
    (1 行)
    
    db1=# \d t1
       テーブル "public.t1"
     カラム |   型    | 修飾語
    --------+---------+--------
     c1     | integer |
     c2     | integer |
     
     db1=# \q
     
  3. 端末からcreatedbコマンドで作成しても同様にtemplate1をひな形にするためt1テーブルが既に存在します。
    -bash-4.1$ createdb db2
    -bash-4.1$ psql db2
    psql (8.4.13)
    "help" でヘルプを表示します.
    
    db2=# \d
              リレーションの一覧
     スキーマ | 名前 |    型    |  所有者
    ----------+------+----------+----------
     public   | t1   | テーブル | postgres
    (1 行)
    
    db2=# \q

上記のことより、template1に対してテーブルの作成などをしておくと、create database, createdbしたときに
template1をひな形としてデータベースが新規作成されるため、template1の状態が引き継がれます。(複製されます。)

template0を使ってデータベースを作成する

上記ではcreate database, createdbによりデータベースを作成するとtemplate1の状態がひな形として使用されることが確認できました。
以下、template0を使用してデータベースを作成してみます。

  1. createdbコマンドでtemplateを指定してデータベースdb3を作成したときの出力です。
    \dによりテーブルを確認するとテーブルが存在していないことが確認できます。
    -bash-4.1$ createdb --template template0 db3
    -bash-4.1$ psql db3
    psql (8.4.13)
    "help" でヘルプを表示します.
    
    db3=# \d
    リレーションがありません。
    db3=# \q
     
  2. create databaseでtemplate0を指定してデータベースdb4を作成したときの出力です。
    \dによりテーブルを確認するとテーブルが存在していないことが確認できます。
    -bash-4.1$ psql db3
    psql (8.4.13)
    "help" でヘルプを表示します.
    
    db3=# \h create database
    コマンド:     CREATE DATABASE
    説明:         新しいデータベースを作成する
    書式:
    CREATE DATABASE データベース名
        [ [ WITH ] [ OWNER [=] データベースの所有者 ]
               [ TEMPLATE [=] テンプレート名 ]
               [ ENCODING [=] エンコーディング ]
               [ LC_COLLATE [=] 照合順序 ]
               [ LC_CTYPE [=] lc_ctype ]
               [ TABLESPACE [=] テーブルスペース名 ] ]
               [ CONNECTION LIMIT [=] 最大接続数 ] ]
    
    db3=# create database db4 template=template0;
    CREATE DATABASE
    db3=# \c db4
    psql (8.4.13)
    データベース "db4" に接続しました。.
    db4=# \d
    リレーションがありません。
    db4=# \q

以上のことにより、template0を指定するとまっさらなデータベースが作成されることが確認できました。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:08:00