【Oracleデータベース】Windowsでインストールからテーブル作成まで

# 前書き

本記事は、DBど素人が個人学習でOracleデータベースの
- ソフトウェアインストール
- データベース作成
- データベース接続
- ユーザー作成
- テーブル作成・CRUD操作

までを幾多のドブに落ちながら行ったメモ書きすなわちダイイングメッセージである。

# 環境・前提

- すべて無料で使えるものを使用する。
- 仮想環境は作らず、ローカルで行う。
- OS: Windows 11 Home（完全なる一般的私物ノートPC）

# 1. インストールファイルをダウンロードする

ここからインストールファイルをダウンロードした。

https://www.oracle.com/jp/database/technologies/oracle-database-software-downloads.html#db_ee

**Oracle Database 21c for Microsoft Windows x64 （64-bit）** をダウンロードした。
ダウンロードは30分程度かかった。

:::note warn
*メモ*
はじめはOracle Database **19c** for Microsoft Windows x64 （64-bit）をダウンロードした。インストールはできたが、データベースの作成に失敗し、試行錯誤の末に断念した。
失敗理由はいまだ不明だが、代わりに詳細を記す：
インストーラ起動時、このOSには対応していない旨の表示があり、怪しいと思いながらもインストール自体はできた。データベース作成時「[DBT-50000] 使用可能なメモリーを確認できません。」というエラーから先に進めなくなった。ネット調べによると権限不足のよう。ネット記事を参考にコマンドでメモリー確認ステップをスキップしようとするも、そのコマンドが使えなかった。また管理者権限でDBCAを実行しても結果は同じだった。
:::

# 2. ORACLE_HOMEを作成する
インストールしたzipファイル"WINDOWS.X64_213000_db_home.zip"を解凍するが、このタイミングで、この中身を「まともなパス」に配置する必要がある。

解凍には約15分かかった。

解凍したインストールファイルの配置場所は、**ORACLE_HOME**と呼ばれる、今後かなり重要なディレクトリになり、後からの移動やフォルダ名変更が難しくなる。そのため、インストールする前に「まともなパス」に移しておく必要がある。

私には「まともなパス」が判断できないので、手元の書籍を参考に、`C:\oracle\product\21.3.0.0.0\dbhome_1`というディレクトリを作成し、そこにインストールファイルを配置した。
"21.3.0.0.0"はダウンロードしたOracle Database 21cのバージョン。

解凍後の様子。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271094/417f4631-331e-8a14-7161-97c4aac30fce.png)

# 3. ソフトウェアをインストールする
大まかな流れは、インストーラーを起動する→諸々の設定を行う→インストールを実行する。
こう聞くと、なんだ普通にただのアプリのインストールじゃん。と思うが、最低でも後述する2つのORACLE環境変数だけは正しく設定・把握しておくべき。

とりあえずWindowsにインストールしてデータベースを作ってみたいという人は、下記サイトと同じ設定でよいと思われる。

https://shift101.hatenablog.com/entry/2021/02/12/183000

私は、これとは違う設定をした。
具体的には、構成オプションで「ソフトウェアのみの設定」を選択した。インストール作業とデータベース作成の作業を別々で行いたかったため。実務でデータベースを構築する時には諸々個別の設定を行う必要がありそうだったので、その下見をしておきたかったため。

インストール開始直前には「サマリー」で設定を再確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271094/19e62559-3025-5e1b-dc49-e3fc4f32d4c9.png)

**重要**
- 「Oracleベース」に設定したパスが、重要な環境変数 **ORACLE_BASE** となる。
- 「ソフトウェアの場所」に設定したパスが、重要な環境変数 **ORACLE_HOME** となる。

これらの環境変数を後から確認する方法はあるが(後述)、のちにこれらのパスを起点にいろいろ確認する場面が頻繁にあったので、先にメモっておけばよかったと思った。

