PostgreSQL 入門

開発用PostgreSQLをCentOSにインストールしてSQLを流すまで

投稿日:2019年9月13日

開発や勉強に使う為のPostgreSQLをCentOSにインストールします。

インストールから基本操作を体験して、0からデータベースを構築する経験を積んでおきます。

環境

  • CentOS 7.6
  • PostgreSQL 11.4

インストール手順を公式サイトで確認

公式サイトから「Download」→「CentOS/Fedora/Scientific/Oracle」リンクをクリックしてOSを選択すると条件別インストール手順にたどり着けるのでこの手順に従います。
https://www.postgresql.org/download/linux/redhat/

Postgresql公式yumリポジトリを追加

公式手順に従ってyumリポジトリ定義ファイルをインストール。
(#で始まるプロンプトはrootユーザで実行)

# yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

/etc/yum.repos.dにpgdgリポジトリ定義が入りました。以降はyumコマンドでポスグレ関連の最新ライブラリ、ソフトウェアがインストール出来るようになります。

# ls -lt /etc/yum.repos.d/
合計 52
-rw-r--r--. 1 root root 5189  4月 17 13:12 pgdg-redhat-all.repo
-rw-r--r--. 1 root root 1664 11月 23  2018 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 11月 23  2018 CentOS-CR.repo
-rw-r--r--. 1 root root  649 11月 23  2018 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  630 11月 23  2018 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 11月 23  2018 CentOS-Sources.repo
-rw-r--r--. 1 root root 5701 11月 23  2018 CentOS-Vault.repo
-rw-r--r--. 1 root root  314 11月 23  2018 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 2424 10月 25  2018 docker-ce.repo
-rw-r--r--. 1 root root 1050 10月  3  2017 epel-testing.repo
-rw-r--r--. 1 root root  951 10月  3  2017 epel.repo

PostgreSQLインストール

#  yum install postgresql11
#  yum install postgresql11-server

/usr/pgsql-11にコマンドやライブラリがインストールされました。

# ls /usr/pgsql-11/
bin  lib  share

また、伝統的に/var/lib/pgsqlがpostgresスーパーユーザのホームディレクトリになります。

# ls -la /var/lib/pgsql/
合計 3348
drwx------.  6 postgres postgres     177  9月  4 23:29 .
drwxr-xr-x. 61 root     root        4096  7月 24 22:42 ..
-rw-------.  1 postgres postgres    6091  9月  9 11:21 .bash_history
-rwx------.  1 postgres postgres     266  7月 24 22:46 .bash_profile
drwxr-xr-x.  3 postgres postgres      18  7月 24 23:25 .cache
drwxr-xr-x.  3 postgres postgres      18  7月 24 23:25 .config
-rw-------.  1 postgres postgres      45  7月 25 01:57 .lesshst
-rw-------.  1 postgres postgres   10509  9月  9 11:21 .psql_history
drwx------.  4 postgres postgres      51  7月 24 23:15 11

11/dataが実データや設定ファイル置き場になるので覚えておきます。
(このディレクトリは後に実行するpostgresql-11-setup initdbで作成されます)

# ls -la /var/lib/pgsql/11/data
合計 68
drwx------. 20 postgres postgres  4096  9月 13 00:00 .
drwx------.  4 postgres postgres    51  7月 24 23:15 ..
-rw-------.  1 postgres postgres     3  7月 24 23:15 PG_VERSION
drwx------.  9 postgres postgres    97  9月  6 22:31 base
-rw-------.  1 postgres postgres    30  9月 13 00:00 current_logfiles
drwx------.  2 postgres postgres  4096  9月  8 22:06 global
drwx------.  2 postgres postgres   188  7月 30 00:00 log
drwx------.  2 postgres postgres     6  7月 24 23:15 pg_commit_ts
drwx------.  2 postgres postgres     6  7月 24 23:15 pg_dynshmem
-rw-------.  1 postgres postgres  4407  9月  6 22:57 pg_hba.conf
-rw-------.  1 postgres postgres  1636  7月 24 23:15 pg_ident.conf
drwx------.  4 postgres postgres    68  9月  8 22:07 pg_logical
drwx------.  4 postgres postgres    36  7月 24 23:15 pg_multixact
drwx------.  2 postgres postgres    18  9月  6 03:17 pg_notify
drwx------.  2 postgres postgres     6  7月 24 23:15 pg_replslot
drwx------.  2 postgres postgres     6  7月 24 23:15 pg_serial
drwx------.  2 postgres postgres     6  7月 24 23:15 pg_snapshots
drwx------.  2 postgres postgres     6  9月  6 03:17 pg_stat
drwx------.  2 postgres postgres   126  9月 13 00:27 pg_stat_tmp
drwx------.  2 postgres postgres    18  7月 24 23:15 pg_subtrans
drwx------.  2 postgres postgres     6  7月 24 23:15 pg_tblspc
drwx------.  2 postgres postgres     6  7月 24 23:15 pg_twophase
drwx------.  3 postgres postgres  4096  9月  8 22:07 pg_wal
drwx------.  2 postgres postgres    18  7月 24 23:15 pg_xact
-rw-------.  1 postgres postgres    88  7月 24 23:15 postgresql.auto.conf
-rw-------.  1 postgres postgres 23977  8月  8 00:55 postgresql.conf
-rw-------.  1 postgres postgres    58  9月  6 03:17 postmaster.opts
-rw-------.  1 postgres postgres   102  9月  6 03:17 postmaster.pid

PostgreSQLコマンドディレクトリにパスを通す

/usr/pgsql-11/bin/psqlとか毎回フルパスで打つのは面倒です。OSユーザ全員がPostgreSQL関連コマンドをパス無しで使えるよう/etc/profileでPATHを通しておきます。

末尾に以下の行を追加。ssh再ログイン後は配下のPostgreSQL関連コマンドをパス無しで実行出来るようになります。

PATH=$PATH:/usr/pgsql-11/bin

PostgreSQLを初期化

インストール直後にPostgreSQLを起動しようとしてもdataディレクトリが作られていない為起動に失敗します。

postgresql-11-setup initdbコマンドを実行して前述のdataディレクトリを作ります。

# postgresql-11-setup initdb
Initializing database ... OK

PostgreSQLを起動

サービス名はpostgresql-11.service。

// 起動
# systemctl start postgresql-11

// 起動状態確認
# systemctl status postgresql-11
● postgresql-11.service - PostgreSQL 11 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-11.service; disabled; vendor preset: disabled)
   Active: active (running) since 水 2019-07-24 23:15:32 JST; 5s ago
     Docs: https://www.postgresql.org/docs/11/static/
  Process: 20429 ExecStartPre=/usr/pgsql-11/bin/postgresql-11-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 20438 (postmaster)
    Tasks: 8
   Memory: 13.6M
   CGroup: /system.slice/postgresql-11.service
           tq20438 /usr/pgsql-11/bin/postmaster -D /var/lib/pgsql/11/data/
           tq20439 postgres: logger
           tq20441 postgres: checkpointer
           tq20442 postgres: background writer
           tq20443 postgres: walwriter
           tq20444 postgres: autovacuum launcher
           tq20445 postgres: stats collector
           mq20446 postgres: logical replication launcher

 7月 24 23:15:32 spock systemd[1]: Starting PostgreSQL 11 database server...
 7月 24 23:15:32 spock postmaster[20438]: 2019-07-24 23:15:32.265 JST [20438] LOG:  IPv6アドレス"::1"、ポート5432で待ち受けています
 7月 24 23:15:32 spock postmaster[20438]: 2019-07-24 23:15:32.265 JST [20438] LOG:  IPv4アドレス"127.0.0.1"、ポート5432で待ち受けています
 7月 24 23:15:32 spock postmaster[20438]: 2019-07-24 23:15:32.290 JST [20438] LOG:  Unixソケット"/var/run/postgresql/.s.PGSQL.543…ています
 7月 24 23:15:32 spock postmaster[20438]: 2019-07-24 23:15:32.350 JST [20438] LOG:  Unixソケット"/tmp/.s.PGSQL.5432"で待ち受けています
 7月 24 23:15:32 spock postmaster[20438]: 2019-07-24 23:15:32.380 JST [20438] LOG:  ログ出力をログ収集プロセスにリダイレクトしています
 7月 24 23:15:32 spock postmaster[20438]: 2019-07-24 23:15:32.380 JST [20438] ヒント:  ここからのログ出力はディレクトリ"log"に現れます。
 7月 24 23:15:32 spock systemd[1]: Started PostgreSQL 11 database server.
