【PostgreSQL】【CentOS7】yum コマンドでインストール&初期設定(ユーザー作成、パスワード設定、データベース作成、権限割り当て)手順

PostgreSQL のインストールと初期設定手順です。

yum コマンドで PostgreSQL サーバーをインストール後に初期設定をします。

 

 

目次

PostgreSQL インストール手順

PostgreSQL のインストールは「yum」コマンドでできるので非常に簡単です。

インストール環境

CentOS 7.4 にインストールしました。

[test@SAKURA_VPS ~]$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[test@SAKURA_VPS ~]$

 

 

 

PostgreSQLインストール手順

PostgreSQL は「yum」コマンドでインストールすることができます。

リポジトリ―は「CentOS-Base.repo」「updates」なので、特にリポジトリを追加することなくインストールができます。

[root@SAKURA_VPS ~]# yum install postgresql postgresql-server

 

~ 省略 ~

===========================================================================================================
 Package                        アーキテクチャー    バージョン                  リポジトリー          容量
===========================================================================================================
インストール中:
 postgresql                     x86_64              9.2.23-3.el7_4              updates              3.0 M
 postgresql-server              x86_64              9.2.23-3.el7_4              updates              3.8 M
依存性関連でのインストールをします:
 postgresql-libs                x86_64              9.2.23-3.el7_4              updates              234 k

~ 省略 ~

完了しました!
[root@SAKURA_VPS ~]#

 

PostgreSQLのパッケージについて

結果的に以下の3つのパッケージがインストールされました。

 

最低限この3つのパッケージがインストールされていれば PostgreSQL は利用できます。

 

■他のパッケージ

 

※必要なパッケージはそれぞれ「yum install xxx」で指定すればインストールできます。

 

PostgreSQL のリポジトリは何を使っているのか?

リポジトリ―「updates」がどのリポジトリファイルの記載されているのか確認します。

下のコマンド結果を見ると、「CentOS-Base.repo」ファイルに「updates」がありました。

そのため改めて PostgreSQL のリポジトリダウンロードしてインストールする必要はありません。

[root@SAKURA_VPS yum.repos.d]# pwd
/etc/yum.repos.d
[root@SAKURA_VPS yum.repos.d]# ls
CentOS-Base.repo       CentOS-Vault.repo      groonga.repo      mysql-community-source.repo ← たくさんリポジトリファイルがあります。
CentOS-CR.repo         CentOS-fasttrack.repo  ius-archive.repo  mysql-community.repo
CentOS-Debuginfo.repo  elrepo.repo            ius-dev.repo      qt48.repo
CentOS-Media.repo      epel-testing.repo      ius-testing.repo
CentOS-Sources.repo    epel.repo              ius.repo
[root@SAKURA_VPS yum.repos.d]# grep -E "\[updates\]" *
CentOS-Base.repo:[updates] ← CentOS-Base.repo ファイルにありました。
[root@SAKURA_VPS yum.repos.d]#

 

 

 

PostgreSQLをインストールすると「postgres」アカウントが自動作成される

yum コマンドでインストール後に「/etc/passwd」ファイルを確認すると以下のように「postgres」アカウントが作成されています。

ログインシェルは「/bin/bash」です。(Apacheのように nologin アカウントではありません)

[test@SAKURA_VPS ~]$ cat /etc/passwd | grep "postgres"
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
[test@SAKURA_VPS ~]$

 

 

 

PostgreSQL の初期セットアップをする

PostgreSQL をインストールしただけでは利用できません。

初期セットアップが必要です。

初期セットアップは「postgresql-setup initdb」コマンドで実行します。

[root@SAKURA_VPS data]# postgresql-setup initdb
Initializing database  ...  OK

 

[root@SAKURA_VPS data]#

 

※コマンドは一瞬で終わります。

 

■コマンド実行前

[root@SAKURA_VPS ~]# cd /var/lib/pgsql/data/
[root@SAKURA_VPS data]# ls
[root@SAKURA_VPS data]# ← 「data」ディレクトリ内は完全に空の状態です。

 

 

■コマンド実行後

[root@SAKURA_VPS data]# pwd
/var/lib/pgsql/data
[root@SAKURA_VPS data]# ls
PG_VERSION   global     pg_hba.conf    pg_log          pg_notify  

