189
172

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PostgreSQL を Red Hat 系 Linux にインストールするには

Last updated at Posted at 2018-07-11

PostgreSQL を Red Hat Enterprise Linux (以下、RHEL) や Rocky Linux、AlmaLinux などの Red Hat 系 Linux にインストールする手順について少し詳しく説明します。Windows へのインストールについては こちらの記事 を参照してください。

説明は基本的に PostgreSQL 16、RHEL 9 を対象にしますが、バージョンによって異なる部分はなるべく補足します。

PostgreSQL のインストール

PostgreSQL のインストール方法はいくつかあります。おもな方法は以下のとおりです。

  • ソースコードからビルド
  • OS 標準の Yum リポジトリを使う
  • PostgreSQL 開発元の Yum リポジトリを使う

ソースコードからビルドする方法は、最新バージョンを使えますが、最初にビルド環境を整えたり、バージョンアップのたびにビルドしたりするのに手間がかかります。

OS 標準の Yum リポジトリを使う方法は、すぐにインストールできて、手間がかかりませんが、最新バージョンを使えません。

ここでは、最初に Yum リポジトリを追加するだけで、あまり手間がかからず、最新バージョンを使える方法として、PostgreSQL 開発元の Yum リポジトリを使ってインストールします。

PostgreSQL 開発元 Yum リポジトリの追加

PostgreSQL 開発元の Yum リポジトリを使うには、リポジトリパッケージをインストールし、Yum リポジトリを追加します。リポジトリパッケージは以下のページからダウンロードできます。

Repo RPMs - PostgreSQL YUM Repository
https://yum.postgresql.org/repopackages.php

上記のページで OS に応じたリポジトリパッケージをダウンロードします。

ここでは、RHEL 9 (x86_64) にインストールするので、「Red Hat Enterprise Linux 9 - x86_64」の URL をコピーします。

コピーした URL を引数に指定し、リポジトリパッケージをインストールします。

$ sudo dnf -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
(省略)
インストール済み:
  pgdg-redhat-repo-42.0-38PGDG.noarch

完了しました!

OS 標準の postgresql モジュールが優先されないように無効化します。

$ sudo dnf -y module disable postgresql
(省略)
完了しました!

RHEL 7 では、dnf コマンドの代わりに yum コマンドを使います。postgresql モジュールの無効化は不要です。

これで、PostgreSQL とその関連ソフトウェアのパッケージをインストールできるようになります。

PostgreSQL パッケージのインストール

PostgreSQL のパッケージは以下のサブパッケージからなります。

パッケージ名 説明
postgresql16 クライアントプログラム
postgresql16-libs 共有ライブラリ
postgresql16-server サーバプログラム
postgresql16-docs マニュアル
postgresql16-contrib 追加モジュール
postgresql16-devel 開発用ヘッダファイルとライブラリ
postgresql16-llvmjit JIT コンパイル対応
postgresql16-plperl PL/Perl (Perl 手続き言語)
postgresql16-plpython3 PL/Python (Python 3 手続き言語)
postgresql16-pltcl PL/Tcl (Tcl 手続き言語)
postgresql16-test テストツール

PostgreSQL をサーバとして使うには、postgresql16-server パッケージをインストールします。

$ sudo dnf -y install postgresql16-server
(省略)
インストール済み:
  lz4-1.9.3-5.el9.x86_64
  postgresql16-16.1-2PGDG.rhel9.x86_64
  postgresql16-libs-16.1-2PGDG.rhel9.x86_64
  postgresql16-server-16.1-2PGDG.rhel9.x86_64

完了しました!

RHEL 7 では、dnf コマンドの代わりに yum コマンドを使います。

postgresql16-server パッケージをインストールすると、依存関係で postgresql16postgresql16-libslz4 の 3 つのパッケージがインストールされます。lz4 パッケージはバージョン 14 で追加の LZ4 圧縮に必要なライブラリです。

PostgreSQL のインストール先はバージョンごとに異なります。バージョン 16 であれば /usr/pgsql-16 になります。同じ環境に複数のバージョンをインストールすることもできます。

$ ls /usr/pgsql-16
bin  lib  share

