Oracle Database 12c データベースのマルチテナントを実現するOracle Multitenant

徹底解説!Oracle Database 12cのすべて Vol.1 | アシスト

⇧  Oracle Database 12cでは、様々な新機能が追加されていて、500ぐらい機能追加されたそうな...増えすぎでしょ。

マルチテナントとは?

マルチテナントとは、1つのシステム上に複数のサービス(ユーザ)が同居している環境のことで、1つの建物内に複数の店舗や企業が同居している雑居ビルによく似ています。

徹底解説!Oracle Database 12cのすべて Vol.1 | アシスト

データベースをマルチテナント化するための手法はこれまでにもいろいろ出ていたようで、

  • サーバー仮想化
  • 複数データベース
  • 複数スキーマ

などがあったようです。図を引用させていただくと、

f:id:ts0818:20171112183959j:plain

CRM(Customer Relationship Management) = 顧客関連管理
ERP(Enterprise Resource Planning) = 企業資源計画
HR(Human Resources) = 人的資源

 

となるようで、それぞれの欠点を補う形で登場したのが、「Oracle Multitenant(マルチテナント・アーキテクチャ)」という機能のようです。 

マルチテナント・アーキテクチャとは、マルチテナント・コンテナ・データベース(以降CDBと呼びます)と呼ばれるひとつのデータベースとそれに内包される、ひとつまたはそれ以上のプラガブル・データベース (以降PDBと呼びます)によって構成されます。PDBとはスキーマや表領域やデータのセットになります。

Oracleを含む従来のデータベース管理システムは、SQLの実行やトランザクションを管理するシステム部分と、いわゆるデータベースの部分がほぼ不可分でした。マルチテナント・アーキテクチャでは、CDBと呼ばれる部分がデータベース管理システム、PDBと呼ばれる部分が論理的なデータベースと言えます。

第1回 プラガブル・データベースの作成 

11g以前と、今回の12cで大幅にアーキテクチャの仕様が変更されたようです。

※「Oracle Multitenant」の機能は、Oracle Database 12c(Enterprise Edition)で利用可能のようです。

f:id:ts0818:20171112184722j:plain

コマンドプロンプトで、

sqlplus / as sysdba

データベースに接続して、

SHOW CON_NAME

で表示されるのが、CDB(コンテナ・データベース)ってことですかね。

f:id:ts0818:20171112215536j:plain

PDB(プラガブル・データベース)を確認するには、

SELECT name, open_mode FROM v$pdbs;

でいけるみたいです。

f:id:ts0818:20171112220937j:plain

「SHOW PDBS」を使っても

SHOW PDBS;

いけるみたいです。「SHOW PDB」はエラーになりました。

f:id:ts0818:20171117225036j:plain

Oracle Database 12c (12.1.0.2.0) で遊んでみた(その2) 〜プラガブル・データベース〜 - カタカタブログ

⇧  上記サイト様によると、ユーザーの作成などは、PDBに接続を切り替えて、PDBが起動していることを確認して行う必要があるとのことです。(12cから変わったみたいですね。)

 

SQL Developerのインストール

第1回 プラガブル・データベースの作成

⇧  上記サイト様を参考に、データベース接続などができるGUIツールである「SQL Developer」をインストールしていきたいと思います。

Oracle SQL Developer ダウンロード にアクセスします。Oracleアカウントでサインインしておきます。

f:id:ts0818:20171112194042j:plain

「ライセンスに同意する」にチェックを行い、JDKJava SE 8以上)がPCに既にインストールされている場合でWindowsを利用している場合は、「Windows 32-bit/64bit」の「Download」をクリック。(旧いバージョンは、下の方にあるPrevious Version のリンクで1つ前のバージョンを選べます。遷移先で更に旧いバージョンと選べますが、一覧みたいなのがあると良いんですが見つけられず。)

f:id:ts0818:20171112194154j:plain

ダウンロードしたzipファイルを展開します。

f:id:ts0818:20171112195054j:plain

展開先は、前回、Oracle Database 12c(Enterprise Edition)などのzipを展開(解凍)した場所にしました。