:::note warn
**反省**
ORACLE_HOMEは、一般的にORACLE_BASEのサブディレクトリに指定するらしいのだが、私は初回インストール時にこれをよく理解しておらず、インストールファイルの配置場所がおかしかったために、インストーラーによって自動的に設定されたパスのままで作成したところ、異なるディレクトリ構成になってしまっていた。
これがどんな悪影響をもたらすのかを私は体験しなかったが、普通の構成ではないらしく、様々なエラーにぶち当たったとき、自分の探しているファイルが解説どおりの場所に存在しないことが多く、入門者である自分にとっては学習の障壁になっていると感じたので、後からディレクトリ構成を修正するに至った。
:::

### インストール途中のエラー…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271094/2f5434b5-0e25-d785-9c9e-17af2ccf7bcd.png)



何度インストールをやり直しても、インストール最中に私は必ずこのエラーが出るのだが、下記の記事と同様に「続行」を複数回押すと先に進める。本当に大丈夫なのか心配になるが、データベースの作成まで問題なくできたので、問題ないことを信じている…。

https://teratail.com/questions/328562

# 4. データベースを作成する

インストールが完了すると入っている、Database Configuration Assistant(通称DBCA)を起動する。どこにあるかなんて知らないので、Windowsメニューで検索して開く。
記事によっては管理者権限で実行するように書いてあるが、私はなぜか管理者権限で実行しなくても問題なかった。

DBCAは、データベースの作成や削除などを行えるGUIツール。(DBCAを使わずにデータベースを作成するなら、プロンプトに細かい設定を書いた長いコマンドを入力しなくてはならない。)

実務では「拡張構成」を選択し細々とカスタマイズすることが多かろうが、私は一通り確認だけして、学習用には「標準構成」を選択した。

以下のとおり設定した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271094/cd42fbae-a01b-ddd8-9564-722d6ba4e563.png)

- 「グローバル・データベース名」
手元書籍によれば、`データベース名`または`データベース名.ドメイン名`の形式で指定するとのこと。
初期は"orcl.168.3.16"と表示されていたが、私は今回はドメイン名は邪魔だと思いデータベース名"orcl"を指定した。

- 「管理者パスワード」
作成したデータベースに初めてログイン(接続)する時、自動で用意されるsysユーザー等でログインする。これらのユーザーのパスワードになる。
今回は学習用ということで、強度は度外視して"sys"を設定した。

- 「コンテナ・データベースとして作成」
19cではこのチェックは任意だが、21cでは強制的にチェックが入っていて、「プラガブル・データベース名」の指定が必須になる。(プラガブルデータベースとは何ぞやについては後述。)

データベースの作成待ち時間は5分以上10分未満だった。

# 5. データベースに接続する(共通ユーザー)

作成したばかりのデータベースに初めて接続(ログイン)してみる。

SQL\*PlusというOracle標準のCUIクライアントツールから接続する。
SQL\*Plusはインストール時に一緒に入っている。

SQL\*Plusを直接起動するか、CommandPromptやPowerShellから起動する。
私はPowerShellから起動する。

また、管理者権限でないとできないことがちらほらあるので、面倒なので最初から管理者権限で実行することをおすすめする。

データベースに接続するにはユーザー名とパスワードが必要。
パスワードは設定したけど、ユーザー名って設定した記憶がない…と思いきや、実はインストール時に"sys"や"system"などの管理用ユーザーが自動で作られているとのこと。

今回、ユーザー名:sys/パスワード:sys で接続する。

### PowerShellからSQL*Plusを起動しsysユーザーでデータベースに接続する例

```powershell:
PS C:\WINDOWS\system32> sqlplus

SQL*Plus: Release 21.0.0.0.0 - Production on 土 4月 27 19:33:04 2024
Version 21.3.0.0.0

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

ユーザー名を入力してください: sys as sysdba
パスワードを入力してください: sys(※伏字になる。データベース作成時に設定したもの)


Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
に接続されました。
SQL>
```

