開発や勉強に使う為の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から接続したり、
まっとうなテーブル群を持った実践的なサンプルテーブル構造を作ったりしていきます。