f:id:ts0818:20171112195123j:plain

「展開(E)」をクリック。

f:id:ts0818:20171112194930j:plain

展開されました。

f:id:ts0818:20171112195330j:plain

このフォルダの中の「sqldeveloper.exe」をダブルクリックします。

f:id:ts0818:20171112200302j:plain

初回起動時に、「java.exe」のフルパス名の入力を求められる場合があります。
その際は、「java.exe」のフルパス名(例えば C:\Program Files\Java\jdk1.6.0_06\bin\java.exe)を入力してください。

SQL Developerの使い方~ダウンロード、インストール、DB接続、SQL実行 | Oracle オラクルエンジニア通信 - 技術資料、マニュアル、セミナー Blog

ということで、初回起動時、表示されましたんで、

f:id:ts0818:20171112200730j:plain

 コマンドプロンプトなどで、Javaのbinまでのパスを「JAVA_HOME」を設定してる場合は、以下で確認可能。

set JAVA_HOME

f:id:ts0818:20171112200759j:plain

システム環境変数の「Path」にJavaのbinまでのパスを直接設定している場合は、で確認可能です。

set Path

f:id:ts0818:20171112202105j:plain

確認した「Javaのフォルダまでのパス」を追加します。(参考にした情報は旧いようで、bin以降は必要ないようです。)

f:id:ts0818:20171112203529j:plain

起動し始めましたね。

f:id:ts0818:20171112203638j:plain

インポート・プリファレンスの確認画面が表示されるので、
今回新しくインストールした方であれば「いいえ」、以前旧バージョンをお使いで、設定等を引き継ぐ場合は、設定を選択して「はい」ボタンをクリックします。

Oracle SQL Developer のインストールから設定まで | ドラブロ

ということで、「いいえ(N)」をクリック。 

f:id:ts0818:20171112203712j:plain

レポートしたくない場合はチェックを外します。「OK」をクリック。

f:id:ts0818:20171112204012j:plain

SQL Developerが起ち上がりました。

f:id:ts0818:20171112204152j:plain

 

マルチテナント・コンテナ・データベース(CDB)への接続...

Oracle Databaseでデータベースに接続する方法は2通りあるようです。 

qiita.com

⇧  上記サイト様によると、

  1. 環境変数を指定してインスタンスに接続
  2. listner.oraの接続情報を参照してインスタンスに接続

の2つの方法があり、SQL Developer の接続で「SID」は、1の方法に該当し、「サービス名」は、2の方法に該当するのだと思われます...たぶん。

 

 「接続」の上で右クリックし、「接続の作成(A)...」をクリック。

f:id:ts0818:20171112221912j:plain

で、接続エラーになるという流れですね(涙)。

f:id:ts0818:20171112225422j:plain

エラーの内容的には、「ホスト名(A)」か、「ポート(R)」 が合ってないってことみたいですね。

I/O例外です。: The Network Adapter could not establish the connection

JDBC URLにおけるOracleリスナー・ポートのIPアドレスとマシン名が不適切です。(入力した“接続ホスト名”、“接続ポート番号”に誤りがあります。修正・更新後、再度実施してください。)

14.12.7 is21306

Oracle - Oracle SQL Developerのデータベース接続について(60412)|teratail

 ⇧  のエラーが現象としては近そうですね。

 

tnspingでDBへのネットワーク疎通を確認してみる | オラエーリックスマンの呟き 

⇧  上記サイト様によると、「tnsping」コマンドでデータベース接続の確認ができるみたいです。

TNSPINGユーティリティでは、Oracle Netネットワーク上のサービスのリスナーに正常に到達できるかどうかを判断します。

接続をテストするには、次のコマンドを使用します。

tnsping net_service_name count

前述のコマンドでは、次の引数が使用されます。

  • net_service_name: NISなど、tnsnames.oraファイルまたは使用中のネーム・サービスに存在する名前にする必要があります。

  • count: プログラムがサーバーへの到達を試行する回数を指定します。この引数はオプションです。

指定されたネット・サービス名がデータベース名の場合、TNSPINGでは、対応するリスナーへの接続を試みます。実際は、データベースが実行中かどうかは判別されません。