pg_snapshots  pg_subtrans  pg_twophase   postgresql.conf
base         pg_clog    pg_ident.conf  pg_multixact    pg_serial  

pg_stat_tmp   pg_tblspc    pg_xlog ← 各種ファイルが作成されています。
[root@SAKURA_VPS data]#

 

※初期化が完了すると PostgreSQL サービスを起動できるようになります。

 

postgresql-setup initdb コマンドで何をしているのか?

「postgresql-setup initdb」コマンドを実行すると新規で「データベースクラスタ」が作成されます。

→今回の場合は「/var/lib/pgsql/data」ディレクトリにたくさんの設定ファイルやディレクトリが作成されました。

 

さらに yum でインストールした際に「postgres」アカウントが作成されましたが、このアカウントをデータベースのスーパーユーザー(一番権限が強い)に設定します。

 

 

PostgreSQL サービスの自動起動を設定する

インストールが完了したら、次に「PostgreSQL」の自動起動を有効にします。

自動起動を有効にすることで OS 再起動後でも自動で PostgreSQL が起動します。

[root@SAKURA_VPS ~]# systemctl list-unit-files | grep postgresql
postgresql.service                            disabled ← デフォルトでは「disabled」(自動起動しない)設定になっています。
[root@SAKURA_VPS ~]# systemctl enable postgresql
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql.service to /usr/lib/systemd/system/postgresql.service.
[root@SAKURA_VPS ~]# systemctl list-unit-files | grep postgresql
postgresql.service                            enabled ← 「enabled」(自動起動する)設定になりました。
[root@SAKURA_VPS ~]#

 

 

 

PostgreSQL サービスを起動する

PostgreSQL を起動します。

[root@SAKURA_VPS data]# systemctl start postgresql
[root@SAKURA_VPS data]# systemctl status postgresql
 postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2018-03-18 10:09:42 JST; 2s ago
  Process: 3687 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS)
  Process: 3681 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 3691 (postgres)
   CGroup: /system.slice/postgresql.service
           tq3691 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432
           tq3692 postgres: logger process
           tq3694 postgres: checkpointer process
           tq3695 postgres: writer process
           tq3696 postgres: wal writer process
           tq3697 postgres: autovacuum launcher process
           mq3698 postgres: stats collector process

 3月 18 10:09:41 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Starting PostgreSQL database server...
 3月 18 10:09:42 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Started PostgreSQL database server.
[root@SAKURA_VPS data]#

 

 

 

PostgreSQL へログイン確認をする

サービスが起動したら PostgreSQL へログイン確認をします。

「su - postgres」コマンドで「postgres」アカウントにスイッチし、「psql」コマンドでログインします。

[root@SAKURA_VPS data]# su - postgres
最終ログイン: 2018/03/18 (日) 08:00:19 JST日時 pts/0
-bash-4.2$
-bash-4.2$ psql
psql (9.2.23)
"help" でヘルプを表示します.

postgres=# ← 「postgres=#」プロンプトで PostgreSQL へログインしたことが分かります。

postgres=# help
PostgreSQL へのコマンドライン・インターフェース、psql へようこそ。
       \copyright とタイプすると、配布条件を表示します。
       \h とタイプすると、SQL コマンドのヘルプを表示します。
       \? とタイプすると、psql コマンドのヘルプを表示します。
       \g と打つかセミコロンで閉じると、問い合わせを実行します。
       \q で終了します。
postgres=# \q
-bash-4.2$

 

 

PostgreSQL 用アカウントを確認する

「pg_user」テーブルよりアカウントを確認します。

※「username」ではなく「usename」です。

postgres=# select usename from pg_user;
 usename
----------
 postgres ← まだ postgres アカウント以外を作成していません。
(1 行)

postgres=#

 

 

データベース一覧を表示する

インストール直後のデータベース一覧を確認します。

PostgreSQL へログインせずに、postgres アカウント上で下記のように「psql --list」コマンドを実行します。

-bash-4.2$ psql --list
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセス権
-----------+----------+------------------+-------------+-------------------+-----------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
(3 行)

-bash-4.2$

 

Postgresql にログインしてからデータベース一覧を表示する

「\l」コマンドでデータベース一覧を表示できます。

