【LiveLabs】サンドボックス環境で Oracle Database マルチテナント を学ぶ

# はじめに

手を動かしながら、Oracle CloudやOracle Databaseを学んでみたいけど、コスパよく学習したい、個人アカウントで課金されてしまうのが嫌だというのが正直なところかと思います。
そんなとき便利なのが、Oracle LiveLabsのサンドボックス環境です。

[Welcome to Oracle LiveLabs!](https://apexapps.oracle.com/pls/apex/dbpm/r/livelabs/home? "Welcome to Oracle LiveLabs!")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/af6172f8-5b9a-8487-6a38-7c1eb4c35314.png)

ここでは、時間制限の中でサンドボックス環境を無料で立ち上げることができ、ハンズオンを通してOCIを学習することができます。
今回は、特にメリットが出そうなものとして、マルチテナントについて学んでみたいと思います。

# サンドボックス環境の立ち上げ方

まずはサンドボックス環境を立ち上げましょう。
検索バーに「Multitenant」と入力し、"Multitenant Advanced Capabilities"のハンズオンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/6131c47f-0caf-0bf1-daa8-f69c8b0c340c.png)
Launchボタンを押下すると、ハンズオンの詳細ページに遷移します。
画面右のWorkshop OutlineやWorkshop Detailsから、ワークショップの概要、詳細を確認することができます。
画面中央の"Run On LiveLabs Sandbox"を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/2a8bdf20-272c-f4d8-3941-30d194e0225d.png)

すると、ハンズオン用のサンドボックス環境を予約する画面に遷移します。
個人メールにOracle Livelabsからの予約メールが送信されることに同意し、"Submit Reservation"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/23d8eb72-4e72-99c2-77f6-33c1913b4f84.png)
1分以内に個人メールにOracle LiveLabsからメールが届きます。
「いま環境を立ち上げてるよ」といった趣旨です。ハンズオンに依りますが、環境を立ち上げるのに数分かかります。環境が立ち上がった後、「環境が立ち上がったよ」というメールが届きます。
このメールを受領し、LiveLabsの"My Reservations"画面で、"Status: Available"となっていれば準備完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/28f7d750-2258-e234-1b7d-c1694970bb9a.png)

# サンドボックス環境に入ってみる
"My Reservations"画面で"Launch Workshop"ラベルを押下します。
すると、ワークショップ画面に遷移します。
画面上部にサンドボックス環境のURL、画面下部にワークショップ手順が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/53f63126-8f02-5b9f-4bac-bc90c8963f8b.png)

サンドボックス環境のURLを押下します。
Connecting...のあと、ブラウザベースでリモートデスクトップ環境が立ち上がります。
この環境上で、Oracle Databaseを操作できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/e9344132-226e-0584-6f7f-376a03e667e7.png)

この画面上でコマンドラインコンソールを立ち上げますが、直接コピーができないので、Clipboardを立ち上げましょう。画面左の noVNCリストからClipboardアイコンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/6612c662-4ded-4ac7-1d92-7c17ef17fd7a.png)

これにて準備完了です。

# ところでマルチテナントってなに？

今回取り上げるマルチテナントについて、簡単にご説明します。

>マルチテナントを使用することで、Oracleデータベースをコンテナデータベース（CDB）として機能させることができます。 CDBは、複数のプラガブルデータベース（PDB）、スキーマ、スキーマオブジェクト、および非スキーマオブジェクトのポータブルコレクションを統合します。 オンプレミスでもクラウドでも、Oracle Multitenantを使用すると、アプリケーションは自己完結型のPDBで変更されずに実行され、リソースの使用率、管理、および全体的なセキュリティが向上します。

**つまるところ、マルチテナントとは、1台のOracle Databaseの中で複数のDatabaseを立てて管理する仕組みのことです。Oracle Databaseは統合型Databaseのアプローチを取っています。この仕組みによって、データベース管理を楽にしようという魂胆です。**
例えば、複数のアプリケーションから1台のデータベースに処理を行うことが従来の一般的なアーキテクチャだったんですが、近年、キーバリュー型やグラフ型など、ワークロードの特性に合わせて個別のデータモデルを持つデータベースを立てて運用するケースがあるかと思います。しかし、運用をしていくにつれ、実装が複雑化していくことで管理が煩雑になったり、運用リソースが分散してしまうことが課題となっています。
この課題に対し、Oracleでは、複数のワークロード、複数のデータモデルを統合して、物理的にはひとつのデータベースとして動かすというソリューションを打ち出しました。
**Oracleでは、複数のワークロード、複数のデータモデルを統合したデータベースをコンバージド・データベースと呼んでいます。**

