DockerでOracle動かしたついでに、公式サンプルデータを突っ込んでから、ER図を自動生成してみようぜ
概要
主に、Oracleの勉強したいとか、Java等でOracleつないであれこれするサンドボックスがほしいとか、そういう人向けの記事になります。
SchemaSpy自体はMySQLだろうが、ぽすぐれさんだろうが使えますので、Javaじゃないと役に立たないってツールではございません。
- Docker/Java(8~)はインスコされているものとします
- Oracleにユーザ登録して、DBをダウンロードします
- Oracle提供のDockerビルドツールでOracle用イメージを召喚します
- あれこれ設定します
- SchemaSpyでER図を生成します
最終的に表示されるドキュメントはgithub pagesとして公開しています。
入手! 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形式で良いです。
召喚! 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にあるとおり、oradata
はoracle(uid: 54321)
ユーザの書き込みを許可する必要があります。
そのため今回は簡単化のために777
を利用することにしました.
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の冒頭にはこちらを加えてください。
ALTER SESSION SET CONTAINER = ORCLPDB1;
oracleは12c以降、CDB(コンテナ・DB)
とPDB(プラガブル・DB)
という概念を持っています。
詳しくは触れませんが、我々が操作したいのはPDBなので、この一文でセッションをCDBからPDBへ切り替えています。
01_ot_create_user.sqlのユーザ作成DDLに関して、パスワードがoracle
になるよう、次のように書き換えてください
-- 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の作成等が行えるようになります。
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ファイルを拾ってきましょう。
今回は6.1.0をダウンロードしました。
適当なディレクトリを作成し、ダウンロードしたjarファイルを入れてください。
設定ファイルの用意
schemaspyは、実行ファイルと同階層にある設定ファイル(schemaspy.properties)をロードしてくれます。
こちらにDBの接続方法を記載しましょう。
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ドライバをダウンロードしてください
私が選んだDBは19.3なので、下記から選びました。
私の使用している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ドキュメントを開きます。
サンプルはこちらに公開しますので、触って確認してみてください。
リレーションの表示画面では、デフォルトで表示するカラムが大事そうなもの(By default only columns that are primary keys, foreign keys or indexes are shown.)に絞られます。
すべて表示したければここのタブでスイッチできます。
あとがき
docker動かしっぱなしだとそれなりにresourcesを食べているので、
docker-compose stop
とか、必要なければ削除とかはしましょう。oradataの中身とか。
Discussion