template1=# \l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセス権
-----------+----------+------------------+-------------+-------------------+-----------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
(3 行)

template1=#

 

 

SELECT 文でデータベース一覧を表示する

SELECT 文でもデータベース一覧を表示させることができます。

注意点は「大文字」で SQL 文を記載することです。「小文字」だとエラーになります。

template1=# SELECT * FROM pg_database;
  datname  | datdba | encoding | datcollate  |  datctype   | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace |               datacl
-----------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------+---------------+-------------------------------------
 template1 |     10 |        6 | ja_JP.UTF-8 | ja_JP.UTF-8 | t             | t            |           -1 |         12919 |         1879 |          1663 | {=c/postgres,postgres=CTc/postgres}
 template0 |     10 |        6 | ja_JP.UTF-8 | ja_JP.UTF-8 | t             | f            |           -1 |         12919 |         1879 |          1663 | {=c/postgres,postgres=CTc/postgres}
 postgres  |     10 |        6 | ja_JP.UTF-8 | ja_JP.UTF-8 | f             | t            |           -1 |         12919 |         1879 |          1663 |
 testdb    |     10 |        6 | ja_JP.UTF-8 | ja_JP.UTF-8 | f             | t            |           -1 |         12919 |         1879 |          1663 |
(4 行)

template1=#

 

 

「小文字」だとエラーになります。

template1=# select * from pg_datadase; ← 小文字だとエラーになります。
ERROR:  リレーション"pg_datadase"は存在しません
行 1: select * from pg_datadase;
                    ^
template1=#

 

 

 

特定のデータベースへ接続する

特定のデータベースへ接続します。

「psql <接続先データベース名>」で接続できます。

-bash-4.2$ psql template1 ← template1に接続します。

psql (9.2.23)
"help" でヘルプを表示します.

 

template1=#

 

 

postgresユーザーのパスワードを変更

インストール直後の初期状態では「postgres」ユーザーは「パスワード」が設定されていません。

-bash-4.2$ psql -U postgres -c "ALTER USER postgres WITH PASSWORD 'YOUR_PASSWORD';"
ALTER ROLE
-bash-4.2$

 

 

psql コマンドのオプション「-c」

-c オプションを付けて、SQL 文をサーバーで実行することができます。

       -c command, --command=command
           Specifies that psql is to execute one command string, command, and then exit. 

           psqlが1つのコマンド文字列、コマンドを実行して終了することを指定します。

           This is useful in shell scripts. 

           これはシェルスクリプトで便利です。 

           Start-up files (psqlrc and ~/.psqlrc) are ignored with this option.

           起動ファイル(psqlrcと〜/ .psqlrc)はこのオプションでは無視されます。

           command must be either a command string that is completely parsable by the server (i.e., it contains no psql-specific features), or a single backslash command. 

           <command>は、サーバによって完全に解析可能なコマンド文字列(つまり、psql特有の機能が含まれていないコマンド文字列)または単一のバックスラッシュコマンドのいずれかでなければなりません。

           Thus you cannot mix SQL and psql meta-commands with this option. 

           したがって、SQLとpsqlメタコマンドをこのオプションと混在させることはできません。

           To achieve that, you could pipe the string into psql, for example: echo '\x \\ SELECT * FROM foo;' | psql. (\\ is the separator meta-command.)

           これを実現するには、psqlに文字列をパイプすることができます(例:echo '\x \\ SELECT * FROM foo;')| psql.(\\ はセパレータのメタコマンドです)

           If the command string contains multiple SQL commands, they are processed in a single transaction, unless there are explicit BEGIN/COMMIT commands included in the string to divide it into multiple transactions. 

           コマンド文字列に複数のSQLコマンドが含まれている場合、文字列に含まれる明示的な BEGIN/COMMIT コマンドが複数のトランザクションに分割されている場合を除き、単一のトランザクションで処理されます。

           This is different from the behavior when the same string is fed to psql's standard input. 

           これは、psqlの標準入力に同じ文字列が入力されたときの動作とは異なります。

           Also, only the result of the last SQL command is returned.

           また、最後のSQLコマンドの結果のみが返されます。

           Because of these legacy behaviors, putting more than one command in the -c string often has unexpected results. 

           これらの従来の動作のために、複数のコマンドを -c に入れると、予期しない結果が生じることがよくあります。

           It's better to feed multiple commands to psql's standard input, either using echo as illustrated above, or via a shell here-document, for example:

           上記の echo コマンドを使用するか、ヒアドキュメント シェルを使用して、psqlの標準入力に複数のコマンドを入力する方が良いでしょう。

               psql <<EOF
               \x
               SELECT * FROM foo;
               EOF

 