加えて、ワークロード単位で別々のデータモデルのデータベースは扱いたいよねということで登場したのがマルチテナントです。下図のように、CDBの上に異なるデータモデルのPDBが複数台並んでいるイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/7d70b631-73a2-62fb-bcd6-2a91571b44bf.png)
>【画像引用元】
20cから従来構成は非サポート！Oracle Multitenantを攻めのITとして使おう！
https://www.ashisuto.co.jp/tech-note/article/20200526_oracle.html

**具体的には、マイクロサービスアーキテクチャのように、部門毎、事業ごとにアプリケーションを分散開発することが求められるワークロードでも、データベースはそれぞれのアプリケーションのデータモデルに対応しながら、統合型のアプローチを取れるため、データ整合性の課題や、それらを同期するために実装が必要となるイベントソーシング、補償トランザクションについても実装が軽減されるよね、というメリットがあります。**

また、コストメリットを出す使い方としては、ひとつのCDBの上で、開発/検証/本番環境ごとにPDBをわけ、運用していく用途です。プロジェクトによっては、お財布事情で本番環境しか存在しないケースや、それゆえに迅速かつ継続的な改修が難しいシステムも存在するかと思います。（この運用を変えない間に開発者またはSIerがいなくなって、誰も保守できず、塩漬けシステムが完成する）コスト意識の強い情シス部門の方にもおすすめです。

市場の認識として、OracleDatabaseは、重厚長大、金融系、製造系などの基幹システムで使うデータベースといったイメージがまだまだ強いですが、マイクロサービスのような分散開発にも対応しながら、組織内に蓄積されたデータを用いて新たなインサイトを生み出すためのソリューションになりえると考えています。

# 構築手順

ではハンズオンを始めていきましょう！
今回の手順は下記の通りです。
1. CDBとPDBの構築
2. PDBのクローン

# 1. CDBとPDBの構築

**【前提】**
このハンズオンでは、2つのCDB（CDB1とCDB2）を作成します。
それぞれ、1523のリスナーLISTCDB1と1524のLISTCDB2を使用して異なるポートでリッスンしています。

ハンズオンで使用する全てののスクリプトは、labs / multitenantフォルダーに保存され、oracleユーザーとして実行されます。 それでは、パスに移動しましょう。

サンドボックス環境のデスクトップからTerminalアイコンをクリックします。
Terminal起動後、下記のコマンドを入力します。
```
cd /home/oracle/labs/multitenant
```
CDB1の環境を設定します。
```
. oraenv
```
CDB1インスタンスに接続します。
```
sqlplus  sys/oracle@localhost:1523/cdb1 as sysdba
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/56ffdec1-2df5-3b9e-2571-ef1e25f36d58.png)

コンテナデータベースCDB1にプラグ可能なデータベースPDB2を作成します。
まずは接続しているユーザを確認します。

```
select
  'DB Name: '  ||Sys_Context('Userenv', 'DB_Name')||
  ' / CDB?: '     ||case
    when Sys_Context('Userenv', 'CDB_Name') is not null then 'YES'
      else  'NO'
      end||
  ' / Auth-ID: '   ||Sys_Context('Userenv', 'Authenticated_Identity')||
  ' / Sessn-User: '||Sys_Context('Userenv', 'Session_User')||
  ' / Container: ' ||Nvl(Sys_Context('Userenv', 'Con_Name'), 'n/a')
  "Who am I?"
  from Dual
  /
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b6d0e56c-58a6-dd44-35e6-3b87c4b85a43.png)
SYSユーザとして、CBS$ROOTとして機能するCDB1に接続していることがわかります。
このCDB1に既存PDBであるPDB1が存在していることを確認します。
```
show  pdbs;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/c7cd343e-f783-fe33-1cab-9eb7c02ae20a.png)

では、CDB1にPDB2を作っていきましょう。
```
create pluggable database PDB2 admin user PDB_Admin identified by oracle;

