初級エンジニアが手探りでOracleの開発環境を作ってみた話

初投稿です。自分の学習の備忘録として残します。
業務で3年ほどOracleを使用しているにも関わらず、自由にいじれる環境が今まで手元になかったため、急に思い立って作ってみました。

メインPCとは物理的に分かれた環境を作り、テスト等で他の端末からアクセスできるようにするのが主な目的です。

# ハードウェア
・CHUWI LarkBox X 2023
N100搭載のミニPC。PD給電対応のものは少ないらしく、レビューの多いこれに決定。

https://www.chuwi.com/jp/product/items/chuwi-larkbox-x-2023.html

※今回は元々入っていたSSD(Shenzhen longsys Electronics Co.,Ltd.社のAirDisk AFF10-512Gというモデルらしい)をフォーマットして、Linuxを入れました。
Windows環境を残しておきたい場合は別途M.2 SATA SSDの準備が必要。

・Intehill U16NA
PD給電対応のモバイルモニター。
後々他の用途にも転用することも考えて4Kを選択。

https://www.amazon.co.jp/dp/B0BYRWQSPY?psc=1&ref=ppx_pop_dt_b_product_details

できるだけ配線を減らすために、電源→ミニPC→モバイルモニター(PD給電)という接続で使用します。

# インストールメディアの作成
今回はOSにOracle Linux 9.4を使用します。
まず、ISOイメージをダウンロード。

https://yum.oracle.com/oracle-linux-isos.html

Release欄の9.4からFull ISOを選んで、ダウンロードをクリック。
OracleLinux-R9-U4-x86_64-dvd.isoがローカルに存在することを確認します。

次に適当なUSBメモリを用意します。
USBメモリにISOを焼くために、「Rufus」というツールを使用。

https://rufus.ie/ja/

標準タイプを選び、ダウンロード。

USBメモリを今使っているPCに差し込み、Rufasを起動すると以下のような画面になるので、
・「デバイス」に差し込んだUSBメモリが認識されているか確認
・「ブートの種類」にダウンロードしたISOを選択

![Rufas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111972/e3ee208e-8378-925e-c656-2e9893603286.png)

問題なければ「スタート」をクリック。
![Rufas2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111972/ea0183eb-a2f4-20ef-7a08-817fa68ae064.png)

このままOKで続行すると、書き込みが完了します。
これでインストールメディアの作成は終了。

# Oracle Linuxのインストール手順
スクリーンショットが撮れないため、画像及び手順は割愛。

・黒背景の画面でInstall Oracle Linux 9.4を選択
・言語は日本語を選択
・インストール設定画面の必須項目を入力する(インストール先、rootパスワード、ユーザー作成、IPアドレス)

インストールメディアを抜いて再起動、ログインが確認できたら最低限の初期設定だけ済ませます。
```
$ sudo yum update
$ sudo yum upgrade
```

日本語入力の設定も行っておく。
デフォルトで日本語パックはインストールされていたため、表示の切り替えはできていたが、かな入力ができませんでした。
苦戦したが、keyboardの入力ソースの日本語 → 日本語(Anthy)にして再起動することで、無事かな漢字を入力できるようになりました。

また、ディレクトリ名が日本語表示のままだとCUI環境で不便なので、英語表記に変更します。
```
$ LANG=C xdg-user-dirs-gtk-update
```
実行後、標準フォルダの言語を変更するか確認するダイアログが出るので、Update Namesを選択すれば英語に切り替わります。
永続的に英語で固定したいので、Don’t ask me this againにチェックを入れてから実行します。

<!--# Ubuntu Desktopの導入
Oracleインストール時にブラウザーを使いたかったので、GUI環境を作成する。
```
$ sudo apt install ubuntu-desktop

途中でインストールの同意を求められるので、Yを押して続行する
インストールが完了したら再起動する

$ sudo reboot
```

念のため日本語環境も整えておく。
```
関連パッケージのインストール
$ sudo apt install language-pack-ja-base language-pack-ja ibus-mozc

文字セットを日本語に変更する
$ sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
```

Settings画面で System ＞ Region & Languege と進み、画面右側で Manage Installed Languages をクリックする。
The Language support is not installed completely と表示されるので、Installをクリックする。
パッケージのインストールが完了したらUbuntuの再起動を行い、言語・フォーマット・キーボードに日本語が反映されていることを確認する。-->