# 6. ローカルユーザーを作成する
自動で作られたsysユーザー等は、あくまで管理目的のユーザー。
目的に応じて適切な権限を付与したユーザーを使いわけるべきとのこと。

というわけで、さっそく一般ユーザーを新規作成してみようではないか。

### ドボン1
sysユーザーで接続し、19cの解説動画や記事のとおりにユーザーの作成を試みると…
```powershell
SQL> create user user1
  2  identified by user1;
create user user1
            *
行1でエラーが発生しました。:
ORA-65096: 共通ユーザーまたはロール名が無効です
```

エラーのきっかけは、データベース作成時に**プラガブル・データベース**とやらを作ったからだった。(21cでは強制的に作らされたが。。)

sysユーザーで接続したのは、データベースを直接持たない部分(後述のRoot)であり、ここにローカルユーザーを作成しようとしたためエラーになった。


### プラガブル・データベースとは
略称は"PDB"。

この記事、図説が神なので拝借する。
https://japan.zdnet.com/extra/oracle_db12c_201402/35044031/

"ぷらがぶる"とは、"Plug" + "-able"。
つまり、プラガブルデータベースとは、プラグのように抜き差しできるデータベース。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271094/765869af-ec9e-e79e-8d8f-c60fde721a4e.png)

### Oracleデータベースのアーキテクチャ
21cでは「CDBアーキテクチャ」とやらが採用されている。
19cでは、「従来アーキテクチャ」と「CDBアーキテクチャ」のどちらかを選択することができたが、21cでは強制的に「CDBアーキテクチャ」しか選べないようになっている。このCDBアーキテクチャにプラガブルデータベースが登場する。

https://www.reqtc.com/blog/oracle-pdb-cdb.html


### CDBアーキテクチャの最低限の理解
Rootというデータベースを直接持たない部分と、プラガブルデータベース(PDB)というデータベースを直接持つ部分から成る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271094/575bb4b2-a497-fad9-62f5-6fd29951b9ef.png)

### ユーザーの種類
- **ローカルユーザー**…PDBにだけ接続できる一般的なユーザー。
- **共通ユーザー**…Rootにも接続できる特別なユーザー。
最初から用意されているsysユーザー、systemユーザーなどはこれ。
自分で共通ユーザーを作るには、"C##"か"C##"から始まるユーザー名を指定する。

https://docs.oracle.com/cd/E57425_01/121/ADMQS/GUID-DA54EBE5-43EF-4B09-B8CC-FAABA335FBB8.htm

### CDBアーキテクチャでローカルユーザーを作成する方法

CDBアーキテクチャのデータベースでローカルユーザーを作成するには、PDBに移動してから作成する。

① sysユーザーで接続したら、まず今いる場所を確認する。
```powershell
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT ←これが今いる場所。
SQL>
```
今`Root`にいることが分かった。

② PDBに移動する。
`orclpdb`はデータベース作成時に設定した「プラガブル・データベース名」。
```powershell
SQL> alter session set container = orclpdb;

セッションが変更されました。
```

③ もう一度 今いる場所を確認する。
```powershell
SQL> show con_name

CON_NAME
------------------------------
ORCLPDB ←これが今いる場所。
```
PDBに移動できたようだ。

④ PDBでユーザー作成を試みる。
```powershell
ORCLPDB
SQL> create user user1
  2  identified by user1;

ユーザーが作成されました。
```

やっとできたわ！！(キレ)

# 7. ユーザーに権限を付与する
単純にユーザーを作成しただけでは、そのユーザーには権限を何も与えられていないので、データベースへの接続すらまだできない。

そこでいくつか権限を与えた。