接続のテスト

『C:¥app¥oracle12c¥product¥12.1.0¥dbhome_1¥NETWORK¥ADMIN』のフォルダに設定系のファイルがあるみたいです。

f:id:ts0818:20171112233737j:plain

ちなみに、ファイルはデフォルトの状態で、

tnsnames.ora

# tnsnames.ora Network Configuration File: C:\app\oracle12c\product\12.1.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.33.1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

listener.ora

# listener.ora Network Configuration File: C:\app\oracle12c\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle12c\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle12c\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.33.1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

sqlnet.ora

# sqlnet.ora Network Configuration File: C:\app\oracle12c\product\12.1.0\dbhome_1\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.

# This file is actually generated by netca. But if customers choose to 
# install "Software Only", this file wont exist and without the native 
# authentication, they will not be able to connect to the database on NT.

SQLNET.AUTHENTICATION_SERVICES= (NTS)

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)    

となっています。

localhostだとリスナーに辿り着けず。 

tnsping localohost

f:id:ts0818:20171112232623j:plain

ホストでオラクルのリスナーが起動しているか確認する

⇧  上記サイト様を参考に、「自分自身(ホストマシン)で、 オラクルのリスナーが起動しているか」を確認するも

lsnrctl status

リスナーが起動しているかの判断がつかず。

f:id:ts0818:20171112233039j:plain

 「lsnrctl status」で表示された「リスニング・エンドポイントのサマリー...」の「(HOST=192.168.33.1)」の「192.168.33.1」で、データベース接続できるか確認。

tnsping 192.168.33.1

f:id:ts0818:20171112233420j:plain

SQL Developerのほうで、「ホスト名」を「192.168.33.1」にしたらば、エラーの内容が変わりました。

ステータス: 失敗 -テストが失敗しました: 
Listener refused the connection with the following error:ORA-12514, 
TNS:listener does not currently know of service requested in connect descriptor

f:id:ts0818:20171112234808p:plain

 

Oracle Databaseで接続障害が発生した際の調査手法 | アシスト

⇧  上記サイト様の図を引用させていただくと、

データベース接続には2通りあることを知ったわけですが、外部から接続する(今回でいうと、SQL Developerでの接続)にはリスナーを経由する必要があり、

f:id:ts0818:20171118092855j:plain

「ORA-12514 (TNS-12514) 」 は、リスナーとデータベースの間で起こっているエラーのようですね。

f:id:ts0818:20171118092910j:plain

 

 リスナーがデータベースを認識できていないということらしいです。  

サービスを動的登録させたい場合はデータベース側にリスナ情報を設定するパラメータ(local_listener)を設定する必要があります。 設定しない場合リスナがデータベースを認識できず、接続しようとすると以下のいずれかのエラーが発生します。 

ORACLE クライアントからの接続設定(サーバ編)

SQL Developer接続エラーへの対処(ORA-12514, ORA-12505) | Rainbow Engine

⇧ 上記サイト様によると、

show parameter local_listener

でデータベースにリスナーの登録がされているか確認できるとのこと(動的リスナー)。

f:id:ts0818:20171117210927j:plain

VALUE」が空だと登録されていないらしい(一番初めのデータベースのインストールの仕方がまずかったのか...) 

LOCAL_LISTENER

特性 説明
パラメータ・タイプ 文字列
構文 LOCAL_LISTENER = network_name
デフォルト値 (ADDRESS = (PROTOCOL=TCP)(HOST=hostname)(PORT=1521))(hostnameはローカル・ホストのネットワーク名)
変更可能 ALTER SYSTEM
基本 いいえ

LOCAL_LISTENER - Oracle® Databaseリファレンス 12c リリース1 (12.1)

リファレンスにも、デフォルト値の記載がありましたね。ってことは、「静的リスナー」を使うにしろ「動的リスナー」を使うにしろ、デフォルトの設定でリスナーを使った接続を行うには、「Local_listener」のパラメーターが必須ってことですかね?(何故に設定されなかったのか謎ですが) 

