PostgreSQL運用のことはじめ

# はじめに

この記事はPostgreSQLって知っているけど、どう運用し始めればいいのか困っている人のための記事です。
PostgreSQLについてリファレンス的な説明はあるが、じゃあどうやって運用をするのがセオリーなのかがわからないという声があったため、一例として、私がやっている運用についてまとめています。

DB運用をするにあたり、最低限の操作として以下の手順をまとめました。

* インストール手順
* バックアップ手順
* リストア手順

なお、本資料は[PostgreSQL入門 /インストール/バックアップ/リストア](http://jpug-kansai.connpass.com/event/42718/)の資料としても利用しております。

# インストール手順

## 事前の検討ポイント

### サーバ設定

今回はCentOS7系でのインストールを考えます。
また、システムロケールとして"LANG=ja_JP.UTF-8"を利用します。
CentOS7では、以下のコマンドでシステムロケールを設定・確認できます。

```
localectl set-locale LANG=ja_JP.UTF-8
localectl status
```

### PostgreSQLのバージョン

PostgreSQLのバージョンは「x.y.z」の形式で、「x.y」がメジャーバージョン「z」がマイナーバージョンになります。
メジャーバージョンが変わると内部構造や機能が大きく変わる可能性があるので、利用時にどのメジャーバージョンを利用するか決めましょう。

PostgreSQLのクライアントツールはPostgreSQLのバージョンを厳密にみていることが多く、新バージョンのクライアントから旧バージョンDBサーバにはアクセスできますが、旧バージョンのクライアントから新バージョンのDBサーバにアクセスすることはできません。

例: × PostgreSQL9.5のクライアント -> PostgresSQL9.6のサーバ

今回は、PostgreSQLの9.5系でのインストールを考えます。

もし、運用中にメジャーバージョンを上げるときには、アプリケーションの回帰テストをオススメします。
また、メジャーバージョンの下げる方向に移行することは運用上できません。

### PostgreSQLの設定

DB内での2バイト文字の保存形式を決める必要があります。
今回は、UTF-8を利用します。(移行案件でなければ、これで良いのではないかと思います)

また、PostgreSQLとして独自にロケールを設定できるのですが、環境をシンプルにするならシステムロケールと一緒(no-locale)で良いかと思います。

ロケール設定の詳細については、こちらの資料に詳しく記載されております。
http://lets.postgresql.jp/documents/technical/text-processing/2/

そのほか、インストール直後に変更するべき設定については、こちらを参考になります。
<iframe src="//www.slideshare.net/slideshow/embed_code/key/ukczMmwjJYldCP" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/syunsukemihara5/amazon-rds-83542462" title="Amazon RDSを参考にしたとりまチューニング" target="_blank">Amazon RDSを参考にしたとりまチューニング</a> </strong> from <strong><a href="https://www.slideshare.net/syunsukemihara5" target="_blank">Shunsuke Mihara</a></strong> </div>

## インストール手順

まず、公式リポジトリから専用のrpmを取得します。
ダウンロードURLは、OSの種類、インストールするPostgreSQLのバージョンによって違います。

```Bash
su -
wget http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/pgdg-redhat95-9.5-3.noarch.rpm
rpm -ivh pgdg-redhat95-9.5-3.noarch.rpm
```

PostgreSQLをインストールします。
この時に、95を忘れるとCentOS標準のリポジトリから、別バージョンのPostgreSQL(CentSOの場合は9.2)がインストールされるので注意してください。

```Bash
yum install postgresql95-server postgresql95-contrib postgresql95-test
```

DBの保存領域(/var/lib/pgsql/9.5/data以下)を作成します。
この時、initdbに"--encoding=UTF-8 --no-locale"をオプションとして設定します。
postgresql○○-setupからinitdbを呼び出すときには、"PGSETUP_INITDB_OPTIONS"でオプションを設定していれば読み込まれます。

```Bash
export PGSETUP_INITDB_OPTIONS="--encoding=UTF-8 --no-locale"
/usr/pgsql-9.5/bin/postgresql95-setup initdb
```

DBへのアクセス権を設定します。
ローカルからのアクセスを全許可、ローカルIPセグメント(例:10.1.0.0)からパスワードアクセス(平文)を許可する設定は、以下になります。

```Bash
vi /var/lib/pgsql/9.5/data/pg_hba.conf
--▼変更----------------------------------------------------------------
# "local" is for Unix domain socket connections only
local   all             all                                     trust
------------------------------------------------------------------------------
--▼末尾に追加----------------------------------------------------------------
#LOCAL
host    all         all         10.1.0.0/16           password
------------------------------------------------------------------------------
```

ここまで、できたらPostgreSQLのサーバを起動します

```Bash
systemctl enable postgresql-9.5
systemctl start postgresql-9.5
```

ローカルからpostgresユーザ(管理ユーザ)でアクセスできることを確認します。

```Bash
psql -U postgres
```

# バックアップ・リストア手順

## バックアップ方法の検討

PostgresSQLからデータを丸ごと取得するには以下の２種類の方法があります。

1. pg_dumpall
2. pg_dump
3. DBの保存領域(/var/lib/pgsql/9.5/data)をファイルとして保存
4. pgadminを利用したバックアップ

pd_dumpallは、対象サーバ内のDBやユーザ権限などすべてを取得するコマンドで、主にハードウェア障害対策として使います。
pg_dumpは、対象サーバ内の対象DBの中身のデータをすべて取得するコマンドで、主にDBのサーバ移行などに利用します。

今回は、pg_dumpallを使ったバックアップを記載します。

## バックアップ手順(pg_dumpall)

以下の様なコマンドで、DB内のすべてのデータが{バックアップファイルの保存場所}に保存されます。

```Bash
pg_dumpall | gzip 1> {バックアップファイルの保存場所} 2> pg_dumpall.log
```

これをバックアップサーバにファイル転送して、保存すれば良いです。

## リストア手順(pg_dumpall)

もし、ハードウェア障害などが発生し、上記のバックアップからリストアするときは、「initdb」まで完了したサーバを用意して、以下のコマンドを実行します。

```
cat {バックアップファイルの保存場所} | gunzip | psql template1 > pg_restore.log
```