# Oracleのインストール手順
2024/5/2に新たに Oracle Database 23ai Free がリリースされたということで、今回はこれをインストールします。

以下の3サイトを参照しながら、インストールを進めました。

https://oracle-japan.github.io/ocitutorials/ai-vector-search/ai-vector102-23aifree-install/


https://qiita.com/nisshii0/items/e300edbbb7845a40cc11

https://aulta.co.jp/technical/server-build/oracle-database-23ai-free-oracle-linux-8/install-oracle-database-23ai-free

まず下記リンクにアクセスし、

https://www.oracle.com/database/free/get-started/

![DownloadLink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111972/1248dd94-95a9-0672-d32c-a4a3d8150679.png)

oracle-database-free-23ai-1.0-1.el9.x86_64.rpmをダウンロードします。

Downloadディレクトリに移動して、以下を実行します。
```
$ ls -la oracle*

$ dnf install -y oracle-database-free-23ai-1.0-1.el8.x86_64.rpm

--データベースの作成（実行中にパスワードを設定）
$ /etc/init.d/oracle-free-23ai configure
```

接続設定を環境変数に保存するため、/home/oracle/.bash_profileに書き込もうとしましたが、そもそもディレクトリが存在せず自分で作成する必要があるようでした。

念のため、
```
$ ls -la /home/oracle
```
で存在チェックして、ディレクトリを作成します。**(rootユーザーで実行)**
```
$ mkdir -p /home/oracle
$ chown oracle:oinstall /home/oracle
$ chmod 755 /home/oracle
```
作成できたら.bash_profileに以下を書き込みます。
```
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle/product/23ai/dbhomeFree
export ORACLE_SID=FREE
export NLS_LANG=Japanese_Japan.AL32UTF8
export PATH=$ORACLE_HOME/bin:$PATH
```
最後に、ユーザーをoracleに切り替えて、接続確認用のコマンドを実行します。
```
sqlplus / as sysdba
show parameter instance_name
show pdbs
alter session set container=FREEPDB1;
select username from dba_users order by 1;
exit
```

Select文の実行が確認できたら作業完了。

:::note warn
ログイン時点で「アイドル・インスタンスに接続しました。」なる表示が出たが、startupコマンドを実行してインスタンスを起動すると、その後の手順に進むことができました。
:::


# SSH接続
まずIPアドレスが固定されていることを確認します。(初期設定時に入力したものと変わっていないか)
```
$ nmcli connection show enp0s8 | grep ipv4.method
--manualが表示されればOK
ipv4.method:                            manual
```
固定されていない場合はネットワーク設定画面でIPv4メソッドを手動に変更するか、nmcliコマンドを実行します。

ファイアウォールがポート1521をブロックしないように設定します。
```
$ sudo firewall-cmd --permanent --add-port=1521/tcp
$ sudo firewall-cmd --reload
```

OpenSSH Serverがインストールされていない場合はインストールします。(初めからインストール済みのため割愛)

メインマシン(Windows11)でWindows Terminalを起動し、
```
ssh サーバーのユーザ名@192.168.xxx.xxx
```
でログインできることを確認します。
SQL*Plusが使えるところまで確認できたら作業完了。

# SQL Developerから接続
前準備として、一般ユーザーを作成します。
Oracle12c以降、CDBとPDBという概念ができたらしく、ユーザーを作成するためにはPDBに接続する必要があるとのこと。
SYSユーザーでログインして、現在接続しているDBを確認すると、
```
SQL> show con_name

CON_NAME
-----------------------
CDB$ROOT
```
CDBになっているため、PDBへの切り替えを行います。

:::note warn
SQL*Plusでのログイン時、リスナーがないと叱られたので「lsnrctl start」を実行して再度試すとうまくいきました。
:::
```
SQL> select name,open_mode from v$pdbs;

NAME             OPEN_MODE
-----------------------------------
PDB$SEED         READ ONLY
FREEPDB1         READ WRITE
```
対象のPDBは「FREEPDB1」という名前なので、
```
SQL> alter session set container=FREEPDB1;

セッションが変更されました。
```
として接続先を変更します。