とりあえず、tnsnames.oraとlistener.oraのどちらのデータを使えば良いのか分からんという。

どっちも同じ『(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.33.1)(PORT = 1521))』っていう部分があったけどモヤモヤ感が半端ないですね。

ALTER SYSTEM SET local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.33.1)(PORT = 1521))';

(alter system registerは明示的にリスナへ情報を登録させるコマンドです)

ORACLE クライアントからの接続設定(サーバ編)

alter system register;

f:id:ts0818:20171118142941j:plain

 「local_listener」の値が設定されました。

f:id:ts0818:20171118143528j:plain

もう1つコマンドプロンプトを起動し(管理者権限で起動してます。)、

lsnrctl status

で、状態が変わりました。

f:id:ts0818:20171118143937j:plain

SQL Developerで、

  • 『ユーザー名(U)』を『sys』
  • 『パスワード(P)』を最初にデータベースをインストールしたときに入力したデータベースの管理パスワード
  • 『接続タイプ(Y)』を『基本』
  • 『ロール(L)』を『SYSDBA』
  • 『ホスト名(A)』をtnsnames.oraとlistener.oraとかで記載されていたIPアドレス
  • 『サービス名(E)』をlsnrctl statusで表示されていた「サービス"orcl"」の『orcl』

を指定し、「テスト」をクリック。「ステータス: 成功」となりました。

f:id:ts0818:20171118144533j:plain

「接続(O)」で、無事接続できました!

f:id:ts0818:20171118145927j:plain

コマンドプロンプト側で、「sqlplus ユーザー名/パスワード@サービス名」の形でもログインできました。(パスワードはデータベースの管理パスワード、サービス名はlsnrctl statusで表示されていた「サービス"orcl"」のものを指定しました。ユーザー名は作成してないので、デフォルトで用意されているsysで。)

sqlplus sys as sysdba/データベースの管理パスワード@サービス名

f:id:ts0818:20171118152016j:plain

 

今回も、ハマりにハマりましたが、なんとかOracle Database 12cを利用するスタートラインに立てたということで。

Oracle Databaseに慣れていきたいですね。 

 

 

NG集(リスナーの復活への道)

リスナーの再起動とかしようとして、リスナーを停止して、

lsnrctl stop

f:id:ts0818:20171118113829j:plain

リスナーを開始しようと、

lsnrctl start

ってやっても処理が進む気配がない。

f:id:ts0818:20171118115447j:plain

Windowsのサービスで「OracleOraDB12Home1TNSListener」 (TNSListener)っちゅうのも止まっちまってました。 

外部からの接続を受け入れるためにはサーバ側にてTNSlistenerと呼ばれるプログラム(以下、リスナ)の設定が必要です。 リスナを起動することでポートが開き、外部からのTCPプロトコルを利用したoracle net接続が受け入れられるようになります。 

ORACLE クライアントからの接続設定(サーバ編)

neos21.hatenablog.com

⇧  上記サイト様によると、「OracleOraDB12Home1TNSListener」 =「TNSListener」ってことですかね?

f:id:ts0818:20171118114527j:plain

コマンドプロンプトで起動できないならば、Windowsのサービスのほうからリスナーを起動しようとして、 

f:id:ts0818:20171118114831j:plain

「開始」をクリックしたところ、

f:id:ts0818:20171118120928j:plain

下記のようなダイアログが!

f:id:ts0818:20171118121012j:plain

で、タスクマネージャーを確認したら、「extproc.exe」が22個ぐらい実行中ってなってたんだけど、大丈夫なんすかね...

f:id:ts0818:20171118121611j:plain

とりあえず、一旦、全部の「extproc.exe」を「タスクの終了(E)」で。

f:id:ts0818:20171118123347j:plain

その結果、サービスが起動しました!

f:id:ts0818:20171118123559j:plain

コマンドプロンプトのほうの、「lsnrctl start」のほうも無事動き出していました。11:53:46に開始して、12:34:31に動き出すという...繋がらないならエラーでスパッと処理を中止するとかにして欲しいですな(涙)。

f:id:ts0818:20171118123920j:plain