DockerでOracle動かしたついでに、公式サンプルデータを突っ込んでから、ER図を自動生成してみようぜ

10 min read読了の目安(約9700字

概要

主に、Oracleの勉強したいとか、Java等でOracleつないであれこれするサンドボックスがほしいとか、そういう人向けの記事になります。
SchemaSpy自体はMySQLだろうが、ぽすぐれさんだろうが使えますので、Javaじゃないと役に立たないってツールではございません。

  • Docker/Java(8~)はインスコされているものとします
  • Oracleにユーザ登録して、DBをダウンロードします
  • Oracle提供のDockerビルドツールでOracle用イメージを召喚します
  • あれこれ設定します
  • SchemaSpyでER図を生成します

最終的に表示されるドキュメントはgithub pagesとして公開しています。

モバイルには最適化されておらず、正しく見ることができません。

https://angelica-keiskei.github.io/oracle-docker-sample/spy/schemaspy/index.html

上記のgitにはoracleのDBやドライバ,SQLは当然含まれません。
cloneしてもdocker-composeの手間はほぼ省けないので注意してください。

入手! Oracle Database

Oracleのデータベースは高いと思われがちですが(実際高いのだが)、個人で勉強する分には無料でデータベースを提供してくれています。

方法は2,3ありますが、今回の用途で使えるのはOTNライセンスか、ExpressEditionでしょう。

  • OTNライセンスは、Oracle Technology Networkライセンスの略称です。端的には、利益を生まない個人利用の範疇で使って良いが、Databaseに関わるコードやらもろもろを第三者に公開するな、という制約がついています。よって、本稿で作成するDockerImageは絶対にどこぞにPublishしないようにしてください

  • ExpressEditionXEは、その名が示すとおり簡易版のDBです。
    性能面の制限に加え、機能制限されていますが、商用でも利用することが可能です。

今回は、OTNライセンスで進めたいと思います。

Oracleにユーザ登録しましょう

こちらからユーザ登録できます。
個人として利用しますので、会社名は個人名で良いです。

メールが来ますので、そのリンクを踏んだら登録完了です。

DBをダウンロードします

こちらからDBをダウンロードします。
この記事の執筆時点では19c/21cのリンクが目立っていました。情報が多いほうが良いので19cを選択します。(私は19.3を選択しています。)

Dockerであれこれしますので、Linux向けを選択しましょう。ZIP形式で良いです。

昔は12cなども提供していたようですが、いまは企業ライセンスもちへの提供に限定されているようです。

召喚! Oracle DockerImage

落としたDBをDockerImageにするには、公式のビルドツールが必要です。

git clone https://github.com/oracle/docker-images

して、ビルドツールを入手しましょう。

lsするとめちゃめちゃディレクトリが置かれています。

angelica@chalkboard ~/W/j/d/docker-images> ls
Archive                   OracleAccessManagement    OracleIdentityGovernance  OracleUnifiedDirectorySM
CODEOWNERS                OracleBI                  OracleInstantClient       OracleWebCenterContent
CODE_OF_CONDUCT.md        OracleCloudInfrastructure OracleJava                OracleWebCenterPortal
CONTRIBUTING.md           OracleCoherence           OracleLinuxDevelopers     OracleWebCenterSites
Contrib                   OracleDatabase            OracleOpenJDK             OracleWebLogic
GraalVM                   OracleFMWInfrastructure   OracleRestDataServices    README.md
LICENSE                   OracleGoldenGate          OracleSOASuite
NoSQL                     OracleHTTPServer          OracleUnifiedDirectory

が、使うのはOracleDatabaseだけです。
ですので、他は消してしまってもいいでしょう。

angelica@chalkboard ~/W/j/d/docker-images> mv OracleDatabase ../
angelica@chalkboard ~/W/j/d/docker-images> cd ..
angelica@chalkboard ~/W/j/db-test> rm -rf docker-images

イメージの作成

ダウンロードしたDBを、OracleDatabase/SingleInstance/dockerfiles/${db-version}に持っていきます。

~/W/j/d/OracleDatabase> pwd
/Users/angelica/Work/java/db-test/OracleDatabase
~/W/j/d/OracleDatabase> 
mv ~/Downloads/LINUX.X64_193000_db_home.zip SingleInstance/dockerfiles/19.3.0/
~/W/j/d/OracleDatabase> cd SingleInstance/dockerfiles
~/W/j/d/O/S/dockerfiles> ls
11.2.0.2               12.2.0.1               18.4.0                 buildContainerImage.sh
12.1.0.2               18.3.0                 19.3.0

持っていったら、READMEを見ながらコマンドを実行します。
今回の場合、19.3cのEnterprise Edition and Standard Edition 2ですので、

./buildContainerImage.sh -v 19.3.0 -e -i

を実行します。なお、ダウンロード/ストレージ容量もGB単位で消費しますし、ビルドのためにCPUリソースも消費しますので、これを実行するのは暇なときにしてください。

一昔前のmac book proで7分弱かかります。

なおイメージサイズは…。

docker images
REPOSITORY        TAG         IMAGE ID       CREATED         SIZE
oracle/database   19.3.0-ee   69a61a55a4ad   8 minutes ago   6.53GB

6.5GB。

設定! 起動スクリプト

dockerイメージを使ってコンテナを作成する準備に入りましょう。

mkdir oracle-docker
cd oracle-docker/
mkdir ./oradata
chmod 777 ./oradata
vim docker-compose.yaml

chmod 777は非推奨ですが、こちらのreadmeにあるとおり、oradataoracle(uid: 54321)ユーザの書き込みを許可する必要があります。
そのため今回は簡単化のために777を利用することにしました.

docker-compose.yamlの中身は下記です。

docker-compose.yaml
version: '3'
services:
  db:
    image: oracle/database:19.3.0-ee
    container_name: oracle
    ports:
      - 1521:1521
      - 5500:5500
    volumes:
      - ./oradata:/opt/oracle/oradata
      - ./startup:/opt/oracle/scripts/startup
    environment:
      - ORACLE_PWD=oracle123
      - ORACLE_PDB=ORCLPDB1

なお、Dockerに対して十分な量のメモリを食べさせる必要があります。4GBくらいは与えておくといいかな。
2GB以下だとログに警告が出ているはずです。

初期化DDL/DLLの実行

さて、Databaseの勉強をするのに、初期データが無いのは不便ですね。
なんと、OracleがSampleDataを提供してくれています。
こちらをダウンロードして使わせていただきましょう。

sqlファイルは4つあります。

  • ot_create_user.sql: OTユーザーを作成して特権を付与するためのものです
  • ot_schema.sql: テーブル、制約などのデータベースオブジェクトを作成するためのものです
  • ot_data.sql: テーブルにデータをロードするためのものです。
  • ot_drop.sql: サンプルデータベース内のすべてのオブジェクトを削除するためのものです。

うち、必要なのはcreate_user, schema, dataです。
それらについて、startupに格納しましょう。そして、各sqlファイルに関して次のようにリネームします。

01_ot_create_user.sql
02_ot_schema.sql
03_ot_data.sql

DDL/DLLの変更

01_ot_create_user.sqlの冒頭にはこちらを加えてください。

01_ot_create_user.sql
ALTER SESSION SET CONTAINER = ORCLPDB1;

oracleは12c以降、CDB(コンテナ・DB)PDB(プラガブル・DB)という概念を持っています。
詳しくは触れませんが、我々が操作したいのはPDBなので、この一文でセッションをCDBからPDBへ切り替えています。

01_ot_create_user.sqlのユーザ作成DDLに関して、パスワードがoracleになるよう、次のように書き換えてください

01_ot_create_user.sql
-- create new user
CREATE USER OT IDENTIFIED BY oracle;

02_ot_schema.sql, 03_ot_data.sqlにはこちらを冒頭に加えてください。
このようにすることで、01_ot_create_user.sqlで作成されるDBAアカウントOTでschemaの作成等が行えるようになります。

02_ot_schema.sql, 03_ot_data.sql
ALTER SESSION SET CONTAINER = ORCLPDB1;
CONNECT OT/oracle@ORCLPDB1

これで準備は完了です。
ot_drop.sqlについては、oradataにでも入れておけばいいかもしれません。
テーブルを吹き飛ばしたくなれば使ってください。

treeコマンドの実行結果はこのようになっています。

├── docker-compose.yaml
├── oradata
│   └── ot_drop.sql
└── startup
    ├── 01_ot_create_user.sql
    ├── 02_ot_schema.sql
    └── 03_ot_data.sql

dbの作成

docker-composeで起動することで、DBの構築がスタートします。

docker-compose up -d
docker logs -f oracle

して結果を見守ります。
さきほどより時間がかかりますので、ここも暇なときにやりましょう。

docker statsすると結構なresourcesを食われているのがわかります。

DATABASE IS READY TO USE!がでたらDBの構築は終了です。

ここから01-03のSQLファイルが実行されていきます。
最終的にこのようになれば終了です。

もうlogを見る必要はないのでCtrl+Cなどで抜けてください。

便利! すきーますぱい

schemaspyはDBのテーブル情報、リレーションの情報、PL/SQLのコードなどを可視化したドキュメントを自動作成してくれる便利ツールです。
簡単に利用できる割に多くの情報を提供してくれます。

実行ファイルの用意

schemaspyの実行はとても容易です。
まずはreleaseされているjarファイルを拾ってきましょう。

https://github.com/schemaspy/schemaspy/releases

今回は6.1.0をダウンロードしました。

適当なディレクトリを作成し、ダウンロードしたjarファイルを入れてください。

設定ファイルの用意

schemaspyは、実行ファイルと同階層にある設定ファイル(schemaspy.properties)をロードしてくれます。
こちらにDBの接続方法を記載しましょう。

schemaspy.properties
schemaspy.t=orathin-service
schemaspy.dp=drivers

schemaspy.host=127.0.0.1
schemaspy.port=1521
schemaspy.db=ORCLPDB1
schemaspy.u=ot
schemaspy.p=oracle
schemaspy.o=schemaspy
schemaspy.cat=%

ドライバの用意

設定ファイルに記述したschemaspy.dpは、DBへの接続に使用するドライバを格納したディレクトリを指します。
下記から使用するDBに適合したJDBCドライバをダウンロードしてください

https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html

私が選んだDBは19.3なので、下記から選びました。

https://www.oracle.com/database/technologies/appdev/jdbc-ucp-19c-downloads.html

私の使用しているjavaは下記の通りで、

angelica@chalkboard ~/W/j/d/spy> java --version
openjdk 11.0.6 2020-01-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.6+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.6+10, mixed mode)

