Windows環境でローカルDB（MariaDB,PostgreSQL,Oracle）をもっと気軽にセットアップしたい

# 対象読者
・筆者自身（**備忘録**として）
・各SQLの方言を体感したく、**お試しでいろいろダイナミックにデータベースを触ってみたい**人。
・DBAとかセキュリティとか**難しい話はどうでもいい**から、
　とりあえずパイロット版や検証モジュールからのスタブなどを用途として
　**何でもいいから自由にお触り可能なデータベースが欲しい**人。
・普段、開発で利用している開発機に対するアクセス制限・利用制限が厳しく
　「いいよいいよ。じゃあ**自分の端末に作りゃいいんだろ！**」と毒を吐きつつ、
　結局、Windows環境にローカルDBを作るのが**何となく面倒くさくて**重い腰がなかなか上がらない人。

# 用意するもの
・管理者権限をもったユーザでログオンができるWindowsPC
　（もしくは管理者権限そのもの）
・それぞれのDBに接続可能なSQLエディタ

# 対象となるデータベース
RDBMS界隈で**著名**、もしくは現場でよく**目にする**ことの多い
以下のデータベースをセットアップ対象とします。

・**MariaDB**（MySQLでも可）
・**PostgreSQL**
・**Oracle**

# 本稿の目的・ゴール
１．データベースの**インストールからインスタンスの作成**までサクッとできること。

２．作ったデータベースに**SQLエディタでアクセス**できること。

３．作ったデータベースに**テーブルを作れる**こと。

４．作ったテーブルに対して**DML文を発行できる**こと。

# 逆に、想定していない目的
１．**複数の開発者間**でローカルDBとして利用したい。
　⇒あくまでオレオレデータベースなので一人専用です。
　　カスタマイズすれば何とかなるかもしれませんが本稿では触れません。

２．この手順をベースに**運用に耐え得るちゃんとしたデータベースサーバ**を組み上げたい。
　⇒コマンドカタカタやマウスポチポチという余分をできるだけかなぐり捨てて、
　　こまけぇこたぁいいんだよ（スピード構築重視）を主目的に据えたので、
　　精緻なインフラ構築のベース手順とするのには色々と考慮が足りてないと自分でも思います。
　　つまり、不向きです。
　　対象のデータベースとしてSQLServerに触れなかったのはそういう理由からです。
　　（~~SQLServerはセットアップと後始末がめんどすぎ~~）

