dashDB Localでバックアップ＆リストア

dashDB Localを触ってみましたの記事第３弾。バックアップ、リストアを試してみた。
**バックアップの取り方だけを確認したい方は、右の目次？項目のところでリンクジャンプしてください。この記事、前おきが少し長いです**

## 参考ページ

構築の記事は[こちら](http://qiita.com/azzeten/items/dabff42a9d0ac38ff042)
今回たくさん見たマニュアルは[こちら](https://www.ibm.com/support/knowledgecenter/en/SS6NHC/com.ibm.swg.im.dashdb.doc/admin/bar_lvm_smp.html)

## dashDB Localのバックアップ、リストアの考え方

DBデータのバックアップを取る、というよりかは、dashDB Localが使用するストレージ部分のレベルでコピーしておいて、それをいざとなったらリストアするイメージ。slideshareにそれっぽいのがあったので、拝借...（リンクは[こちら](https://www.slideshare.net/ibm_analytics_japan/dashdb-local)）
![スクリーンショット 2017-06-13 17.27.47.png](https://qiita-image-store.s3.amazonaws.com/0/119378/4b16b4a4-0fb2-e657-b665-03ed4cc0a178.png)

マニュアルを見る限りはGPFSを使った例などが紹介されてますが、そんなものは手元にないのでdashDB Localの領域をLVMで構築して、バックアップリストアをやってみました。

**・バックアップを取る：LVMのスナップショット**
**・データに変更が加わる：スナップショットに変更履歴が残っていく**
**・リストアする：スナップショットを適用して元に戻す**

## 試してみる

### 前回までの復習

まず、docker部分の設定でそもそもdevicemapperが推奨なようです。前回紹介した手順にもうひと工夫が必要です。気持ち悪いので環境をゼロから作り直してみました。参考手順は[こちら](http://docs.docker.jp/engine/userguide/storagedriver/device-mapper-driver.html)

#### ファイルシステムの作成
```console
# yum install lvm2
# fdisk /dev/xvdc
```
xvdc1とxvdc2を作っておく。その後rebootして変更内容を反映させます（詳細の作り方はこちらに[メモ済み](http://qiita.com/azzeten/items/dabff42a9d0ac38ff042)です

#### device mapperの設定

設定ファイルを編集します

```console
#vi /etc/lvm/profile/docker-thinpool.profile
{
        "storage-driver": "devicemapper",
        "storage-opts": [
                "dm.thinpooldev=/dev/mapper/docker-thinpool",
                "dm.use_deferred_removal=true"
        ]
}
```

Device mapperの設定ようにLVMを作成します。マニュアル通りでOK。

```console
# pvcreate /dev/xvdc1
  Physical volume "/dev/xvdc1" successfully created.

# vgcreate docker /dev/xvdc1
  Volume group "docker" successfully created

# lvcreate --wipesignatures y -n thinpool docker -l 95%VG
  Logical volume "thinpool" created.

# lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
  Logical volume "thinpoolmeta" created.

# lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
  WARNING: Converting logical volume docker/thinpool and docker/thinpoolmeta to thin pool's data and metadata volumes with metadata wiping.
  THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
  Converted docker/thinpool to thin pool.
```

新しい lvm プロフィールを適用します。

```console
# lvchange --metadataprofile docker-thinpool docker/thinpool
  Logical volume docker/thinpool changed.
# lvs -o+seg_monitor
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Monitor
  thinpool docker twi-a-t--- 95.00g             0.00   0.01                             monitored
```

以上で、Docker側の設定完了です。後はこの設定内容を再度読み込ませればOK。

```console
# systemctl stop docker
# rm -rf /var/lib/docker/*
# systemctl daemon-reload
# systemctl start docker
```

きちんとdevice mapperの設定が反映されているかを確認します。一番最後の行「Storage Driver: device mapper」となっていればOKです。

```console
# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.13.1
Storage Driver: devicemapper
```

### やっとdashLocal側の話へ

#### dashDB Local用のストレージ領域の設定

dashDB用の領域作成をします。さっき作った/dev/xvdc2をdashLocal用にLVM作成、マウントします。

```console
---LVM作成
# pvcreate /dev/xvdc2
  Physical volume "/dev/xvdc2" successfully created.
# vgcreate vgdata0 /dev/xvdc2
  Volume group "vgdata0" successfully created
# lvcreate -L 60G -n lvdata0 vgdata0 /dev/xvdc2
  Logical volume "lvdata0" created.

--ファイルシステム、マウント
# mkfs.ext3 /dev/mapper/vgdata0-lvdata0
（省略）
# mkdir /mnt/clusterfs
# mount /dev/mapper/vgdata0-lvdata0 /mnt/clusterfs/
```

#### dashインストール！

```console
# docker run -d -it --privileged=true --net=host --name=dashDB -v /mnt/clusterfs:/mnt/bludata0 -v /mnt/clusterfs:/mnt/blumeta0 ibmdashdb/local:latest-linux
```

前回の記事で色々書いたので細かいログはここでは割愛します。


#### やっとバックアップを取る

順番的には

・バックアップ取るときように、ディスクへの書き込みを止める（サスペンド）
・バックアップ（スナップショット）を取る
・ディスクへの書き込みを再開する（レジューム）

の３段階です。


```console:サスペンド
# docker exec -it dashDB write-suspend
*************************************************
Suspending write on bludb...this may take a while
Successfully suspended write on bludb
*************************************************
```

```console:スナップショットを取る
sh-4.2# lvcreate -L 5G -s -n lvdatasnap1 /dev/vgdata0/lvdata0
  Using default stripesize 64.00 KiB.
  Logical volume "lvdatasnap1" created.
sh-4.2# lvs
  LV          VG      Attr       LSize  Pool Origin  Data%  Meta%  Move Log Cpy%Sync Convert
  thinpool    docker  twi-aot--- 95.00g              8.34   0.39
  lvdata0     vgdata0 owi-aos--- 60.00g
  lvdatasnap1 vgdata0 swi-a-s---  5.00g      lvdata0 0.00
```

```console:レジューム
sh-4.2# docker exec -it dashDB write-resume
*************************************************
Resuming write on bludb...this may take a while
Successfully resumed write on bludb
*************************************************
```

#### DBにデータを入れる

データが何も入っていない状態でバックアップを取ったので、何かテーブルを作ったりしてデータをとにかく入れます。で、この後リストアをして「からっぽに戻ってる！」というのを確認するシナリオです。

データを入れる方法は[こちら](http://qiita.com/azzeten/items/7a4a046fc73f9932534a)

ちゃんとLVMのスナップショットも変わっています。
Data%の所が、何か変更が加わるとどんどん増えていきます。ここに、変更前のメタデータが入ってい、いざリストアした時は変更前データが適用されて、元に戻る感じのようです。

```console:LVSコマンドでスナップショットの容量が変わっていること（変更が記録されている）を確認
# lvs
  LV          VG      Attr       LSize  Pool Origin  Data%  Meta%  Move Log Cpy%Sync Convert
  thinpool    docker  twi-aot--- 95.00g              8.35   0.39
  lvdata0     vgdata0 owi-aos--- 60.00g
  lvdatasnap1 vgdata0 swi-a-s---  5.00g      lvdata0 2.45
```

#### リストア

・DB止める
・ファイルシステムをunmountして、スナップショットを適用しデータを戻す
・戻ったファイルシステムを再びmount
・DBを起動して、中身を確認し、データがからっぽの状態になっていることを確認

の３手順です

```console:DBを止める
# docker exec -it dashDB stop
-- Stopping dashDB Local services --

-- Stopping core services --


dsserver_home: /opt/ibm/dsserver
port: 9300
https.port: 8443
status.port: 9302

dsserver_home: /opt/ibm/dsserver
port: 9300
https.port: 8443
status.port: 9302
SERVER:STOPPED

[05:41:23]  INFO: CONNECT TO BLUDB
[05:41:23]  INFO: LIST APPLICATIONS for database BLUDB
[05:41:23]  INFO: QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS
[05:41:23]  INFO: CONNECT RESET
[05:41:23]  INFO: Completed issuing quiesce for all databases - waiting for apps to be forced off
[05:42:24]  INFO: List applications for database BLUDB
[05:42:24]  INFO: Checking database consistency for BLUDB:
[05:42:24]  INFO: Deactivate db BLUDB
[05:42:25]  INFO: Checking database consistency after deactivating db
 All committed transactions have been written to disk    = YES
[05:42:25]  INFO: Stopping dashDB ...

-- Successfully stopped dashDB --
# docker stop dashDB
dashDB
```

```console:アンマウントしスナップショットを適用し、またマウント
# umount /mnt/clusterfs
sh-4.2# lvs
  LV          VG      Attr       LSize  Pool Origin  Data%  Meta%  Move Log Cpy%Sync Convert
  thinpool    docker  twi-a-t--- 95.00g              8.35   0.39
  lvdata0     vgdata0 owi-aos--- 60.00g
  lvdatasnap1 vgdata0 swi-a-s---  5.00g      lvdata0 3.34
sh-4.2# lvconvert --merge /dev/vgdata0/lvdatasnap1
  Merging of volume vgdata0/lvdatasnap1 started.
  lvdata0: Merged: 96.67%
  lvdata0: Merged: 100.00%
# mount /dev/vgdata0/lvdata0 /mnt/clusterfs
```

```console:dash再起動
# docker start dashDB
dashDB
# docker exec -it dashDB start
```


中身を確認してみる。きちんと消えてる!

```console
# docker exec -it dashDB dbsql -db bludb -u bluadmin -pw netezza
Welcome to dbsql, the IBM dashDB SQL interactive terminal.

Type:  \? for help with internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

BLUDB.BLUADMIN(BLUADMIN)=> \dt
No relations found.

```