java 11でしたので、微妙に適合しませんがojdbc10.jarをダウンロードします。

ダウンロードしたドライバは、driversディレクトリを作成し、その中に保存してください。

ER図の自動生成

ここまでの作業で、ディレクトリ構造はこの様になっています。

angelica@chalkboard ~/W/j/d/spy> tree
.
├── drivers
│   └── ojdbc10.jar
├── schemaspy-6.1.0.jar
└── schemaspy.properties

1 directory, 3 files

では、schemaspyを実行してみましょう。

java -jar schemaspy-6.1.0.jar -vizjs

オプションは色々あるのですが、便利どころとして -nopages オプションを利用すると、カラム表示の時のページングが無効化されて見通しが良くなります。(デフォルトは10カラム表示でページングありになっている)

うまく実行できれば、INFOログがだらだら流れていきます。

動作が終わると、schemaspyというディレクトリが出現します。
これがDBのHTMLドキュメントになっています。

angelica@chalkboard ~/W/j/d/spy> ls
drivers              schemaspy            schemaspy-6.1.0.jar  schemaspy.properties

中身を見てみましょう。

見学

open schemaspy/index.html

とするとデフォルトのブラウザでHTMLドキュメントを開きます。
サンプルはこちらに公開しますので、触って確認してみてください。

https://angelica-keiskei.github.io/oracle-docker-sample/spy/schemaspy/index.html

リレーションの表示画面では、デフォルトで表示するカラムが大事そうなもの(By default only columns that are primary keys, foreign keys or indexes are shown.)に絞られます。
すべて表示したければここのタブでスイッチできます。

あとがき

docker動かしっぱなしだとそれなりにresourcesを食べているので、

docker-compose stop

とか、必要なければ削除とかはしましょう。oradataの中身とか。