コピペ対応!PostgreSQLをソースコードからインストールする

PostgreSQL database

今日は私が愛用するデータベース、PostgreSQLをソースコードからインストールしていこうと思います。インストーラーがある時代になぜソースコードからと思われるかもしれませんが、makeしているときの画面がカッコイイからです(単純)

注意事項

以下、完全に自己流ですので、参照される際は自己責任でお願い致します。また、誤り・思い違いと思われる点はご指摘頂けると嬉しいです。

CentOSを準備する

実環境を使うのはなにかと大変なので、今回私はVirtualBoxを利用しCentOS8の仮想マシンを準備しました。インストールに利用したイメージはCentOS-8.2.2004-x86_64-dvd1.isoです。

インストーラーではminimalインストールを選択し、ネットワーク設定を済ませておきます。インストールが始まったらユーザーpostgresを作成し「管理者にする」を選択しておきましょう。

OSのアップデートと下準備

インストールが終わりユーザーpostgresでログインしたら、私はいつも一番にエディタ「nano」をインストールします。クセが無く使いやすいと思いますので、使ったことが無い方は是非試してみてください。

sudo yum -y install nano

次にシステム時刻を同期できるように仕込みます。これをやらずにVirtualBoxでスナップショットから仮想マシンを復元すると、システム時刻がスナップショット作成時まで戻ってしまうので注意が必要です。

sudo yum -y install chrony

CentOS8ではntpdがサポートされなくなりました。chronyがインストール出来たら/etc/chrony.confを修正します。

sudo nano /etc/chrony.conf

#下記をコメントアウト
#pool 2.centos.pool.ntp.org iburst

#これを加筆
pool ntp.nict.jp iburst

#自環境に合わせ外へ出られるネットワークを指定
#allow 192.168.0.0/16
allow 192.168.0.0/24

ここまで出来たらchronyを再起動します。

sudo systemctl enable --now chronyd

続いてシステムをアップデートします。

sudo yum -y update

次に以降の作業で必要になるものをインストールしていきます。

sudo yum -y install gcc
sudo yum -y install bison
sudo yum -y install zlib zlib-devel
sudo yum -y install readline-devel
sudo yum -y install make
sudo yum -y install openssl-devel
sudo yum -y install wget
sudo yum -y install tar

ソースコードのダウンロード→解凍

PostgreSQLのソースコードをダウンロードします。今回入手するのはPostgreSQL10.13です。なぜ11でも12でもないのかは次回の記事でお話しします。

wget https://ftp.postgresql.org/pub/source/v10.13/postgresql-10.13.tar.gz

ホームディレクトリに保存されているはずですので確認しましょう。こんな感じです。

ls
postgresql-10.13.tar.gz

ダウンロードしたファイルを解凍します。

tar zxvf postgresql-10.13.tar.gz

configureからinstallまで

では、一気に参りましょう。一気にといってもコマンドの実行は一つずつでお願います!

cd postgresql-10.13

./configure --with-openssl

make

make check

sudo make install

見どころは何といってもmakeとmake checkの実行中です。じゃんじゃんコンソールが流れていく様をたっぷり堪能してください!

必要なディレクトリの作成

#データベースクラスタ
sudo mkdir /usr/local/pgsql/data

#walアーカイブ先
sudo mkdir /usr/local/pgsql/archivelogs

#それぞれユーザーpostgresに所有権を与えます
sudo chown postgres:postgres /usr/local/pgsql/data
sudo chown postgres:postgres /usr/local/pgsql/archivelogs

データベースクラスタ初期化

/usr/local/pgsql/bin/initdb --no-locale --encoding=utf-8 -D /usr/local/pgsql/data

フルパスで記述し実行します。

--no-locale

こちらはデータベースの照合(ソート)順序で、この場合は文字コード順でのソートを指定しています。-Dでデータベースクラスタに先ほど作成したディレクトリを指定しています。

次にログの保存場所を作成します。ここでいうログはトランザクションログ(wal)ではなく、一般的ないわゆるアプリケーションのログです。

sudo mkdir /usr/local/pgsql/data/log
sudo chown postgres:postgres /usr/local/pgsql/data/log

オンラインバックアップ作成時の手数が少なくなるので私はデータベースクラスタ内にログを保存するのですが、initdbを実行する時はデータベースクラスタに指定したディレクトリがカラである必要があるため、initdb実行後にこの作業を行います。

環境変数設定

特にコメントの必要はありませんね。

nano ~postgres/.bash_profile

#以下を加筆します
export PATH=/usr/local/pgsql/bin:$PATH
export MANPATH=/usr/local/pgsql/share/man:$PATH
export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH
export PGDATA=/usr/local/pgsql/data

保存してエディタを抜けたらこちらをお忘れなく!

source ~postgres/.bash_profile

postgresql.confの編集

archive_modeをonにして稼働させるのに必要な最小限の設定です。メモリ使用量の指定などはここでは触れません。元々行頭が#になっている項目は#を削除しアンコメントします。

nano $PGDATA/postgresql.conf

listen_addresses = '*'                  # アスタリスクに変更
archive_mode = on                       # onに変更
archive_command = 'cp %p /usr/local/pgsql/archivelogs/%f'     # アーカイブログ保存先を指定
log_destination = 'stderr'              # 標準エラー出力
logging_collector = on                  # onに変更
log_directory = '/usr/local/pgsql/data/log'                   # ログ保存先を指定

pg_hba.confの編集

DBに接続するホスト、認証方式を指定します。ご自身の環境に合わせて編集しましょう。下記の例ではIPv4とIPv6の認証をtrustからmd5に変更しています。

nano $PGDATA/pg_hba.conf

-------------------------------------------------------------------------------------
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             192.168.0.0/24          md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust
-------------------------------------------------------------------------------------

DB起動

pg_ctl start

正常に起動しエラーが無いことを確認します。起動できな買った場合はpostgresql.confとpg_hba.confの内容をもう一度見直してみましょう。

ログの内容も確認します。

ls -l $PGDATA/log

ここにpostgresql-yyyy-mm-dd_hh24miss.logというファイルが生成されていますので、その中を確認します。

cat $PGDATA/log/postgresql-yyyy-mm-dd_hh24miss.log

もしログ自体が存在しないときはpostgresql.confで指定したlog_directoryの内容を確認します。

DBが起動できたらスーパーユーザーのパスワードを設定しましょう。

psql postgres postgres
alter user postgres password'hoge';
\q

続いて再度pg_hba.confを編集し、先ほどtrustのままにしておいたlocalもmd5に変更します。

nano $PGDATA/pg_hba.conf

# "local" is for Unix domain socket connections only
local   all             all                                     md5

保存してエディタを終了したらDBを再起動し.confをもう一度読み込ませます。

pg_ctl restart

これでパスワード無しでDBに入ることは出来なくなりました。試してみましょう。

psql postgres postgres

いかがだったでしょうか。同じ結果が得られるのであれば簡単な方が良いことも多いですが、「ならでは」の満足感が得られることと思います。皆さんも是非挑戦してみてください!

コメント