alter pluggable database PDB2 open;

show pdbs;
```
しばらくすると、PDB2が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/a1876f6d-7682-b702-0fa9-72ffd514abc9.png)

セッションポイントをPDB2に変更します。
```
alter session set container = PDB2;
```
PDB_ADMINに必要な権限を付与し、PDB2のUSERSテーブルスペースを作成します。
```
grant sysdba to pdb_admin;
create tablespace users datafile size 20M autoextend on next 1M maxsize unlimited segment space management auto;
alter database default tablespace Users;
grant create table, unlimited tablespace to pdb_admin;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/bd99bfbf-e227-566d-7f8a-de764d42c081.png)

PDB_ADMINとしてPDB2に接続します。
```
connect pdb_admin/oracle@localhost:1523/pdb2
```

My_TABというテーブルをPDB2に作成します。
```
create table my_tab(my_col number);
insert into my_tab values (1);
commit;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b76e22b7-b5e2-264b-cdb3-aae1c2fe27c4.png)

コンテナデータベースCDB1のSYSに戻り、作成されたテーブルスペースとデータファイルを表示します。

```
connect sys/oracle@localhost:1523/cdb1 as sysdba

COLUMN "Con_Name" FORMAT A10
COLUMN "T'space_Name" FORMAT A12
COLUMN "File_Name" FORMAT A120
SET LINESIZE 220
SET PAGES 9999

with Containers as (
  select PDB_ID Con_ID, PDB_Name Con_Name from DBA_PDBs
  union
  select 1 Con_ID, 'CDB$ROOT' Con_Name from Dual)
select
  Con_ID,
  Con_Name "Con_Name",
  Tablespace_Name "T'space_Name",
  File_Name "File_Name"
from CDB_Data_Files inner join Containers using (Con_ID)
union
select
  Con_ID,
  Con_Name "Con_Name",
  Tablespace_Name "T'space_Name",
  File_Name "File_Name"
from CDB_Temp_Files inner join Containers using (Con_ID)
order by 1, 3
/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/8a47491c-ceaa-b67b-f0ec-6ab3bd95def4.png)

これでCDB1にPDB1とPDB2が構築されたことが確認できました。

# 2. PDBのクローン

ここでは、PDBのクローンを作成します。
>ソースがREAD WRITEモードで開いているときに、PDBのクローンを作成できます。 この機能は、HOTクローンとも呼ばれます。 Hot Cloneは、オンラインのRedologファイルとArchivelogファイルの読み取りに依存しています。 --すべての変更がオンラインREDOlogファイルで利用可能な場合、NOARCHIVELOGモードでもホットクローンが成功します。

CDB1に接続します。
```
connect sys/oracle@localhost:1523/cdb1 as sysdba
```
アーカイブログモードの状態を確認します。
```
archive log list
```
上記コマンドで、No Archive Modeであることを確認します。
先ほど作成したPDB2から、PDB3を作成します。
```
create pluggable database PDB3 from PDB2;
alter pluggable database PDB3 open force;
```
しばらく待つと、PDB3がPDB2からクローンされて構築されます。
下記コマンドにて確認します。
```
show pdbs
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b02f8ba8-3ac5-5053-bdd3-1ffff62d8ea2.png)

コピーされていることがわかりました！
下記コマンドにて、テーブルもコピーされていることがわかります。

```
alter session set container = PDB3;
select * from my_tab;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/448939ff-4cce-f276-b527-f8438c34f05f.png)

例えば、PDB2がST環境で、PDB3がUAT環境であった場合、このPDBホットクローンで、環境を稼働しながら、ステージに合わせたテスト環境を容易にコピーして、同等のテストデータで検証が可能となります。

# お片付け＆おわりに

今回は、サンドボックス環境にてハンズオンを行っているため、リソースの削除等は必要ありません。
ブラウザのタブを閉じるだけでお片付け完了です。こうした手軽さもLiveLabsのいいところだと思います。

無料かつ気軽に、OracleDatabaseの新機能などを試す際にご活用ください。