この状態でユーザーの作成を行いますが、このままだと接続できないため、先にtnsnames.oraを編集します。
```
FREEPDB1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.200)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = freepdb1)
    )
  )
```
:::note
tnsnames.oraのSERVICE_NAMEが不明な時は、「lsnrctl status」を実行すると、
インスタンス"freepdb1"、状態READYには、このサービスに対する2件のハンドラがあります...
サービス"freepdb1"には、1件のインスタンスがあります。
というような表示が出て、サービスがSERVICE_NAMEに相当することがわかります。
:::

上記を追加してCREATE USER文を実行すると、
```
SQL> CREATE USER test IDENTIFIED BY test1234;

ユーザーが作成されました。
```
正常に処理されました。

最低限必要な権限を付与します。
```
SQL> grant create session to test;

権限付与が成功しました。

SQL> grant resource to test;

権限付与が成功しました。

SQL> grant unlimited tablespace to test;

権限付与が成功しました。
```

:::note warn
権限付与の際、resourceロールを使用するのは7年ほど前に非推奨となったようです。
必要なものを個別するのが望ましいかも知れません。
:::
* * *
クライアント側にOracle Instant Clientをインストールします。

https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html

Version 23.5.0.0.0のBasic Package、ToolsからSQL*Plus PackageとTool Packageを入れておきます。

適当な場所にフォルダを作成して、ダウンロードしたファイルを展開します。
今回はC:\Oracle\InstantClientとしました。
ここにもtnsnames.oraを作成します。(SQL Developerの接続に使用)

環境変数を設定します。(今回はユーザー環境変数に追加)
・Pathを編集し、C:\Oracle\InstantClientを追加
・TNS_ADMIN変数を新規作成し、値をC:\Oracle\InstantClientに設定
・NLS_LANG変数を新規作成し、値をJAPANESE_JAPAN.AL32UTF8に設定

SQL Developerをダウンロードします。(exe形式なのでインストールはしない)

https://www.oracle.com/jp/database/sqldeveloper/technologies/download/

アプリを起動して、左上の+ボタンから新規接続の設定を行います。
 ![SQL Developer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111972/ce0d725c-07db-9b0c-de28-7c660b8abc11.png)

以下のように必要な情報を入力して、テストを実行すると、無事成功しました。
![SQL Developer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111972/1b16b499-dd0d-407a-79e6-6e4b70f09e86.png)

最後に簡単な動作確認として、テーブルの作成・データのINSERTをやってみます。
```
CREATE TABLE pokemon(NO NUMBER NOT NULL, NAME VARCHAR2(20) NOT NULL, TYPE1 VARCHAR2(20) NOT NULL, TYPE2 VARCHAR2(20));
```

![SQL Developer3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111972/4d95b67e-e695-9608-e6cf-a24f3c99deaa.png)

:::note warn
NOがprimary keyになっていないのはご愛嬌ということで…
:::

```
INSERT INTO pokemon(NO, NAME, TYPE1, TYPE2) VALUES(1, 'フシギダネ', '草', '毒');
INSERT INTO pokemon(NO, NAME, TYPE1, TYPE2) VALUES(2, 'フシギソウ', '草', '毒');
INSERT INTO pokemon(NO, NAME, TYPE1, TYPE2) VALUES(3, 'フシギバナ', '草', '毒');
INSERT INTO pokemon(NO, NAME, TYPE1, TYPE2) VALUES(4, 'ヒトカゲ', '炎', '');
INSERT INTO pokemon(NO, NAME, TYPE1, TYPE2) VALUES(5, 'リザード', '炎', '');
INSERT INTO pokemon(NO, NAME, TYPE1, TYPE2) VALUES(6, 'リザードン', '炎', '');
INSERT INTO pokemon(NO, NAME, TYPE1, TYPE2) VALUES(7, 'ゼニガメ', '水', '');
INSERT INTO pokemon(NO, NAME, TYPE1, TYPE2) VALUES(8, 'カメール', '水', '');
INSERT INTO pokemon(NO, NAME, TYPE1, TYPE2) VALUES(9, 'カメックス', '水', '');
commit;
```

![SQL Developer4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111972/840b9c24-e97e-c2f1-dec5-7cceffab4f4e.png)

いずれも成功しました。
![SQL Developer5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111972/643a1e15-fea3-6675-0e32-e7d6c9a62b6d.png)

これで学習目的で色々弄り倒せるようになったかと思います。
(あとは遠隔でサーバーの電源ONOFFをできるようにしたいかな)