MacにOracle Database 23ai Freeをインストールする

Oracle Databaseは以前よりMacへ直接インストールすることはできませんでした。
23ai Freeでも同様ですが、~~調べてみるとサクッと構築できそうなのでやってみました。~~
思いの外苦労したので、試行錯誤してダメだったやり方、成功したやり方を書き残します。

# 注意事項
Oracle Database 23ai Freeをインストールする際は下記の利用規約（英語）を遵守しましょう。
https://www.oracle.com/downloads/licenses/oracle-free-license.html

# 環境
<table>
<tr><th>OS</th><td>MacOS（Seqoia 15.0.1）</td></tr>
<tr><th>プロセッサ</th><td>Apple M3</td></tr>
</table>

# ＜ダメだったやり方＞VirtualBox[^1]での起動・実行
Oracleの公式サイトにVirtualBoxのovaイメージがあったので、これを使えば速攻でDBを使えるようになると思いましたが、M3搭載マシンでは動作しませんでした。

## 手順
以下は試した手順です。興味のある方だけ開いてご覧ください。

<details><summary>試した手順</summary>

以下のサイトから、「macOS / Apple Silicon hosts」用のVirtualBoxをダウンロード、インストール。
https://www.virtualbox.org/wiki/Downloads

以下のURLから「Oracle DB Developer VM」をダウンロード。
https://www.oracle.com/database/technologies/databaseappdev-vm.html

ovaファイルのダウンロードを完了したら、そのファイルが壊れていないか確認するためターミナルで以下コマンドを実行。
```shell:zsh
# コマンド
$ md5 Oracle_Database_23ai_Free_Developer.ova
# コマンド実行結果
MD5 (Oracle_Database_23ai_Free_Developer.ova) = fccf66f61e6dba7f3e78de88a33cac18
```
ハッシュ値が上記サイトに記載されている内容と一致していることを確認し、次のステップへ。

VirtualBoxのGUIで作業します。まずは下図赤枠インポートをクリック。
![SS001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/d9595a73-fa05-c200-5437-08d5c640f40e.png)

ソース＞ファイルに、ダウンロードしたovaファイルを設定し、下図赤枠「完了」ボタンをクリック。
![SS002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/74f5971a-3625-ac65-2421-a0f1b9a81f1b.png)

使用許諾契約が表示されるので一通り流し読みして下図赤枠「同意する」ボタンをクリック。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/a2a97bf0-9eaf-39f1-5ee3-6989c71c3fd8.png">

Oracle VirtualBox マネージャー画面に仮想環境が追加されます。
![SS004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/78740771-0fa2-6eaa-f208-29a68cd03a6d.png)

仮想環境を起動すると下図エラー。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/a7555ed7-d0f6-0258-8f79-a0b3e769f2d4.png">

アーキテクチャがサポートされていないと怒られています。
ゲストOSにはBSDなども選択できるので一通り試してみましたが、Oracle Linux以外に変更してもダメでした。
どうもVirtualBoxのイメージはAMDのプロセッサでないと使用できなさそうです。

</details>

