centos7でPostgreSQLをインストールして起動

　centos7.5でPostgreSQLをインストールして起動させるまでの設定を記載する。

## ユーザの追加
　PostgreSQLをインストールする時には環境設定を変えたりしないといけないので、新たなユーザを追加して行うようにする。
　useraddでユーザを追加して、passwdでパスワードを与える。
　useraddで以下のように行なった。

~~~linux
$sudo useradd -d /home/xxxxxxxx xxxxxxxx
$cd ..
$ls -lrt

total 4
drwx------.  3 aaaaaa      aaaaaa        95 Jan  1 06:19 aaaaaa
drwx------. 10 bbbbbbbbb  bbbbbbbbb  4096 Jan 22 12:35 bbbbbbbbb
drwx------.  2 xxxxxxxxx  xxxxxxxxx   62 Feb 12 09:51 xxxxxxxxx
~~~

　passwdで以下のように行なった。

~~~linux
$sudo passwd xxxxxxxx
Changing password for user xxxxxxxx.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
~~~

　新しく作ったユーザに管理者権限を与える。そうすればsudoをパスワード入力なしに使うことができる。

　ユーザの権限が指定されている/etc/sudoersをvisudoコマンドで編集する。

~~~linux
$sudo visudo
~~~

　ユーザ名xxxxxxxxを以下のように登録する。

~~~~linux
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
xxxxxxxx      ALL=(ALL)       ALL

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
%xxxxxxxx     ALL=(ALL)       NOPASSWD: ALL
~~~

　これでパスワードなしでsudoを実行できる。

## PostgreSQLのインストール

　新たに追加したユーザになる。

~~~linux
$su xxxxxxxx
~~~

　以下のコマンドでPostgreSQLがインストールされていないことが確認できる。何も出て来ない。

~~~linux
$rpm -qa | grep postgres
~~~

　以下のようにしてyumコマンドでインストールする。

~~~linux
$ sudo yum install postgresql-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
Resolving Dependencies
--> Running transaction check
---> Package postgresql-server.x86_64 0:9.2.24-7.el7_9 will be installed
--> Processing Dependency: postgresql-libs(x86-64) = 9.2.24-7.el7_9 for package: postgresql-server-9.2.24-7.el7_9.x86_64
--> Processing Dependency: postgresql(x86-64) = 9.2.24-7.el7_9 for package: postgresql-server-9.2.24-7.el7_9.x86_64
--> Processing Dependency: libpq.so.5()(64bit) for package: postgresql-server-9.2.24-7.el7_9.x86_64
--> Running transaction check
---> Package postgresql.x86_64 0:9.2.24-7.el7_9 will be installed
---> Package postgresql-libs.x86_64 0:9.2.24-7.el7_9 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                 Arch         Version               Repository     Size
================================================================================
Installing:
 postgresql-server       x86_64       9.2.24-7.el7_9        updates       3.8 M
Installing for dependencies:
 postgresql              x86_64       9.2.24-7.el7_9        updates       3.0 M
 postgresql-libs         x86_64       9.2.24-7.el7_9        updates       235 k

Transaction Summary
================================================================================
Install  1 Package (+2 Dependent packages)

Total download size: 7.1 M
Installed size: 33 M
Is this ok [y/d/N]: y
Downloading packages:
(1/3): postgresql-libs-9.2.24-7.el7_9.x86_64.rpm           | 235 kB   00:00
(2/3): postgresql-9.2.24-7.el7_9.x86_64.rpm                | 3.0 MB   00:00
(3/3): postgresql-server-9.2.24-7.el7_9.x86_64.rpm         | 3.8 MB   00:00
--------------------------------------------------------------------------------
Total                                              6.9 MB/s | 7.1 MB  00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Installing : postgresql-libs-9.2.24-7.el7_9.x86_64                        1/3
  Installing : postgresql-9.2.24-7.el7_9.x86_64                             2/3
  Installing : postgresql-server-9.2.24-7.el7_9.x86_64                      3/3
  Verifying  : postgresql-9.2.24-7.el7_9.x86_64                             1/3
  Verifying  : postgresql-libs-9.2.24-7.el7_9.x86_64                        2/3
  Verifying  : postgresql-server-9.2.24-7.el7_9.x86_64                      3/3

Installed:
  postgresql-server.x86_64 0:9.2.24-7.el7_9

Dependency Installed:
  postgresql.x86_64 0:9.2.24-7.el7_9   postgresql-libs.x86_64 0:9.2.24-7.el7_9

Complete!
~~~

　以下のようにしてインストールできたことが確認できる。

~~~linux
$ rpm -qa | grep postgres
postgresql-9.2.24-7.el7_9.x86_64
postgresql-libs-9.2.24-7.el7_9.x86_64
postgresql-server-9.2.24-7.el7_9.x86_64
~~~

　PostgreSQLのバージョンは以下で確認できる。

~~~linux
$ postgres --version
postgres (PostgreSQL) 9.2.24
~~~

