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, 入門

執筆者:

関連記事

開発用PostgreSQLをインストールした後の外部接続、ユーザ作成、認証周りの設定

ローカル開発用にPostgreSQLを入れた後、開発や分析をし易くする為に外部ホストからパスワード付き接続出来るようにしていきます。 また、postgresスーパーユーザは権限が強すぎて開発アプリから …

スタンドアロンモードのPgAdmin4が開くデフォルトブラウザを変更

PostgreSQL公式GUIクライアントツールの「PgAdmin4」。 PostGISのgeometry型をWeb地図上に表示出来たり、サーバモードで起動すればチーム内で共通的に使えるPostgre …

BIツール「metabase」でサンプルDB「dvdrental」をグラフ化する

「売り上げやユーザ増加傾向をDBから抽出して上役に報告したりチームで共有したい」 資料を作る為にSQLを流して、結果をコピーして、Excelに張り付けて、グラフ化して・・・結構面倒で骨が折れます。間違 …

PostgreSQL11に一般ユーザ権限でサンプルDB「dvdrental」をpg_restore

データベースインストール後にサンプルデータを投入することで、DBをバックエンドにして動作する他ミドルの検証が楽になったりすることがあります。 それぞれのデータベースで代表的なサンプルデータセットの存在 …

pgadmin4をCentOS7にインストールしてサーバモードで起動する手順

目次1 はじめに1.1 pgadmin3時代1.2 pgadmin4時代2 前提3 環境4 手順4.1 1.yumリポジトリ追加。pgdg(ポスグレ本家)、epel(python関連用)4.2 2.p …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯技術者として楽しく生きることを目指しています。デスマに負けず健康第一。