やまものブログ

メモ書きブログです (^_^;A

Ubuntu に PostgreSQL を入れてみました

オープンソース データベース の PostgreSQL に初挑戦しました。

会社の業務は IT系ではないのですが、SQL を少しいじる機会がありました。業務でわけもわからず操作しただけで終わるのは惜しい! ということで調べながら試したことを以下のとおりまとめます。

なお、バージョンは以下の通りです。
ubuntu 15.10
PostgreSQL 9.4.5




PostgreSQL のインストール

Synapticパッケージマネージャ」で
イメージ 1
をインストールしました。
インストールの所要時間は5分くらいだったでしょうか。途中、いくつか確認事項がありますが、とくに悩むような内容も無く。再起動の必要も無し

少し特殊なのは postgres アカウントのパスワードを設定すること。
$ sudo passwd postgres

この "postgres" というアカウントは、PostgreSQL インストール前は存在しませんでした。
$ id postgres
id: postgres: no such user

PostgreSQLインストールが完了すると作成されていました
$ id postgres
uid=120(postgres) gid=132(postgres) groups=132(postgres),107(ssl-cert)

この postgres さんのホームは変わったところにあります。
$ grep postgresql /etc/passwd
postgres:x:120:132:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash

/home/ ではなくて、/var/lib/ の下にあります
しかも、アカウント名は postgres なのに、ディレクトリ名は postgresql だと
ややこしい、、、

このインストールの後、ロール作成(ユーザ登録のたぐい?)、データベース作成を試したのですが、その手順は後回しにして、「データ ディレクトリの変更」についてまとめます。



データ ディレクトリの変更

PostgreSQL は /etc/init.d に登録されて、Ubuntu 起動時に自動的に起動されます。

会社の業務で触った PostgreSQL (を組み込んだ別のソフトウェア)では、
 ・自分でインスタンスを作成する
 ・自分でデータベースを起動する
 ・1つのホストに複数のインスタンスを起動する
といった運用をしていました。最初にこれを触ったので、生まれて最初に見たものを親と思うひな鳥のごとく、そんなものだと思い込んでいましたが、どうやらこの運用方法はデフォルトではないようです

今回のようにインストールされた状態から素直にデフォルトで使うなら、
 ・1ホストに1インスタンスのみで運用する
 ・起動は /etc/init.d で自動で行う
 ・データベースが複数必要ならそのインスタンスの中で用意する
となるようです。きっと

この素直な(?)使い方を前提に、データが格納されるディレクトリを変更してみました。
/var/lib/ は馴染が無い
ので、自分が知っているパスにデータを格納したいのです

デフォルトの格納場所は、
/etc/postgresql/9.4/main/postgresql.conf
の下記の行に定義されています。
data_directory = '/var/lib/postgresql/9.4/main' # use data in another directory

以下では、これを自分で作ったデータ用パーティション /home1/ の下に変更します。

ポイントは下記の2点だけでした。
 ・ディレクトリの所有者を postgres さんにする
 ・データディレクトリの作成に initdb コマンドを使う(postgres さんで実行)


Google 先生で見かけた情報では、システムによっては
 ・SSL 関連で証明書(公開鍵)の設定が必要
 ・SELinux (Security-Enhanced Linux) ではコンテキストの設定が必要
などの要件もあるらしいのですが、私の Ubuntu でこれらは必要ありませんでした

以下、具体的な手順です。エラーは無かったのでログ出力は省略します。

デレクトリの作成
$ sudo mkdir /home1/postgresql
$ sudo chown postgres:postgres /home1/postgresql

postgres さんに変更
$ su postgres
→ postgres さんのパスワードを要求される

ディレクトリ作成のつづき
$ mkdir -p /home1/postgresql9.4/main
$ chmod 700 /home1/postgresql9.4/main/

initdb でデータ ディレクトリを初期化
$ /usr/lib/postgresql/9.4/bin/initdb   /home1/postgresql/9.4/main

PostgreSQL 停止
$ service postgresql stop
→ sudoers (自分) のパスワードを求められる

conf ファイルを修正
$ vi /etc/postgresql/9.4/main/postgresql.conf

 → data_directory を下記の通りに変更する
data_directory = '/home1/postgresql/9.4/main'

PostgreSQL 起動
$ service postgresql start
→ sudoers (自分) のパスワードを求められる

ロールの作成(自分のアカウントがデータベースへアクセスできるようにする)
$ psql template1
psql (9.4.5)
Type "help" for help.

template1=# create role <自分のログイン名> with login;
CREATE ROLE
template1=# \q

データベース(ここでは "testdb")作成
$ createdb testdb

postgres さんへの su 終了
$ exit

以上の設定でデータ ディレクトリを/home1/… に変更できました。この後のデータベース操作でこの下のファイルやディレクトリのタイムスタンプが更新されるのも確認できました。
また、マシンを再起動しても、データベースは自動で起動しています。



基本操作いくつか

以下、自分のアカウントで操作しています。postgres さんに su していません。

0)PostgreSQL へ接続
$ psql testdb

1) ヘルプ
testdb=> help
You are using psql, the command-line interface to PostgreSQL.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

コマンドには
 ・「\+半角文字」
 ・"help", "quit" みたいな英単語

の2種類があります。
後者は最後をコロン(;)で閉めるのが大事


2) 現在時刻の確認
 
testdb=> select current_timestamp;
now
------------------------------
2016-02-03 01:45:39.97734+09
(1 row)

testdb=> select now();
now
-------------------------------
2016-02-03 01:45:43.926546+09
(1 row)

3) テーブルの操作
3-1) テーブル作成
testdb=> create table tab1(a int, b int);
CREATE TABLE
testdb=> \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+------------
public | tab1 | table | vatarushka
(1 row)


3-2) データの追加
testdb=> insert into tab1 values(1,2);
INSERT 0 1
testdb=> insert into tab1 values(4,5);
INSERT 0 1


3-3) データの取得
testdb=> select * from tab1;
a | b
---+---
1 | 2
4 | 5
(2 rows)


2-3) テーブル削除
testdb=> drop table tab1;
DROP TABLE
testdb=> \d
No relations found.


4) データベース一覧
testdb=> \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
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
testdb | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
(4 rows)


5) 終了
testdb=> \q