　以下のようにしてpostgresというアカウントが作成されていることが確認できる。

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

　psqlコマンドが以下の場所にあることが確認できる。

~~~linux
$ which psql
/usr/bin/psql
~~~

　一方で/var/lib/pgsql/dataはまだ存在していない。

~~~linux
$ sudo ls /var/lib/pgsql/data/
~~~

## PostgreSQLの起動

　インストールした状態ではpostgresのパスワードが未設定なので、設定しておく。

~~~linux
$ sudo passwd postgres
Changing password for user postgres.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
~~~

　ここでsystemctl start postgresqlでPostgreSQLを起動しようとするとエラーが出る。

~~~linux
$ systemctl start postgresql
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: Cloud User (centos)
Password:
polkit-agent-helper-1: pam_authenticate failed: Authentication failure
==== AUTHENTICATION FAILED ===
Failed to start postgresql.service: Access denied
See system logs and 'systemctl status postgresql.service' for details.
~~~

　エラーになるのは初期設定ができていないためである。
　初期設定するためにユーザをpostgresに変更する。以下のようにしてログインする。sudoの-uオプションはユーザ名の指定であり、-iオプションはログインシェル$HOME/.bash_profileを読み込む。

~~~linux
$ sudo -i -u postgres
-bash-4.2$
~~~

　ここで以下のようにして初期設定を行なう。-Dオプションでデータベースクラスタを格納すべきディレクトリを指定している。

~~~linux
-bash-4.2$ initdb -D '/var/lib/pgsql/data/'
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

fixing permissions on existing directory /var/lib/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /var/lib/pgsql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    postgres -D /var/lib/pgsql/data
or
    pg_ctl -D /var/lib/pgsql/data -l logfile start

-bash-4.2$
~~~

　一旦postgresを抜ける。

~~~linux
-bash-4.2$ exit
logout
~~~

　そうすると/var/lib/pgsql/data/が作成されている。

~~~linux
$ sudo ls /var/lib/pgsql/data/
base     pg_hba.conf    pg_notify     pg_stat_tmp  pg_twophase  postgresql.conf
global   pg_ident.conf  pg_serial     pg_subtrans  PG_VERSION
pg_clog  pg_multixact   pg_snapshots  pg_tblspc    pg_xlog
~~~

　この場所を環境変数＄PGDATAに設定しておく。$HOME/.bash_profileに下記を追加する。

~~~linux
export PGDATA=/var/lib/pgsql/data
~~~

　そうすれば以下のようにできる。

~~~linux
$ . ~/.bash_profile
$ echo $PGDATA
/var/lib/pgsql/data
$ env | grep PGDATA
PGDATA=/var/lib/pgsql/data
~~~

　以下のようにしてPostgreSQLを起動して、その状態を確認する。

~~~linux
$ sudo systemctl start postgresql
$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-02-12 14:23:21 JST; 10s ago
  Process: 17108 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS)
  Process: 17103 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 17111 (postgres)
   CGroup: /system.slice/postgresql.service
           tq17111 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432
           tq17112 postgres: logger process
           tq17114 postgres: checkpointer process
           tq17115 postgres: writer process
           tq17116 postgres: wal writer process
           tq17117 postgres: autovacuum launcher process
           mq17118 postgres: stats collector process

Feb 12 14:23:20 i-17100000245070 systemd[1]: Starting PostgreSQL database se....
Feb 12 14:23:21 i-17100000245070 systemd[1]: Started PostgreSQL database server.
Hint: Some lines were ellipsized, use -l to show in full.

~~~

　以下のようにしてシステム起動時にPostgreSQLが起動するように設定しておく。

~~~linux
$ sudo systemctl enable postgresql
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql.service to /usr/lib/systemd/system/postgresql.service.
~~~

## データベースの動作の確認

　以下のようにしてデータベースが動作することを確認しておく。
　ユーザ postgresにログインする。

~~~linux
$ su - postgres
Password:
Last failed login: Sat Feb 12 12:33:47 JST 2022 on pts/6
There were 41 failed login attempts since the last successful login.
-bash-4.2$
~~~

　以下のようにして作成されているデータベースを確認する。

~~~linux
-bash-4.2$ psql -l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileg
es
-----------+----------+----------+-------------+-------------+------------------
-----
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
    +
           |          |          |             |             | postgres=CTc/post
gres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
    +
           |          |          |             |             | postgres=CTc/post
gres
(3 rows)

-bash-4.2$
~~~


---
## 参考記事

CentOS で PostgreSQL を使ってみよう！
https://lets.postgresql.jp/documents/tutorial/centos/1

オープンソースデータベース標準教科書
https://qiita.com/drafts/478ae5759880d7a28b59/edit

PostgreSQLの初期設定 ～Authentication is required～エラーの解決
https://dacelo.space/postgresql/entry-1228.html

initdb
https://www.postgresql.jp/document/9.2/html/app-initdb.html