# 実行環境
OS：Windows10 Pro 64bit - April 2018 Update(1803)
SQLエディタ：[A5:SQL Mk-2](https://a5m2.mmatsubara.com/)

>
「A5:SQL Mk-2」はMySQL、PostgreSQL、Oracleへアクセス可能なフリーのSQLエディタです。
　大変、お世話になっております。
>

# 事前準備
セットアップの設定値として扱う情報を**あらかじめ用意**しておくのがコツです。
Excelでもメモ帳でもなんでもいいのでまとめておきましょう。
インフラ業界ではお馴染みの、俗に言う**パラメータシート**ですね。


|項番|  項目       |  本稿で適用するサンプル値 |
|:-----|:-----------------|:------------------|
|1|  rootパスワード（共通）  |              admin |
|2|  DBインストールルートフォルダ  |       C:\db |
|3| MariaDBのバージョン | 10.3.13(64bit) |
|4|  MariaDBのインストールホーム   |  C\db\maria  |
|5| MariaDBのポート     | 50000 |
|6| MariaDBのインスタンス |mdbtest |
|7| MariaDBのユーザ | muser |
|8| MariaDBのパスワード|  muser |
|9| PostgreSQLのバージョン | 10.7(64bit) |
|10| PostgreSQLのインストールホーム   |  C:\db\pg  |
|11| PostgreSQLのポート     | 55000 |
|12| PostgreSQLのインスタンス |pgtest |
|13| PostgreSQLのユーザ | puser |
|14| PostgreSQLのパスワード|  puser |
|15| Oracleのバージョン | 11gR2(64bit) |
|16| Oracleのインストールホーム   |  C:\db\ora  |
|17| Oracleのポート     | 1521（※） |
|18| Oracleのインスタンス |xe （※）|
|19| Oracleのユーザ | ouser |
|20| Oracleのパスワード|  ouser |
※OracleはExpressEditionを使用するため
　インスタンス名は固定で「xe」、ポートは「1521」固定とします。

なお、データベースのバージョンについてですが、
パラメータシートを作る時点で、流石に何も見ずにリストアップするのは無理なので
先にDB公式のサイトで最新版なり安定版なりのバージョンを確認しておきましょう。

個人的には、バージョン挙動の検証とかではない限り、**適当に選んで**います。
「最新の安定板から一つ、二つ下のバージョン」くらいが
安定感が増す気がします。（オカルト）

# MariaDB
「何故、MySQLではなくMariaDBを題材にしたのか？」
と問われるなら単純に、**名前がかっこいいから**です。

あと、MySQLの[フォーク](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A9%E3%83%BC%E3%82%AF_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA))版でありながら
人気ランキング的に[**上の方**](https://db-engines.com/en/ranking)という事を踏まえて
ミーハーに飛びついてみました。
（2019年3月時点のdb-enginesの情報によるとMariaDBは12位でした）

では手順の説明です。
サクサクいきます。
お手元にパラメータシートをご用意ください。

①項番3を[公式](https://downloads.mariadb.org/mariadb/10.3.13/)からダウンロード
`mariadb-10.3.13-winx64.msi`

②インストーラを実行して、インストール。

|インストールで聞かれる内容| パラメータシート項番|サンプル値|
|:-----|:-----------------|:------------------|
|インストール場所|4|C:\db\maria|
|rootのパスワード|1|admin|

後は全部デフォルト。

③「項番4\bin」へPATHを通す。（システム環境変数PATHを編集）
`C:\db\maria\bin`

④インストール直後は勝手にMySQLサービスが起動しているので
　「サービス（※）」から「MySQL」を停止。

※`Windows+R`⇒`services.msc`
　もしくはタスクマネージャー（`Ctrl+Shift+Esc`）からサービスタブ」
※管理者権限のDOSプロンプトから`net stop MySQL`でもOK。

⑤「項番4\data\my.ini」をテキストエディタで編集。portを「項番5」にする。

``` sh:my.ini
[mysqld]
datadir=C:/db/maria/data
port=50000
innodb_buffer_pool_size=494M
[client]
port=50000
plugin-dir=C:/db/maria/lib/plugin
```

⑥「サービス」から`MySQL`を開始。

⑦設定ファイル（SQLの羅列）をテキストエディタで作成。
項番6～8を参照して、SQL文を作成し、項番4に保存。

|項番|  項目       |  本稿で適用するサンプル値 |
|:-----|:-----------------|:------------------|
|4|  MariaDBのインストールホーム   |  C\db\maria  |
|6| MariaDBのインスタンス |mdbtest |
|7| MariaDBのユーザ | muser |
|8| MariaDBのパスワード|  muser |

``` sql:設定ファイルフォーマット
create database 【項番6】;
GRANT ALL PRIVILEGES ON 【項番6】.* TO 【項番7】@localhost IDENTIFIED BY '【項番8】' WITH GRANT OPTION;
FLUSH PRIVILEGES;
```

``` sql:設定ファイル例（maria_setup.txt）
create database mdbtest;
GRANT ALL PRIVILEGES ON mdbtest.* TO muser@localhost IDENTIFIED BY 'muser' WITH GRANT OPTION;
FLUSH PRIVILEGES;
```

⑧管理者権限でDOSプロンプトを起動。
（`Windowsキー`押す、`cmd`と打つ、`Ctrl+Shift+Enter`）
カレントディレクトリを項番4にする。

``` sh:DOSプロンプト（管理者権限のインスタンス）
C:\Windows\system32>cd C:\db\maria
C:\db\maria>dir maria_setup.txt
（中略）
2019/03/10  01:31               140 maria_setup.txt
（中略）
C:\db\maria>
```

⑨設定ファイルを食わせる形で`mysql`コマンドをverbose実行する。
エラーが出ていなければ成功。

|項番|  項目       |  本稿で適用するサンプル値 |
|:-----|:-----------------|:------------------|
|1|  rootパスワード（共通）  |              admin |

``` sh:DOSプロンプト（管理者権限のインスタンス）
C:\db\maria>mysql -u root -padmin --verbose < maria_setup.txt
--------------
create database mdbtest
--------------
--------------
GRANT ALL PRIVILEGES ON mdbtest.* TO muser@localhost IDENTIFIED BY 'muser' WITH GRANT OPTION
--------------
--------------
FLUSH PRIVILEGES
--------------
C:\db\maria>
```

⑩SQLエディタで接続。

|項番|  項目       |  本稿で適用するサンプル値 |
|:-----|:-----------------|:------------------|
|5| MariaDBのポート     | 50000 |
|6| MariaDBのインスタンス |mdbtest |
|7| MariaDBのユーザ | muser |
|8| MariaDBのパスワード|  muser |

項番7のユーザ（muser）は全権限持ちの特権ユーザなので
後は自分でテーブル作ったりしてアクセスすればOKです。
完了！

# PostgreSQL
お馴染みの**ポスグレ**です。
何でもかんでも略語はどうなの、と思う自分でさえ
このDBは「ポスグレ」という語感でないとしっくりきません。
逆に口語で「ポストグレエスキューエルがさぁ…」とか「ポストグレスのね…」
という使われ方を聞いてしまったら違和感を覚えるレベルかもしれません。
幸い、今まで周りにはいませんでしたが。

さてPostgreSQLもサクサクといきます。


①項番9を[公式](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads)からダウンロード
`postgresql-10.7-1-windows-x64.exe`

②インストーラを実行して、インストール。

|インストールで聞かれる内容| パラメータシート項番|サンプル値|
|:-----|:-----------------|:------------------|
| PostgreSQLのインストールホーム   |10|  C:\db\pg  |
|  rootパスワード（共通）  |1|              admin |
| PostgreSQLのポート     |11| 55000 |

後は全部デフォルト。
（ただし最後の`Launch Stack Builder at exit?`だけ**チェックを外す**）

もし、「ポートの設定を聞かれなかった」「ポートの設定をし忘れた」場合は⑤で編集する。

③「項番10\bin」へPATHを通す。（システム環境変数PATHを編集）
`C:\db\pg\bin`

④インストール直後は勝手にPostgreSQLサービスが起動しているので
　「サービス（※）」から「postgresql-x64-10」を停止。
　バージョンによってサービス名が変わるかもしれないのでGUIでの操作を推奨。

※`Windows+R`⇒`services.msc`
　もしくはタスクマネージャー（`Ctrl+Shift+Esc`）からサービスタブ
※サービス名がわかっているなら管理者権限のDOSプロンプトから
　`net stop postgresql-x64-10`でもOK。


⑤もし②のインストール時にポートが設定できなかった場合は
「項番10\data\postgresql.conf」をテキストエディタで編集。portを「項番11」にする。
（もし設定していた場合でも確認のために見ておくのがよいかも）

``` sh:postgresql.conf
（中略）
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*'		# what IP address(es) to listen on;
					# comma-separated list of addresses;
					# defaults to 'localhost'; use '*' for all
					# (change requires restart)
port = 55000				# (change requires restart)

（中略）
```

⑥「サービス」から`postgresql-x64-10`を開始。

⑦通常のDOSプロンプトを起動。（`Windowsキー`押す、`cmd`と打つ、`Enter`）
パラメータシートに従いコマンドを打っていく。

|項番|  項目       |  本稿で適用するサンプル値 |
|:-----|:-----------------|:------------------|
|1|  rootパスワード（共通）  |              admin |
|11| PostgreSQLのポート     | 55000 |
|12| PostgreSQLのインスタンス |pgtest |
|13| PostgreSQLのユーザ | puser |
|14| PostgreSQLのパスワード|  puser |


``` sh:DOSプロンプト（コマンドのフォーマット）
C:\Users\user>createuser -d -U postgres -P -p 【項番11】 【項番13】
新しいロールのためのパスワード:【項番14】
もう一度入力してください:【項番14】
パスワード:【項番1】
C:\Users\user>createdb -E UTF-8 -O 【項番13】 -U 【項番13】　-p　【項番11】 【項番12】
パスワード:【項番14】
C:\Users\user>
```

``` sh:DOSプロンプト（実行例）
C:\Users\user>createuser -d -U postgres -P -p 55000 puser
新しいロールのためのパスワード:puser
もう一度入力してください:puser
パスワード:admin
C:\Users\user>createdb -E UTF-8 -O puser -U puser -p 55000 pgtest
パスワード:puser
C:\Users\user>
```

⑧SQLエディタで接続。

|項番|  項目       |  本稿で適用するサンプル値 |
|:-----|:-----------------|:------------------|
|11| PostgreSQLのポート     | 55000 |
|12| PostgreSQLのインスタンス |pgtest |
|13| PostgreSQLのユーザ | puser |
|14| PostgreSQLのパスワード|  puser |

あとは項番13のユーザ（puser）でテーブル作ったりしてアクセスすればOKです。
完了！

# Oracle
泣く子も黙るOracleです。
特筆することもありませんね。
エントリーモデルの「[Express Edition](https://www.oracle.com/technetwork/jp/database/database-technologies/express-edition/overview/index.html)」をインストールしていきます。
バージョンは18でもよかったのですが何となく11gR2にしました。

サクサクやっていきましょう。

①項番15を[公式](https://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/xe-prior-releases-5172097.html)からダウンロード
`OracleXE112_Win64.zip`

②ZIPを解凍し、インストーラ（DISK1\setup.exe）を実行して、インストール。

|インストールで聞かれる内容| パラメータシート項番|サンプル値|
|:-----|:-----------------|:------------------|
| Oracleのインストールホーム   |16|  C:\db\ora  |
|  rootパスワード（共通）  |1|              admin |

後は全部デフォルト。

③Windowsスタートメニュー（もしくはデスクトップに作成されたショートカット）から
`Oracle Database 11g Express Editionのスタート・ガイド`を起動する。

＜スタートメニュー＞
![startmenu.png](https://qiita-image-store.s3.amazonaws.com/0/354720/f15f98fb-cecd-2dc9-9dd7-00f3dfc49da7.png)

＜ApplicationExpressの起動＞
![topgamen.png](https://qiita-image-store.s3.amazonaws.com/0/354720/2de1d014-353f-bde6-ddf6-a900ac28e44d.png)

以降、画面での操作になりますが
デフォルトが「英語」なので「日本語」がよければ
ページ下部の「言語」から変更しておきましょう。

＜ページ下部の言語＞
![locale.png](https://qiita-image-store.s3.amazonaws.com/0/354720/c856b00a-41e8-984e-9705-0e151f06b2ec.png)


④ApplicationExpressボタンをクリック。
![AE.png](https://qiita-image-store.s3.amazonaws.com/0/354720/ad663ff6-8ef4-52d5-9b61-50eeec8885f0.png)

⑤ログインを促されるので「SYSTEM」アカウントでログイン。
パスワードは項番1。

![login.png](https://qiita-image-store.s3.amazonaws.com/0/354720/1ad59477-678a-1656-30c7-23131512f08a.png)

⑥ワークスペースを作成。

|項番|  項目       |  本稿で適用するサンプル値 |
|:-----|:-----------------|:------------------|
|19| Oracleのユーザ | ouser |
|20| Oracleのパスワード|  ouser |

![createWS.png](https://qiita-image-store.s3.amazonaws.com/0/354720/164fe06f-8d99-26b2-3125-c46dd36cd6c6.png)

「データベースユーザ名」がSQLエディタで接続する際のユーザです。
「ApplicationExpressユーザ名」はこのコンソール（スタートガイド）にログインする際のユーザです。
（ApplicationExpressユーザ名はこの後使わないのでぶっちゃけ何でもよいです。）
（パスワードは「データベースユーザ」「ApplicationExpressユーザ」**共通**になります。）

⑦ワークスペースの作成を押すと、トップ画面に遷移し成功メッセージが表示されます。
![mes.png](https://qiita-image-store.s3.amazonaws.com/0/354720/bc22bf4e-6400-3ff7-c94f-b97c5d9a97f3.png)

「ここをクリックして」と言われていますが**無視**して
ブラウザを閉じてもらって大丈夫です。

⑧SQLエディタで接続。

|項番|  項目       |  本稿で適用するサンプル値 |
|:-----|:-----------------|:------------------|
|17| Oracleのポート     | 1521 |
|18| Oracleのインスタンス |xe |
|19| Oracleのユーザ | ouser |
|20| Oracleのパスワード|  ouser |

あとは項番19のユーザ（ouser）でテーブル作ったりしてアクセスすればOKです。
完了！

# まとめ
もっとうまいサンドボックスの仕立て方はありそうですが
シンプルに各DBを0ベースで再構築できる手順にしてみました。
なんならアンインストールも一発ですし。
~~SQLServerはなんであんなにアンインストールがむずかしいんだ~~

バージョンが変われば手順も変わってくるかもしれませんけど
しばらくはこの手順で「遊ぶ分」には困らないかなぁと思っております。

ご指摘ございましたらコメント頂けるとありがたいです。
ご覧頂きありがとうございました。


# （Appendix）OracleのApplicationExpressが起動しない場合の対応
エラー例１．%HTTPPORT%が必要とか言われる
![Oracle.png](https://qiita-image-store.s3.amazonaws.com/0/354720/8d65f2a3-1893-8da4-dff0-d324a33c5c51.png)

対応１．
「スタートガイド」のプロパティを見ると
「C:\db\ora\app\oracle\product\11.2.0\server\Get_Started.url」
を叩いているだけのショートカットらしい。

```sh:Get_Started.url
[InternetShortcut]
URL=http://127.0.0.1:8080/apex/f?p=4950
```

%HTTPPORT%がないよ！って怒られた意味は**よくわからない**が
デフォルトで**8080ポート**を見に行くらしいので直打ちしてみる。
http://127.0.0.1:8080/apex/f?p=4950

エラー例２．アクセスエラーになる。
![ChromeError.png](https://qiita-image-store.s3.amazonaws.com/0/354720/ece18b0d-1e3c-c405-5b10-159534a71131.png)

対応２．
DOSプロンプトを起動して「netstat」を実行。
もし8080がListenされていない場合は、ここで**休憩**する。
どうもスタートガイドを開くための8080ポートがLISTENされるまで、
DB起動からちょっと時間を要する場合があるみたい。

``` sh:DOSプロンプト
C:\Users\user>netstat -aon | find "8080"

C:\Users\user>
#はい。休憩休憩。
```

休憩から戻ったら、もう一度「netstat」を実行。

``` sh:DOSプロンプト
C:\Users\user>netstat -aon | find "8080"
  TCP         0.0.0.0:8080           0.0.0.0:0              LISTENING       1672
  TCP         [::]:8080              [::]:0                 LISTENING       1672
#何かよくわからないがLISTENされたっぽい。
C:\Users\user>
```

この状態でもう一回
http://127.0.0.1:8080/apex/f?p=4950
へアクセスする。

それでもダメな場合、
つまり例えば
「既にTomcatのローカル環境を導入していて**8080ポートで競合が発生**している」
場合などは
ApplicationExpressのポート変更を行う。
「[Oracle xe ポート変更](https://www.google.com/search?q=Oracle+xe+%E3%83%9D%E3%83%BC%E3%83%88%E5%A4%89%E6%9B%B4&oq=Oracle+xe+%E3%83%9D%E3%83%BC%E3%83%88%E5%A4%89%E6%9B%B4&aqs=chrome..69i57j69i59j0.616j0j4&sourceid=chrome&ie=UTF-8)」でググるとたくさん出てくるのでそちらを参考に。
（他力本願）

# （Appendix）デフォルトポートの変更について
MariaDBとPostgreSQLのDBリスナーポートについては
あえてデフォルトポートの「3306」と「5432」を使わずに設定してみました。

IANAの[登録済みポート番号（Registered port numbers）](https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7#%E7%99%BB%E9%8C%B2%E6%B8%88%E3%81%BF%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7_(1024%E2%80%9349151))をあえて避けて
[**プライベートポート番号（Dynamic and/or private ports）**](https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7#%E5%8B%95%E7%9A%84%E3%83%BB%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88_%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7_(49152%E2%80%9365535))を採用した、という事です。
（ムカつくドヤ顔）

何故かというと「**MariaDBとPostgreSQLは簡単にポートを変えられた**」
という実績（記録）を残したかったからです。
逆に言うと**「OracleExpressEdition」のポート変更に挫折した**、
と言い換えてもいいかもしれません。（震え声）

まぁ、ローカル環境のポートなんざ
動けば別に**登録済みポート番号でも何でもよい**のですが
IANAの登録済みポート番号[（リスト）](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)くらいは事前に確認して、
既存ソフトウェアとの競合がないかくらいは確認しようと
あらためて身を引き締めた次第であります。