# ＜成功したやり方＞Colima[^2]＆Docker[^3]での起動・実行
Oracle公式のDockerコンテナイメージは以下のリンク先で公開されていました。
[Database Repositories Oracle Database Free](https://container-registry.oracle.com/ords/f?p=113:4:14150285267378:::4:P4_REPOSITORY,AI_REPOSITORY,AI_REPOSITORY_NAME,P4_REPOSITORY_NAME,P4_EULA_ID,P4_BUSINESS_AREA_ID:1863,1863,Oracle%20Database%20Free,Oracle%20Database%20Free,1,0&cs=361pfQF_CUkMuUhHb3W3DapPQ1TsChbgCcggIBJw5uNqerF1LcmczLa46MLfMkakjoEZD6C7PmIt-W7vDZcanGw)

個人的にDocker Desktopは使用したくなかったので、以下Colimaを使用した手順となります。

## 手順

DockerCLIとColimaをインストール。
```shell:zsh
$ brew install docker
$ brew install colima
```

以下コマンドでColimaを起動します。
```shell:zsh
# Colima起動
$ colima start --arch x86_64 --memory 4
# 下記のように"running"と表示されればOK
$ colima status
INFO[0000] colima is running using QEMU                 
INFO[0000] arch: x86_64                                 
INFO[0000] runtime: docker                              
INFO[0000] mountType: sshfs                             
INFO[0000] socket: unix:///Users/yodataketo/.colima/default/docker.sock

# dockerのコンテキストがColimaに変更されていることを確認
$ docker context show
colima
```

Oracle Database 23ai Freeコンテナを作成・起動します。
```shell:zsh
# 初回起動時は大量のファイルをダウンロードするので時間がかかる
$ docker run -d --name 23ai -p 1522:1521 -v 23ai-data:/opt/oracle/oradata container-registry.oracle.com/database/free
# 一通りダウンロードが終わったら、コンテナが起動しているか確認
$ docker ps
CONTAINER ID   IMAGE                                         COMMAND                   CREATED         STATUS                   PORTS                                         NAMES
a3dcf5f263a4   container-registry.oracle.com/database/free   "/bin/bash -c $ORACL…"   2 minutes ago   Up 2 minutes (healthy)   0.0.0.0:1522->1521/tcp, [::]:1522->1521/tcp   23ai
```

Oracle Databaseにあらかじめ用意されている各ユーザのパスワードを更新するスクリプトを実行します。
```shell:zsh
$ docker exec -it 23ai ./setPassword.sh oracle
# 処理に成功すると以下のSQL*Plus実行履歴が表示される
The Oracle base remains unchanged with value /opt/oracle

SQL*Plus: Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems on Sun Oct 13 11:23:13 2024
Version 23.5.0.24.07

Copyright (c) 1982, 2024, Oracle.  All rights reserved.


Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.5.0.24.07

SQL> 
User altered.

SQL> 
User altered.

SQL> 
Session altered.

SQL> 
User altered.

SQL> Disconnected from Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.5.0.24.07
```

## オプション手順
本項の手順はオプションです。ボリュームをコンテナの管理外へ配置したい場合に実行してください。

<details open><summary>ボリューム移行手順</summary>

以下コマンドでDockerイメージのコンテンツをローカルディレクトリへコピーします。
```shell:zsh
$ docker stop 23ai
# 後で仮想環境にマウントするディレクトリの作成。名称はお好みで適宜変更してください。
$ mkdir -p $HOME/docker/23ai-data

# ボリュームのエクスポートを実行。
$ docker run --rm -v 23ai-data:/source -v $HOME/docker:/target ubuntu tar czvf /target/23ai-data.tar.gz /source
$ sudo tar xvpfz $HOME/docker/23ai-data.tar.gz --strip-components=1 -C $HOME/docker/23ai-data
```

エクスポートしたファイルのパーミッションを変更します。
```shell:zsh
$ sudo chmod -R 777 $HOME/docker/23ai-data
```

コンテナとボリュームの削除を実行。
```shell:zsh
$ docker rm 23ai
$ docker volume prune -f
```

コンテナを再作成します。
この時、ボリュームのパラメータがローカルのディレクトリを参照するようにします。
```shell:zsh
$ docker run -d --name 23ai -p 1522:1521 -v $HOME/docker/23ai-data:/opt/oracle/oradata container-registry.oracle.com/database/free
```

SQL DeveloperやSQLclでDB接続を試みます。下図はSQL Developerで接続情報を入力、「テスト」ボタンをクリックして、接続に成功した図です。
DB接続用の識別子は下図の通り。パスワードは「oracle」が設定されています。
![SS006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/b13e8671-b81e-3be1-a49c-f94988f4340a.png)

</details>

## 仮想環境の停止と再起動
以降、環境の停止と再起動は以下のコマンドで実行します。
```shell:zsh
# 停止コマンド
$ docker stop 23ai
$ colima stop
# 起動コマンド
$ colima start --arch x86_64 --memory 4
$ docker start 23ai
```

# Oracle DB 23ai のユーザ作成と権限設定
## ユーザ作成
SYSTEMユーザでPDBに接続し、お好みのユーザと権限を設定します。
本例ではSAMPLEユーザを作成します。
```SQL:SQL
-- ユーザ作成
CREATE USER SAMPLE IDENTIFIED BY "sample";
-- 権限設定
GRANT CONNECT TO SAMPLE;
GRANT CREATE TABLE TO SAMPLE;
GRANT SELECT ANY TABLE TO SAMPLE;
-- 表領域割り当て
ALTER USER SAMPLE QUOTA 500M ON USERS;
```

## 作成したユーザでのログイン、DDL実行検証
SAMPLEユーザでログインし、以下のSQLを実行して動作検証します。
```SQL:SQL
-- テーブル作成
CREATE TABLE SAMPLE_TABLE (
    COL1 VARCHAR2(30 CHAR)
);
--
-- データ投入
INSERT INTO SAMPLE_TABLE VALUES ('TEST');
--
-- 検索
SELECT * FROM SAMPLE_TABLE;
--
-- 削除
DELETE FROM SAMPLE_TABLE;
COMMIT;
--
-- DBオブジェクト削除
DROP TABLE SAMPLE_TABLE;
```
```text:コンソール出力結果
Table SAMPLE_TABLEは作成されました。


1行挿入しました。


COL1                          
------------------------------
TEST


1行削除されました。


コミットが完了しました。


Table SAMPLE_TABLEが削除されました。
```
これでMacでもOracle Database 23ai Freeを使えるようになりました。

# 参考
[Qiita : OTN の VirtualBoxイメージ で Oracle DB 18c環境 を 楽々構築](https://qiita.com/ora_gonsuke777/items/87f9b0078febddea2178)
[Oracle Database 23c on a Mac with an M-Series Chip](https://www.salvis.com/blog/2023/04/16/oracle-database-23c-on-a-mac-with-an-m-series-chip/)
[^1]:Oracle社の仮想化ソフトウェア。既存のOS上（ホストOS）で、追加のOS（ゲストOS）を実行することができる。
https://www.virtualbox.org/
[^2]:MacおよびLinuxで動作するコンテナランタイム。
https://github.com/abiosoft/colima
[^3]:コンテナ型の仮想化ソフトウェア。VirtualBoxと大きく異なる点として、ゲストOSを必要としない。
https://www.docker.com/ja-jp/