psql コマンドのオプション「-U」

ユーザーを指定します。

「-U postgres」でユーザー「postgres」を指定しています。

 

 

新規ユーザーの作成

セキュリティやバグ対策のため、postgres ユーザーを使わずに別途ユーザーを新規作成し、必要最低限の権限を与えて利用する場合です。

$ psql -U postgres -c "CREATE USER YOUR_ACCOUNT WITH PASSWORD 'YOUR_PASSWORD';"

 

 

データベースにアクセスしてユーザーを作る手順

OS のコマンドラインからではなくデータベースにアクセスしてからユーザーを作成する手順です。

-bash-4.2$ psql testdb ← testdbにアクセスします。
psql (9.2.23)
"help" でヘルプを表示します.

 

testdb=#

testdb=# CREATE USER postest01; ← testdb にアクセス後、CREATE USER で「postest01」ユーザーを作成します。
CREATE ROLE
testdb=# \du
                                         ロール一覧
 ロール名  |                                 属性                                 | メンバー
-----------+----------------------------------------------------------------------+----------
 postest01 |                                                                      | {}
 postgres  | スーパーユーザ, ロールを作成できる, DBを作成できる, レプリケーション | {}

testdb=#

 

 

新規データベース作成

新規データベースを作成します。

-bash-4.2$ psql -U postgres -W -c "CREATE DATABASE testdb"; ← CREATE DATABASE で「testdb」を作成します。
ユーザ postgres のパスワード: ← パスワードを入力します。
CREATE DATABASE
-bash-4.2$ psql --list ← データベース一覧を表示します。
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセス権
-----------+----------+------------------+-------------+-------------------+-----------------------
 testdb    | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | ← testdbが作成されます。
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
(4 行)

-bash-4.2$

 

 

新規テーブルを作成する

データベースを作成したらテーブルを作成します。

testdb=# CREATE TABLE testtable (id integer, url text, title text, number integer);
CREATE TABLE
testdb=# \d
           リレーションの一覧
 スキーマ |  名前       |    型    |  所有者
----------+-------------+----------+----------
 public   | testtable   | テーブル | postgres
(1 行)

testdb=#

 

 

新規アカウントに新規データベースの権限を割り当てる

新規データベースを作成し、テーブルを作成したら権限を割り当てます。

ここでは例として「postest01」アカウントに先ほど作成した「testtable」テーブルへの権限を割り当てます。

権限は「SELECT, INSERT, UPDATE, DELETE」(つまり ALL 権限)を割り当てます。

-bash-4.2$ psql -U postgres -W -c "GRANT SELECT, INSERT, UPDATE, DELETE ON testtable TO postest01";

or

-bash-4.2$ psql -U postgres -W -c "GRANT ALL ON testtable TO postest01";

 

 

データベースにアクセスをしてテーブルに権限を割り当てる手順

「test」ユーザーに「testtable」の操作の権限を割り当てます。

testdb=# GRANT ALL ON testtable TO test;
GRANT
testdb=# \dp
                                            アクセス権
 スキーマ |  名前       |    型    |        アクセス権         | 列のアクセス権限
----------+-------------+----------+---------------------------+------------------
 public   | testtable   | テーブル | postgres=arwdDxt/postgres+|
          |             |          | test=arwdDxt/postgres     |
(1 行)

testdb=#

 

 

 

 

PostgreSQL サービスが起動しない場合のトラブルシューティング

以下のように「journalctl -x --no-pager | less」コマンドでログを表示します。

[root@SAKURA_VPS ~]# journalctl -x --no-pager | less

 

 3月 18 08:02:51 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Starting PostgreSQL database server...
