Oracle Database
podman composeで free版 または express版などを試してみる 23ai free は 21c express の後継
imageサイズ9GB程度
適当に compose.yaml を用意する
code:compose.yaml
services:
oracledb:
image: container-registry.oracle.com/database/free:latest
environment:
ORACLE_PWD: password
volumes:
- ./oradata:/opt/oracle/oradata
ports:
- "1521:1521"
image の free を express にすると express版だがfreeの方が新しい
ORACLE_PWD で管理用パスワードを指定する
外部からの接続用にportsを指定する
外部に晒さないようにするにはサーバアドレスも付ける 127.0.0.1:1521:1521
lite版もあるのかも
lite版はfree:latest を free:23.4.0.0-lite に変更
environment ORACLE_PDBでPDB名を指定可能
ORACLE_SIDも指定できるかもしれない
データ領域
lite版 ? volumes を省略してもよい。事前にimage内部に作成されているものを使うと速いのかも
作成する場合にはファイルとVOLUMESとを選ぶ
ファイルの場合 上のcompose.yaml を使う
oradata を 54321:54321 のUID で作成する。WindowsではUID設定不要
code:shell
mkdir oradata
chown 54321:54321 oradata
volume管理でいい場合は
code:compose.yaml
services:
oracledb:
image: container-registry.oracle.com/database/free:latest
environment:
ORACLE_PWD: password
volumes:
- oradata:/opt/oracle/oradata
ports:
- "1521:1521"
volumes:
oradata:
volumes を services と同列に作成してvolume名を追加、oracledbのvolumes のフォルダ名 (./開始)をvolume名 (./なし)に変える
起動
code:sh
podman compose up -d
初期化に5分くらい待ち
詳細は知らないが
接続にはService Name (サービス名)という名を使う。ほかにSIDがあるが、8.0以前くらいのもの?
コンテナデータベース(CDB)という親DBとぷらがぶるDB(PDB)という仮想DBがある
FREE/FREEPDB1 や XE/XEPDB1という階層になっているようだ。
仮想DB側を使う
管理用アカウントは sys, system, pdbadmin などがあるのかも
table:階層
CDB PDB
Host localhost localhost
Port 1521 1521
Database (free版) FREE FREEPDB1
Database (free lite版) FREE FREEPDB1など
Database (express版) XE XEPDB1
管理ユーザー名/Role
sys/SYSDBA ○ ○
sys/SYSOPA ○ ○
system ○ ○
pdbadmin - ○
パスワード ORACLE_PWD ORACLE_PWD
管理ユーザは3種類あるが使い分けはまだ知らない
パスワードはcompose.yaml で指定したもので共通
管理環境
DB管理は DBeaver というのを使ってみているのでそこからつつく NetBeansやIntelliJ IDEAなどの開発ツールからJDBCで繋いでも sqlがつつければ同じ sqlplus というコマンドラインツールもある
sys, system, pdbadmin それぞれで接続できるまで待ち
table:JDBC
Class oracle.jdbc.driver.OracleDriver
JDBC URL jdbc:oracle:thin:@host:port:SID jdbc:oracle:thin://host:port/ServiceName
Port 1521
DataSource oracle.jdbc.pool.OracleDataSource
oracle.jdbc.xa.client.OracleXADataSource
PoolなしのDataSource はないのかも
code:Maven JDBC 4.2 JDK 8
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>[23.0,)</version>
<type>jar</type>
</dependency>
code:Maven JDBC 4.3 JDK 11以降
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<version>[23.0,)</version>
<type>jar</type>
</dependency>
jdbc6, jdbc8, jdbc10 (19cのみ), jdbc11 などがあるようだ
JDBCのURLはSIDとService Nameの場合で別
code:url
SID
Service Name
username, password は別で指定することもできるので省略可
sysdbaなどRoleはinternal_logon プロパティで指定する?
sqlplus
podman から sqlplus を使う場合は podman ps で名前(NAMES)を確認
oracle_oracledb_1 などになっているので<oracledb> のところを変える
code:sh
podman exec -it <oracledb> sqlplus sys/<ぱすわーど>@FREE as sysdba
podman exec -it <oracledb> sqlplus system/<ぱすわーど>@FREE
podman exec -it <oracledb> sqlplus pdbadmin/<ぱすわーど>@FREEPDB1
などでユーザ、パスワード、サービス名、ロールを指定できる
ユーザ作成
同名のスキーマも作成される
sys as SYSDBA で PDB1 側に接続、sqlplusでもDBeaver でも何でもよい
code:sh
podman exec -it <oracledb> sqlplus sys/<ぱすわーど>@FREEPDB1 as sysdba
ユーザとパスワード
code:sql
CREATE USER ゆーざめい IDENTIFIED BY ぱすわーど;
username でも "username でもよさそう
権限付与
code:sql
GRANT CONNECT , RESOURCE TO ゆーざめい;
usernameと同名のスキーマも作成されているので基本的にそのスキーマを利用する形
GRANT CREATE TABLE TO アカウント;
は必要?
スクリプト実行
startup と setup の2種類のスクリプト(拡張子 .shと.sql)を実行可能
SQL は sys as SYSDBA で実行される
SH は カレントユーザで実行される
volumes に
- ./startup:/opt/oracle/scripts/startup
- ./setup:/opt/oracle/scripts/setup
とそれぞれのフォルダを作る
01_ 02_ など番号をつけてファイル名順に実行することができる
volumeを指定しなかった場合は設定済みDBを使うのでsetupは実行されない
setup に ユーザ作成のsqlなどを仕込んでおくといいのか?
Pod にしてみる
Compose ではなく Kubernetes のPod にしてみる port は pod 側で指定するが、コンテナからでも作れなくはないのでコンテナだけ作ってもいい
$ podman pod create -p 1521:1521 oracle
$ podman create --name oracle23ai --pod oracle -e ORACLE_PWD=password -v oradata:/opt/oracle/oradata container-registry.oracle.com/database/free:latest
開始
$ podman pod start oracle
停止
$ podman pod stop oracle
設定の保存
$ podman generate kube oracle-pod -f oracle.yaml
設定の読み込み実行
$ podman play kube oracle.yaml
コンテナから作る
$ podman create --name oracle23ai -p 1521:1521 -e ORACLE_PWD=password -v oradata:/opt/oracle/oradata container-registry.oracle.com/database/free:latest
$ podman generate kube oracle23ai -f oracle.yaml
削除
$ podman pod rm oracle
systemd 化
podを削除して oracle.yaml がある状態
code:oracle.kube
Description=Oracle Database 23ai
Before=local-fs.target
Yaml=/path/to/oracle.yaml
PublishPort=1521:1521
Restart=always
WantedBy=multi-user.target default.target
.kube は Description Yaml PublishPort だけ変えて使い回し
user の場合
$ mkdir -p ~/.config/containers/systemd
$ cp oracle.kube ~/.config/containers/systemd
$ /usr/lib/systemd/system-generators/podman-system-generator -user -dryrun
$ systemctl --user daemon-reload
$ systemctl --user enable --now oracle
開始
$ systemctl --user start oracle
停止
$ systemctl --user stop oracle
rootの場合
$ cp oracle.kube /etc/containers/systemd
$ /usr/lib/systemd/system-generators/podman-system-generator -dryrun
$ systemctl daemon-reload
$ systemctl enable --now oracle
開始
$ systemctl start oracle
停止
$ systemctl stop oracle