```powershell
SQL> grant create session to user1; ← データベースに接続できる権限

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

SQL> grant resource to user1; ← オブジェクトを作成できる権限

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

SQL> grant unlimited tablespace to user1; ← 表領域を無制限に使用できる権限

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

**Oracle概念用語メモ**

- **オブジェクト**…テーブルやビューやインデックスなど。様々な種類のオブジェクトがある。

- **表領域(USERS表領域)**…オブジェクトのデータを格納している。1つ以上のデータファイル(物理的なファイル)から成る論理的な領域。USERS表領域以外にも様々な種類の表領域がある。

詳細は別途学習が必要。

# 8. データベースに接続する(ローカルユーザー)
やっとの思いで作成したローカルユーザーuser1でPDBに接続を試みる。

`sqlplus ユーザー名/パスワード@PDB識別子`で接続する。

### ドボン2

```powershell
PS C:\WINDOWS\system32> sqlplus user1/user1@orclpdb

SQL*Plus: Release 21.0.0.0.0 - Production on 土 4月 27 21:05:30 2024
Version 21.3.0.0.0

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

ERROR:
ORA-12154: TNS: 指定された接続識別子を解決できませんでした

```

どうして接続できないのか。
PDBへの接続方法は、別の方法を取る必要があるからだった。

### 2種類の接続方法

Oracleデータベースへの接続方法には
- ローカル接続
- リモート接続
の2種類がある。

https://atmarkit.itmedia.co.jp/ait/articles/0905/28/news109.html

### PDBに接続するには

PDBには「リモート接続」でしか接続できない。
私は今ローカル環境でOracleデータベースを試しているが、この場合でもリモート接続でないといけない。

### リモート接続する方法

`tnsnames.ora`というファイルに接続したいPDBの情報を書くとリモート接続ができる。

(`tnsnames.ora`を使わないなら、`tnsnames.ora`に書く長い情報を代わりにすべてコマンドとして入力する必要があり大変。)

ネット記事では、`tnsnames.ora` は `ORACLE_HOME\network\admin` に元々存在していると書かれているものが多かったが、私には…な・か・っ・たOTZ ので作成した。

ローカル環境でPDBにリモート接続する私の場合、tnsnames.oraは以下のとおりに書けば接続できた。

```powershell:ORACLE_HOME\network\admin\tnsnames.ora
p = # 識別子。接続時に指定する任意の文字列。横着して短くしてみた。
(DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
  (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = orclpdb) # PDBのサービス名。リスナーの情報から確認するのが正確
   )
 )
```

[参考：TNSとは](
https://learn.microsoft.com/ja-jp/sql/relational-databases/replication/non-sql/glossary-of-terms-for-oracle-publishing?view=sql-server-ver16#tns-service-name)

[参考：Oracle Net Service](
https://qiita.com/junkers_rene/items/eea93c4f43f00496f5c2)

### ドボン3

`tnsnames.ora`の`SERVICE_NAME`を埋めるために、[[こちら]](https://qiita.com/dan-go/items/c71e6ac8f72ea6a9c501#lsntctl%E3%82%92%E3%81%BF%E3%81%A6cdb%E5%90%8Dpdb%E5%90%8D%E3%82%92%E7%A2%BA%E8%AA%8D)の記事にあるように`lsnrctl status`コマンドでPDBのサービス名を確認しようとしたところ…

```powershell
PS C:\WINDOWS\system32> lsnrctl status

LSNRCTL for 64-bit Windows: Version 21.0.0.0.0 - Production on 27-4月 -2024 21:31:54

Copyright (c) 1991, 2021, Oracle.  All rights reserved.

(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))に接続中
TNS-12541: TNS: リスナーがありません。
 TNS-12560: TNS: プロトコル・アダプタ・エラー
  TNS-00511: リスナーがありません。
   64-bit Windows Error: 61: Unknown error
```

`リスナーがありません。`と言われて確認できなかった。
そこで`lsnrctl start`と入力し、まずはリスナーとやらを起動する必要があった。
そしてもう一度`lsnrctl status`と入力すると、やっとPDBのサービス名を確認できた。

### リスナーとは
Oracleデータベースにおいて、サーバー側でリモート接続のリクエストを待ち受けている「受付窓口の人」的な存在。
リスナーが起動していないとリモート接続リクエストを受け付けられない。

リスナーの状態を確認・変更は、`lsnrctl`コマンドでリスナープロンプトに入って行う。

https://itsoldier0901.hatenablog.com/entry/2016/10/04/073000


### ドボン4

tnsnames.oraファイルが完成したところで再度接続を試みる。

```powershell
PS C:\WINDOWS\system32> sqlplus user1/user1@p

