DB Management tool新時代の幕開けか!? OmniDBを評価させていただく！

本記事は PostgreSQL Advent Calendar 2017 の2日目です。
昨日はkkidaさんの「[コピペで試す PG10 の 3ステップレプリケーション！](http://kkida-galaxy.blogspot.jp/2017/12/pg10-3step-replication.html)」でした。
記事内の"(PostgreSQL 10では)デフォルト値が変更になり、（最小ではパラメータ変更なしでも）レプリケーションできます。"という点は私も本記事向け検証環境の構築を通して実に素晴らしい変更だと感動しました。


本記事では、"OmniDB"というDBマネジメントツールを紹介します。
PostgreSQLのDBマネジメントツールと言えば、v2.0からとても使い勝手が良くなったと評判の"pgAdmin4"が定番です。
そのため"pgAdmin4"との比較といった形で"OmniDB"を評価していこうと思います。

※2017/12/29追記 OmniDBメイン開発者の二人が在籍する2ndQuadrant社のブログでOminiDBのデモの記事がありましたので追記します。6分の動画でOmniDB上でロジカルレプリケーションを構築しており参考になりますし、動画のトランスクリプトもあるので英語の勉強にもなりますよ。[Here’s How You Can Run OmniDB On Postgres10 [VIDEO]](https://blog.2ndquadrant.com/omnidb-postgres-demo/)

# 概要と歴史
## OmniDBの概要と歴史
[OmniDB](https://github.com/OmniDB/OmniDB)はGUIベースのDBマネジメントツールです。"omni"="全て"という名前の通り、PostgreSQLだけではなく、以下のDBに対応する予定となっています。

+ PostgreSQL (対応済み)
+ MySQL
+ Oracle
+ Firebird
+ SQLite
+ Microsoft SQL Server
+ IBM DB2

しかし、現時点(2017/12/02)ではPostgreSQL以外のDBについては未対応の状態なんです。現状PostgreSQLしか対応していない状態で、"OmniDB=全てのDB"とは随分と大きく出たなという印象を持ちましたが、OmniDBの[ドキュメント](https://OmniDB.org/en/) によると"OmniDBファーストバージョン"というものが存在し、

+ 開発者は Rafael Thofehrn Castro(rafaelthca)さんと William Ivanski(wind39)さんのお二人
+ もともとはブラジルのパラナ連邦大学コンピュータサイエンスコースの卒業研究(?)として開発
+ ASP.NET/C# で書かれていた
+ OmniDBファーストバージョンでは上記全てのDBをサポートしていた

とのことで、ある程度の完成されたソフトウェアが存在しており、現在はPythonでリファクタリングをしている状況のようです。

### 何故OmniDBを触ってみようと思ったか
個人的ないくつかの理由があります。

+ 私は普段PostgreSQLしか触らない人間ですが、ミドルによってはMySQLやSQLiteが使われていることも多く、それらを一括で管理できるツールがあればと思っていた
+ 最初にPostgreSQLに対応している点に好感が持てる(身びいき)
+ 開発を行っている上記2名の方は現在2ndQuadrantに所属している
+ 2ndQuadrantといえばPostgreSQLへ多大な貢献をしている会社である(ロジカルレプリケーション、barman、BDRなどなど)

ひとことで言うと「あの2ndQuadrantが開発しているのか！？これは期待」というミーハー感から興味を持ちました。

## pgAdmin4の概要と歴史
一方の[pgAdmin](https://www.pgadmin.org/)もGUIベースのDBマネジメントツールですが、"pg"の名を冠す通りPostgreSQL専用ツールです。
前バージョンであるpgAdmin3のversion1.0.0はchangelogによると2003年9月にリリースされており、伝統と歴史と知名度のあるツールと言えます。
pgAdmin3については開発を終了する旨が発表されていて、今後はpgAdmin4がメンテナンスされていくとのことです。
開発は主にEnterpriseDB(EDB)のメンバーにて行われており、昨年のPGConf.ASIA2016でDave Pageさんが[セッションで解説](http://www.pgconf.asia/JA/2016/day-2/#A5)もされています。
私も発表を聞いたのですが、「pgAdmin3はC++だしコードも積み重なっててメンテ大変だから、もう全部1から作り直すことにしたぜ！それがpgAdmin4さ！！」(超意訳)という発言に潔くてカッコイイ(＞＜)！と思った記憶があります。

## もしかして2ndQuadrantとEnterpriseDBで開発バトル？
これは妄想になりますが、OmniDBの2ndQuadrant VS pgAdmin4のEnterpriseDBといった構図が見えます（気がします）。
複数の異なるDBに対応する予定のOmniDBと、PostgreSQLに特化したpgAdmin4。思想の異なるそれぞれのツールが今後どのように機能拡張されていくのか楽しみですね。


# 評価
前置きが長くなりましたが評価を行っていきます。

## 評価環境
環境は定額安心なパブリッククラウド[CloudGarage](https://cloudgarage.jp/)さんを利用して以下の構成を組みました。
マスタDB1台で、スレーブDB2台。レプリケーションはフィジカルとロジカルを1本ずつです。

![17.png](https://qiita-image-store.s3.amazonaws.com/0/120707/d344303c-ecd5-1907-6ee0-45b687affda1.png)


それぞれのバージョンは以下の通りです。

+ サーバ
  + ubuntu 16.04.3
  + PostgreSQL 10.1
  + OmniDB 2.3.0
  + pgAdmin4 2.0

+ クライアント
  + Windows7
  + Chrome 62.0.3202.94 


## 機能について
まずはアプリケーションとして基本情報について。
OmniDBとpgAdmin4について特に差がない場合は"<-"としています。
どちらも利用者にとって大きな差はありません。(DjangoとFlaskは中の話なので触れません)

| -                          | OmniDB                     | pgAdmin4                                         |
|----------------------------|----------------------------|--------------------------------------------------|
| 対応DB                     | PostgreSQL(将来MySQL等追加予定)   | PostgreSQL                                  |
| PostgreSQLの対応バージョン | 最新のver10まで対応        | <-                                                |
| 対応OS                     | Linux , Windows , OS X     | <-                                                |
| モード                     | アプリケーション or サーバ(ブラウザベース) | <-                                    |
| 開発言語                   | python , Django            | python , Javascript , jQuery , Bootstrap , Flask |


続いて機能について比較します。
どちらのツールも各オブジェクト（インスタンス、データベース、テーブル、データなどなど）の作成、変更、削除を行うことが可能ですが、大きな違いとして以下が異なりました。

* OmniDB -> 作成、変更時はSQLのテンプレートを表示する(テーブル作成はウィザード)
* pgAdmin4 -> 作成、変更時はウィザードを表示する

これは好みの別れるところですが、SQLに慣れている身としてはOmniDBのシンプルさがありがたいです。

OmniDBのシーケンス作成画面(SQLテンプレート表示)
![10.png](https://qiita-image-store.s3.amazonaws.com/0/120707/7db0e129-6d88-58c1-6e95-a5ceb6598825.png)

pgAdmin4のシーケンス作成画面(ウィザード表示)
![11.png](https://qiita-image-store.s3.amazonaws.com/0/120707/f328ed87-f2e7-0a86-3e9d-c4f1931676ec.png)


ここからはざっと触りながらつらつらと紹介していきます。

### ログイン画面
まずはログイン画面です。どちらもシンプルで良いです。

OmniDB -> シンプルで無駄の無い画面構成ですね
![01.png](https://qiita-image-store.s3.amazonaws.com/0/120707/e2567ee2-370f-0906-55a4-0179396184f3.png)

pgAdmin4 -> こちらもシンプルです。ゾウさんマークが素敵です
![02.png](https://qiita-image-store.s3.amazonaws.com/0/120707/8710cdd6-f975-0143-4224-5b34bd9413fc.png)

### トップ画面
ログイン後のトップ画面です。

OmniDB -> 接続するDBの一覧が表示されます。ちょっと分かりづらいのですが、 :white_check_mark: をクリックするとDBの管理画面(ワークスペース)に移ります。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/120707/46362371-2b48-4c45-09a3-c456e2f4fb49.png)

pgAdmin4 -> こちらはすぐに管理画面が表示されます

![04.png](https://qiita-image-store.s3.amazonaws.com/0/120707/a60a5eda-7dc8-815c-ee2c-23becb8ac7e7.png)

### モニタリング機能
OmniDBには、pgAdmin4の目玉(だと勝手に思っている)ダッシュボードに類似する機能はありませんが、セッションとレプリケーションの状態を表示できます。

OmniDB -> バックエンドプロセスの一覧です。 赤い四角ボタンでkillを発行できます
![05.png](https://qiita-image-store.s3.amazonaws.com/0/120707/39ee53cd-f2f5-68eb-0e6b-a9d9060be590.png)

レプリケーションの状態が見れるのも地味に嬉しいですね
![06.png](https://qiita-image-store.s3.amazonaws.com/0/120707/ae72b38f-ab01-a7ff-12cf-2c8d9d2cb915.png)

pgAdmin4 -> 初めて見た時は「これ本当にpgAdmin?」って思ったダッシュボード
DBの状態が一覧でき、セッションの停止やロックの確認もできて素敵です
![07.png](https://qiita-image-store.s3.amazonaws.com/0/120707/b7a32c79-f653-1300-4a45-4ea080d5a71e.png)

モニタリングという意味では直近500件くらいのログ表示とか出来ると嬉しいのですけど、どちらのツールにもその機能は無いようです。
[pg_stats_repoter](http://pgstatsinfo.sourceforge.net/documents/reporter3.1/html/pg_stats_reporter-ja.html)とかその他ツールの利用 or 直接確認しましょう。

### クエリ発行
どちらのツールもSQLのシンタックスハイライト、結果表示が可能です。
OmniDBに関しては列名などのcompletion(補完機能)があるはずでしたが、
私の環境では使用できませんでしたorz(一瞬だけ表示され消える)

OmniDB -> シンプルなハイライト。補完機能も使えるはずですが動作せずorz
![08.png](https://qiita-image-store.s3.amazonaws.com/0/120707/a6a3253d-4e5d-74aa-76d2-53fa17505b51.png)

pgAdmin4 -> ハイライトはこっちの方が見やすくて好き
![09.png](https://qiita-image-store.s3.amazonaws.com/0/120707/60324d4e-6cb0-e0ac-efa1-a23f5628700b.png)

### Explain表示
新規クエリの性能評価、Slowクエリの調査などでExplainには大変お世話になります。

OmniDB -> 見慣れたExplain結果を表示してくれて、COST値の大きいものほど赤いハイライトが長く表示されるようです。これは地味に嬉しい！
![12.png](https://qiita-image-store.s3.amazonaws.com/0/120707/586f72d4-e90f-3bf6-622e-0532f33f8235.png)
ツリー表示も可能です。
![13.png](https://qiita-image-store.s3.amazonaws.com/0/120707/be9243b8-6d17-9058-8cae-6d9b7919a095.png)

pgAdmin4 -> ツリー表示がいけてますね。psqlに慣れた身としては素のExplain結果が最初に欲しいところ
![14.png](https://qiita-image-store.s3.amazonaws.com/0/120707/98ef7fd6-3087-6813-f49f-ae607b3e6026.png)

### ドキュメント表示
OmniDBでは、オブジェクトを右クリックするとドキュメントのメニューが用意されていて、クリックすると直接該当のドキュメントを参照することができます。これ個人的にすごい嬉しいです。
![15.png](https://qiita-image-store.s3.amazonaws.com/0/120707/32dfc700-8d2e-39b9-12ce-35ae6dd4460c.png)

### レプリケーションの管理
OmniDBでは、レプリケーションスロット、ロジカルレプリケーションの管理が可能になっています。
![16.png](https://qiita-image-store.s3.amazonaws.com/0/120707/be1d40ff-5a8c-e4a4-f92e-4e8204a1597f.png)


# 感想
ざっくりと触ってみた感想ですが、OmniDBもpgAdmin4も機能としては十分と思いました。その上でそれぞれのカラーが出ていて

* 手とり足取りやってくれる初心者にも優しいpgAdmin4
* 全体的なシンプルさとドキュメント参照機能で経験者も嬉しいOmniDB

という印象です。
今回は本番運用しているような、一定規模以上のDBを扱った場合の安定性や快適さ等まで検証できなかったため、今後試せたらなぁと思っています。

3日目の明日はsnagaさんの[Dockerを使ってデータ分析用にPostgreSQLを使ってみる](http://pgsqldeepdive.blogspot.jp/2017/12/dockerpostgresql_3.html)です。
お楽しみに(＞＜)!