-- Subject: Unit postgresql.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit postgresql.service has begun starting up.
 3月 18 08:02:51 tk2-250-34861.vs.sakura.ne.jp postgresql-check-db-dir[2276]: "/var/lib/pgsql/data" is missing or empty. ← 「/var/lib/pgsql/data」ディレクトリ内が空の状態です。
 3月 18 08:02:51 tk2-250-34861.vs.sakura.ne.jp postgresql-check-db-dir[2276]: Use "postgresql-setup initdb" to initialize the database cluster. ← 対応方法が記載されています。「postgresql-setup initdb」コマンドを実行する必要があります。
 3月 18 08:02:51 tk2-250-34861.vs.sakura.ne.jp postgresql-check-db-dir[2276]: See /usr/share/doc/postgresql-9.2.23/README.rpm-dist for more information. 
 3月 18 08:02:51 tk2-250-34861.vs.sakura.ne.jp systemd[1]: postgresql.service: control process exited, code=exited status=1
 3月 18 08:02:51 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Failed to start PostgreSQL database server.
-- Subject: Unit postgresql.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit postgresql.service has failed.
--
-- The result is failed.
 3月 18 08:02:51 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Unit postgresql.service entered failed state.
 3月 18 08:02:51 tk2-250-34861.vs.sakura.ne.jp systemd[1]: postgresql.service failed.
 3月 18 08:02:51 tk2-250-34861.vs.sakura.ne.jp polkitd[544]: Unregistered Authentication Agent for unix-process:2269:590266406 (system bus name :1.42943, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale ja_JP.UTF-8) (disconnected from bus)

 

ログに対応方法が記載されていますが、「/var/lib/pgsql/data」ディレクトリ内が空の状態であり「postgresql-setup initdb」コマンドを実行していないため、まずは「postgresql-setup initdb」コマンドを実行して初期セットアップをします。

 

 

 

「\d」で「リレーションがありません。」と表示される(ERROR:  リレーション"xxx"は存在しません)

コマンドを実行した際に「リレーションがありません。」「ERROR:  リレーション"xxx"は存在しません」などのエラーが表示されることがあります。

-bash-4.2$ psql -U postgres -W -c "GRANT SELECT, INSERT, UPDATE, DELETE ON testdb TO post01;"
ユーザ postgres のパスワード:
ERROR:  リレーション"testdb"は存在しません
-bash-4.2$ psql
psql (9.2.23)
"help" でヘルプを表示します.

postgres=# \d
リレーションがありません。
postgres=#

 

原因

 

【例】「SELECT * FROM pg_database;」だと表示されるが、「\d」コマンドだと「リレーションがありません。」と表示されます。 

postgres=# SELECT * FROM pg_database;
  datname  | datdba | encoding | datcollate  |  datctype   | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace |               datacl
-----------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------+---------------+-------------------------------------
 template1 |     10 |        6 | ja_JP.UTF-8 | ja_JP.UTF-8 | t             | t            |           -1 |         12919 |         1879 |          1663 | {=c/postgres,postgres=CTc/postgres}
 template0 |     10 |        6 | ja_JP.UTF-8 | ja_JP.UTF-8 | t             | f            |           -1 |         12919 |         1879 |          1663 | {=c/postgres,postgres=CTc/postgres}
 postgres  |     10 |        6 | ja_JP.UTF-8 | ja_JP.UTF-8 | f             | t            |           -1 |         12919 |         1879 |          1663 |
 testdb    |     10 |        6 | ja_JP.UTF-8 | ja_JP.UTF-8 | f             | t            |           -1 |         12919 |         1879 |          1663 |
(4 行)

postgres=# \d
リレーションがありません。
postgres=#

 

 

現在のスキーマのパスを確認する

以下のコマンドで現在のスキーマのパスを確認します。

postgres=# SHOW search_path;
  search_path
----------------
 "$user",public
(1 行)

postgres=#

 

 

どうしても不明な場合は、一度 DROP で削除をして再度作り直してみます。

 

 

参考させていただいたもの

PostgreSQL を初めて触る初心者向けに解説しています。

私的にはもう少々データベースの運用管理分野の情報があると嬉しいです。

しかし PostgreSQL について丁寧に詳しく記述されているので最初の一冊(Kindle本ですが)にいいと思います。

オープンソースデータベース標準教科書 -PostgreSQL-

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人