SQL*Plus: Release 21.0.0.0.0 - Production on 土 4月 27 22:15:29 2024
Version 21.3.0.0.0

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

ERROR:
ORA-01109: database not open
```

`ORA-01109: database not open`というエラー。

### Oracleデータベースの4つの状態
Oracleデータベースの稼働状態には以下の4種類がある。
- OPEN
- MOUNT
- NOMOUNT
- SHUTDOWN (停止状態)

https://sql-oracle.com/?p=56

### PDBをOPENする

sysユーザーでRootに接続し、PDBをOPEN状態に変更した。
```powershell
SQL> alter pluggable database orclpdb open;
```

これでやっっとローカルユーザーでPDBに接続することができた。

# 9. テーブル作成とCRUD操作
最後の力を振り絞って…

```powershell
SQL> create table table1(
  2  column1 number(4,0),
  3  column2 varchar2(100),
  4  column3 varchar2(100));

表が作成されました。

SQL> insert all
  2  into table1 values (1, 'Oracle', 'なんもわからん')
  3  into table1 values (2, 'けどとりあえず', 'なんかできた')
  4  select * from dual;

2行が作成されました。

SQL> select * from table1;

   COLUMN1
----------
COLUMN2
--------------------------------------------------------------------------------
COLUMN3
--------------------------------------------------------------------------------
         1
Oracle
なんもわからん

         2
けどとりあえず
なんかできた

   COLUMN1
----------
COLUMN2
--------------------------------------------------------------------------------
COLUMN3
--------------------------------------------------------------------------------


SQL>

```

# 10. その他メモ
- [ORACLE_BASEとORACLE_HOMEの確認方法](https://eseengineer.hatenablog.com/entry/2014/04/30/154256)

- [Oracleデータベースの削除方法](https://masa7blog.com/oracle-database-delete)

- Oracleソフトウェアのアンインストール方法
19cはUniversal Installerでできたが、21cは無いっぽかったので…
 ①ターミナル起動してORACLE_HOMEに移動
 ②deinstall\deinstall.bat実行
 ③削除するリスナー…"."ですべて選択
 ④削除するデータベース…既に削除したのでEnterで進む
 ⑤最後までEnterなどで進む

 # 参考文献等
 - ネット文献
 この記事に貼ったリンク先の記事。
ネット情報は手軽だが情報が古かったり断片的だったりが大変だった。
 
 - 動画
 [Oracle Database: 管理クイック・スタート](https://mylearn.oracle.com/ou/course/oracle-database-oracle-database-fundamentals-for-devs-and-sysadmins-ed-1-jp/90180/)
 公式動画なので解説は豊富だが、Linuxなのとセミナー動画なので絶対にスムーズに進められる環境が用意されている前提なのがキツめ。あと途中から有料。
 
 - 書籍
     - 翔泳社『絵で見てわかるOracleの仕組み【新装版】』
     入門者のモチベを削がない薄さと、直感に訴える図説。説明文も平易で分かりやすい。素早く目を通すだけでも全体像が掴める。私含め入門者が全然分かっていないけど理解すべきミドル・ハードとの絡みについても説明があって本当に入門者に有難い。著者が全員Oracle社の人。

    - 技術評論社『 [改訂2版]データベース入門から設計／運用の初歩まで Oracleの基本』
    最近のバージョンに対応していて、Windows向けのインストール方法から丁寧に載っているので、インストールは最初からこの本を見てやればよかったと思った。初歩と言いつつ厚めで解説が濃いので主に逆引きで使おうと思う。
 
 # 後書き
 自己学習の初期段階で既に死んだけど大丈夫そ？
 次は運用・管理面を学びたい。