今日は私が愛用するデータベース、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
いかがだったでしょうか。同じ結果が得られるのであれば簡単な方が良いことも多いですが、「ならでは」の満足感が得られることと思います。皆さんも是非挑戦してみてください!
コメント