また、postgresql16-server パッケージのインストール時に PostgreSQL のスーパーユーザ postgres が存在しなければ、作成されます。

$ id postgres
uid=26(postgres) gid=26(postgres) groups=26(postgres)

データベースクラスタの作成

データベースクラスタとはデータベースを格納する領域のことです。データベースサーバの起動にはデータベースクラスタが必要です。

データベースクラスタの作成は initdb コマンドで行います。OS に付属のスクリプト postgresql-16-setup でもできますが、認証方式が固定で指定できず、わざわざ使うメリットはほとんどないでしょう。

データベースクラスタの作成先は環境変数 PGDATA または -D オプションで指定します。デフォルトは /var/lib/pgsql/16/data で、postgres ユーザの設定ファイル ~/.bash_profile で環境変数 PGDATA に指定されています。ただ、このファイルは 後述の理由 により直接編集すべきでないため、データベースクラスタの場所を変更する場合には -D オプションを使ったほうがいいでしょう。

そのほかに指定するオプションとして、ここでは、-E UTF8 オプションでデータベース作成時のデフォルトのエンコーディングに UTF8--locale=C オプションで同じくデフォルトのロケールに C (ロケールなし)、-A scram-sha-256 オプションで認証方式に scram-sha-256 (SCRAM-SHA-256 暗号化によるパスワード認証)、-W オプションでパスワード設定の入力プロンプトを表示するように指定します。

ロケールは言語や国によって異なる文字の扱いや並び替え順を指定するものです。日本語ではロケールを使う必要があまりなく、ロケールを使うと文字の処理が遅くなり、インデックスの作成時にオプションを指定しないと、LIKE でインデックスも使えなくなるので、ロケールを使わないようにします。

initdb コマンドは postgres ユーザで実行する必要があるため、su コマンドでユーザを切り替えて実行します。途中でパスワード設定の入力プロンプトが表示されるので、同じパスワードを繰り返し二回入力します。実行が完了したら、exit コマンドで元のユーザに戻ります。

$ sudo su - postgres
$ /usr/pgsql-16/bin/initdb -E UTF8 --locale=C -A scram-sha-256 -W
データベースシステム内のファイルの所有者はユーザー"postgres"となります。
このユーザーをサーバープロセスの所有者とする必要があります。

データベースクラスタはロケール"C"で初期化されます。
デフォルトのテキスト検索構成は english に設定されます。

データベージのチェックサムは無効です。

新しいスーパーユーザーのパスワードを入力してください: (パスワードを入力)
再入力してください: (パスワードを再入力)

ディレクトリ/var/lib/pgsql/16/dataの権限を設定しています ... ok
サブディレクトリを作成しています ... ok
動的共有メモリの実装を選択しています ... posix
デフォルトのmax_connectionsを選択しています ... 100
デフォルトのshared_buffersを選択しています ... 128MB
デフォルトの時間帯を選択しています ... Asia/Tokyo
設定ファイルを作成しています ... ok
ブートストラップスクリプトを実行しています ... ok
ブートストラップ後の初期化を実行しています ... ok
データをディスクに同期しています ... ok

成功しました。以下のようにしてデータベースサーバーを起動できます:

    /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data -l ログファイル start

$ exit
ログアウト

データベースクラスタが作成できたら、ディレクトリ内のファイルを確認してみましょう。

$ sudo ls /var/lib/pgsql/16/data
PG_VERSION    pg_hba.conf    pg_replslot   pg_subtrans  postgresql.auto.conf
base          pg_ident.conf  pg_serial     pg_tblspc    postgresql.conf
global        pg_logical     pg_snapshots  pg_twophase
pg_commit_ts  pg_multixact   pg_stat       pg_wal
pg_dynshmem   pg_notify      pg_stat_tmp   pg_xact

データベースクラスタ内で名前が .conf で終わるのが設定ファイルです。baseglobal ディレクトリにはデータファイル、名前が pg_ で始まるディレクトリには制御ファイルが格納されます。ログファイルはデフォルトでは log ディレクトリに格納されます。

