PostgreSQL   PostgreSQLの環境設定
  2022/10/02


PostgreSQLの環境設定

次にPostgreSQLのデータベースを使えるように各種の設定を行います。

●専用の管理者ユーザーを作ろう
えーと、開発環境や勉強目的でPC-UNIXを個人で使っている場合には、 普段自分が使っているユーザーアカウントでPostgreSQLデータベースの管理をしてもいいのですが、 ここでは、PostgreSQL専用の管理者ユーザーを作ることにします。 サーバ上で本格的に使う場合にはPostgreSQL専用のユーザーで管理すべきなのと、 インターネットで検索できる情報のほとんどがその環境を前提としているので、それに従ったまでです。 「どうせ個人使用だから別にええねん」という場合はここはスキップしても構いません。 PostgreSQL管理者の名前としては「postgres」が慣習的によく使われます。 LinuxやFreeBSDだとuseradd(またはadduser)、Solarisではadmintoolなどのコマンドで postgres というアカウントを作れます。

% su root
# groupadd apps
# useradd  postgres
 そして、標準のデータベース置き場となるディレクトリを作ります。 このディレクトリも、慣習的に /usr/local/pgsql/data という位置がよく使われます。mkdirコマンドでディレクトリを作り、所有者をpostgresにしておきます。
# mkdir /usr/local/pgsql/data
# chgrp apps     /usr/local/pgsql/data
# chown postgres /usr/local/pgsql/data

●環境設定
以下の作業はpostgresで行います。

  1. .bashrc や.cshrcを編集して下の行を追加します。
    # Cシェル系のシェルの場合
    setenv PGDATA /usr/local/pgsql/data
    setenv PATH   /usr/local/pgsql/bin:{環境により任意}
    setenv LD_LIBRARY_PATH /usr/local/pgsql/lib:{環境により任意}
    setenv MANPATH         /usr/local/pgsql/man:{環境により任意}
    
    # sh系のシェルの場合
    export PGDATA=/usr/local/pgsql/data
    export PATH=/usr/local/pgsql/bin:{環境により任意}
    export LD_LIBRARY_PATH=/usr/local/pgsql/lib:{環境により任意}
    export MANPATH=/usr/local/pgsql/man:{環境により任意}
    
  2. 再ログインするか、ログインスクリプトを再ロードします。
    # Cシェル系のシェルの場合
    source .cshrc
    # sh系のシェルの場合
    . .bashrc
    

●初期化
次にpostgresユーザーでデータベースファイルを置くディレクトリ、$PGDATA を初期化します。
下記のinitdbを含む多くのPostgreSQLコマンドは、「-D /usr/local/pgsql/data」 のように-Dオプションでデータベースファイルを置く場所(データベースクラスタと言います) を指定できますが、環境変数 PGDATA を定義してあれば省略できます。 以降の説明では全て-Dをつけない例でご紹介します。

% initdb
initdbコマンドで $PGDATA(上では/usr/local/pgsql/data)に .confファイルを作るなどの用意がされます。
デフォルトでは、ここにこれから作成するデータベースの文字コードはUTF-8になりますが、 変更したい場合は--encoding(-E)オプションで指定できます。 またはこの後createdbというコマンドでデータベースを作るときにも、 個々のデータベースの文字コードを再設定できます。

●サーバープロセスの起動とデータベースの作成

  1. PostgreSQLのサーバープロセスは、pg_ctl コマンドで起動、停止、再起動ができます。 昔はpostmasterという名前で、TCP/IPネットワーク接続を許可する-iとデーモンモードで常駐する-Sを付けて 「postmaster -iS」というコマンドで起動していましたが、今はこれらのオプションはなくなっています。
    % pg_ctl -l /home/postgres/logs/pgsql.log start
    
  2. データベースを作ります。名前は何でもよいのですが、 インターネットで公開されている先達皆様のブログやチュートリアルの多くで mydbという名前が使われているので、それにします。
    % createdb mydb
    
    繰り返しになりますが、ここでも-Eオプションで文字コードを変更できます。
  3. ではさっそくデータベースを操作してみます。コマンドラインのツールの名前は psqlです。OracleのSQL*Plusのような物だと言えばその手の方には一発でしょう。
    % psql mydb
    mydb=>
    
    ここでCREATE TABLE文でテーブルを作ると、mydbデータベースのpublicスキーマに、 所有者(オーナー)がpostgresユーザーのテーブルとして格納されます。
    このまま実用にしてもいいのですが、本格的な運用ではpostgresユーザーは管理に専念させ、 個別の業務システム・アプリケーションには専用の「スキーマ」と「ユーザー」を定義するのが普通です。
    それは後述するとしてまずはpsqlを抜けましょう。終了するには「\q」と打ってEnterを押します。

●特権ユーザーの概念
ここで私のような初心者は疑問に思うわけです。 PostgresSQLが動いているサーバにログインできるOSユーザーはデータベースの作成も削除も (dropdbというコマンドがあります)自由にできて、データベースにはパスワード不要で接続できて、 テーブルの作成も削除も自由にできるとしたら、危ないじゃないか!
はい、その通りだとめちゃめちゃ危ないです。 実際にはpostgresというOSユーザーだけが、それらの事を自由にできます。 その理由は、initdbを実行したOSユーザーだからになります。 「postgres」という名前だからとか、サーバープロセスを起動したユーザーだからというのは、 直接的な理由ではありません。
データベースを作成すると、そのデータベースが所属するデータベースクラスタ(つまり$PGDATA) のinitdbを実行したOSユーザーと同名のDBユーザーが自動的に作られます。 ここではpostgresという名前です。
psqlなどの多くのコマンドでは、DBユーザーを-Uオプションで指定しますが、 省略するとログインしているOSユーザーと同名のDBユーザーとみなします。 つまりOSユーザーpostgresで単にpsqlとだけ打つと、DBユーザーpostgresでDB接続を試みていると解釈されます。
後述しますが $PGDATA/pg_hba.conf という設定ファイルで、 ローカル接続の認証方法が初期状態で trust となっています。 これは認証不要という意味で、そのためにpsqlにはパスワード認証なく入ることができるのです。

  もくじ
PostgreSQL   (C) 2002-2022 MISUMI URANO (2000/01/12 - 2022/10/02)