Hint: Some lines were ellipsized, use -l to show in full.

起動しました。

psqlコマンドで接続して動作確認

postgresユーザになってpsqlコマンドで接続してみます。

# su - postgres

-bash-4.2$ psql
psql (11.4)
"help" でヘルプを表示します。

postgres=#

postgresスーパーユーザ用に最初から用意されているpostgresデータベースに接続が出来ました。

データベース一覧を表示する「\l」、テーブル一覧を表示する「\d」、ユーザ一覧を表示する「\du」他、公式を見ながら管理コマンドを確認しておきます。

テーブルを作成してSQLを流してみる

テーブル作成、INSERT、SELECT、UPDATE、DELETE、テーブル削除、一通りやってみます。

CREATE TABLE(テーブル作成)

自動採番されるID、名前、年齢で構成されるmembersテーブルを作成してみます。

postgres=# CREATE TABLE members(id serial, name varchar(20), age integer, PRIMARY KEY(id));
CREATE TABLE

作成したmembersテーブルの他にmembers_id_seqが作られています。これはidに自動採番する為の「シーケンステーブル」です。
\dにテーブル名を付けて実行すると作成したテーブルの構成が表示されます。

postgres=# \d
                   リレーション一覧
 スキーマ |       名前        |     型     |  所有者