PostgreSQL 16 では、データベースクラスタ作成時にロケールなしを指定しても、設定ファイル postgresql.conf 内で lc_messages パラメータがコメントになったままで、メッセージのロケールがシステムと同じになり、日本語環境ではメッセージが日本語で出力されます。メッセージが日本語でも動作に影響ありませんが、日本語だとネットで検索しても情報が見つかりづらいので、行頭の # を削除してコメントから外しておきます。

/var/lib/pgsql/16/data/postgresql.conf
# These settings are initialized by initdb, but they can be changed.
lc_messages = 'C'                      # locale for system error message
                                        # strings
#lc_monetary = 'C'                      # locale for monetary formatting
#lc_numeric = 'C'                       # locale for number formatting
#lc_time = 'C'                          # locale for time formatting

データベースサーバの起動

データベースクラスタの場所を変更している場合には、PostgreSQL サービスのユニットファイルを編集します。

$ sudo systemctl edit postgresql-16.service

エディタが起動されたら、Service セクション内の Environment オプションで環境変数 PGDATA にデータベースクラスタの場所を指定します。

[Service]
Environment=PGDATA=/var/lib/pgsql/16/data

PostgreSQL サービスとしてデータベースサーバを起動します。

$ sudo systemctl start postgresql-16.service

何も出力されなければ、起動できています。

ついでに OS の起動時に PostgreSQL サービスが起動されるようにします。

$ sudo systemctl enable postgresql-16.service
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql-16.service → /usr/lib/systemd/system/postgresql-16.service.

PostgreSQL スーパーユーザの環境変数設定

データベースサーバの管理は PostgreSQL のスーパーユーザ postgres で行います。postgres ユーザで操作しやすくなるように環境変数の設定を行います。

環境変数の設定は、通常、設定ファイル ~/.bash_profile で行いますが、postgres ユーザの ~/.bash_profile はパッケージのインストール時に上書きされてしまいます。そのため、~/.bash_profile から設定ファイル ~/.pgsql_profile を読み込むようになっており、環境変数の設定は ~/.pgsql_profile で行います。

$ sudo su - postgres
$ vi ~/.pgsql_profile

設定ファイル ~/.pgsql_profile では環境変数 PATHMANPATHPGDATA の設定を行います。psql などのクライアントプログラムは (そのシンボリックリンクが) デフォルトの検索パスに含まれていますが、pg_ctl などのサーバプログラムは含まれていないので、環境変数 PATHMANPATH の設定が必要です。環境変数 PGDATA にはデータベースクラスタの場所を指定します。サーバプログラムではデータベースクラスタの場所を指定する必要がありますが、環境変数 PGDATA の設定を行えば省略できます。

~/.pgsql_profile
export PATH=/usr/pgsql-16/bin:$PATH
export MANPATH=/usr/pgsql-16/share/man:$MANPATH
export PGDATA=/var/lib/pgsql/16/data

設定ファイル ~/.bash_profile の再読み込みを行い、設定の変更を反映します。

$ . ~/.bash_profile

データベースの接続確認

最後にデータベースの一覧を表示し、データベースに接続できるかを確認します。パスワードの入力プロンプトが表示されるので、データベースクラスタ作成時に設定したパスワードを入力します。

$ psql -l
ユーザー postgres のパスワード: (パスワードを入力)
                                                                 データベース一覧
   名前    |  所有者  | エンコーディング | ロケールプロバイダー | 照合順序 | Ctype(変換演算子) | ICUロケール | ICUルール: |     アクセス権限
-----------+----------+------------------+----------------------+----------+-------------------+-------------+------------+-----------------------
 postgres  | postgres | UTF8             | libc                 | C        | C                 |             |            |
 template0 | postgres | UTF8             | libc                 | C        | C                 |             |            | =c/postgres          +
           |          |                  |                      |          |                   |             |            | postgres=CTc/postgres
 template1 | postgres | UTF8             | libc                 | C        | C                 |             |            | =c/postgres          +
           |          |                  |                      |          |                   |             |            | postgres=CTc/postgres
(3 行)

データベースクラスタを作成した直後は postgrestemplate0template1 の 3 つのデータベースが存在します。

PostgreSQL のインストールはこれで完了です。ただ、ローカルホスト以外から接続するには、さらに設定を行う必要があります。それについては こちらの記事 を参照してください。

189
172
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
189
172

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?