----------+-------------------+------------+----------
 public   | members           | テーブル   | postgres
 public   | members_id_seq    | シーケンス | postgres

postgres=# \d members
                                   テーブル "public.members"
  列  |          型           | 照合順序 | Null 値を許容 |             デフォルト
------+-----------------------+----------+---------------+-------------------------------------
 id   | integer               |          | not null      | nextval('members_id_seq'::regclass)
 name | character varying(20) |          |               |
 age  | integer               |          |               |
インデックス:
    "members_pkey" PRIMARY KEY, btree (id)

postgres=# \d members_id_seq
               シーケンス "public.members_id_seq"
   型    | 開始 | 最小 |    最大    | 増分 | 循環? | キャッシュ
---------+------+------+------------+------+--------+------------
 integer |    1 |    1 | 2147483647 |    1 | no     |          1
所有者: public.members.id

INSERT(データ挿入)

作成したテーブルにデータを投入。
idはserial(自動採番)として定義したのでデータを入れなくても勝手に番号が振られます。

postgres=# INSERT INTO members(name, age) VALUES('山田太郎', 25);
INSERT 0 1
postgres=# INSERT INTO members(name, age) VALUES('佐藤花子', 23);
INSERT 0 1

SELECT(データ取得)

全データを取得。

postgres=# SELECT * FROM members;
 id |   name   | age
----+----------+-----
  1 | 山田太郎 |  25
  2 | 佐藤花子 |  23
(2 行)

WHEREを付けて条件検索。

postgres=# SELECT name FROM members WHERE age > 24;
   name
----------
 山田太郎
(1 行)

UPDATE(データ更新)

行データの更新。

postgres=# UPDATE members SET name='山田花子' WHERE id=2;
UPDATE 1

postgres=# SELECT * FROM members;
 id |   name   | age
----+----------+-----
  1 | 山田太郎 |  25
  2 | 山田花子 |  23
(2 行)

DELETE(データ削除)

行データの削除。

postgres=# DELETE FROM members WHERE id=2;
DELETE 1

postgres=# SELECT * FROM members;
 id |   name   | age
----+----------+-----
  1 | 山田太郎 |  25
(1 行)

DROP TABLE(テーブル削除)

membersテーブルごと削除。最初の状態に戻りました。

postgres=# DROP TABLE members;
DROP TABLE

まとめ

  • CentOSにPostgreSQLをインストール
  • テーブル作成
  • CRUD(CREATE、READ、UPDATE、DELETE)
  • テーブル削除

までを体験しました。

次は一般作業ユーザを作って外部PCから接続したり、

まっとうなテーブル群を持った実践的なサンプルテーブル構造を作ったりしていきます。

-PostgreSQL, 入門

執筆者:

関連記事

GitLab Omunibus版のPostgreSQLに普通のpsqlコマンドで接続

GitLab Omunibus版でインストールされるビルトインPostgreSQLは、 TCP:5432ではなくホスト内でしか接続出来ないUnix Domain Socketで待機ローカルホストからO …

Omnibus版のGitLab、Mattermostデータベースに外部ホストからJDBCで接続

Omnibusで入れたPostgreSQLは、 Unix Domainソケットで接続待機Peer認証で認証 していて外部からの接続は出来ないことが前回分かりました。One IT Thing  …

「Jailer Database Tool」でDB関連作業を効率化

開発時のデータベースクライアントは何を使っていますか?A5? 「Jailer Database Tool」を使っていないなら、普段使いツールに加えるとちょっとデータベースの見え方が変わるかも知れません …

ER図自動生成ツール「SchemaSpy」でdvdrentalを可視化

SchemaSpyを使うとDBからデータを吸い上げてテーブルの相関をビジュアライズしてくれます。 本来ER図からDDLを生成出来るようにしておくべきで、出来れば使わない方がいいチート系のツールですがC …

pgcryptoで公開鍵暗号の動作確認

共通鍵暗号で暗号化されたデータはパスワードが漏洩すると復号される危険が高まるのに対し、公開鍵暗号で暗号化されたデータは秘密鍵とパスワードの二つが漏洩しないと復号できません。 APサーバとDBサーバ通信 …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯現役技術者を目指しています。健康第一。