・徹底解説!Oracle Database 12cのすべて Vol.1 | アシスト
⇧ Oracle Database 12cでは、様々な新機能が追加されていて、500ぐらい機能追加されたそうな...増えすぎでしょ。
マルチテナントとは?
マルチテナントとは、1つのシステム上に複数のサービス(ユーザ)が同居している環境のことで、1つの建物内に複数の店舗や企業が同居している雑居ビルによく似ています。
データベースをマルチテナント化するための手法はこれまでにもいろいろ出ていたようで、
- サーバー仮想化
- 複数データベース
- 複数スキーマ
などがあったようです。図を引用させていただくと、
CRM(Customer Relationship Management) = 顧客関連管理
ERP(Enterprise Resource Planning) = 企業資源計画
HR(Human Resources) = 人的資源
となるようで、それぞれの欠点を補う形で登場したのが、「Oracle Multitenant(マルチテナント・アーキテクチャ)」という機能のようです。
マルチテナント・アーキテクチャとは、マルチテナント・コンテナ・データベース(以降CDBと呼びます)と呼ばれるひとつのデータベースとそれに内包される、ひとつまたはそれ以上のプラガブル・データベース (以降PDBと呼びます)によって構成されます。PDBとはスキーマや表領域やデータのセットになります。
Oracleを含む従来のデータベース管理システムは、SQLの実行やトランザクションを管理するシステム部分と、いわゆるデータベースの部分がほぼ不可分でした。マルチテナント・アーキテクチャでは、CDBと呼ばれる部分がデータベース管理システム、PDBと呼ばれる部分が論理的なデータベースと言えます。
11g以前と、今回の12cで大幅にアーキテクチャの仕様が変更されたようです。
※「Oracle Multitenant」の機能は、Oracle Database 12c(Enterprise Edition)で利用可能のようです。
sqlplus / as sysdba
データベースに接続して、
SHOW CON_NAME
で表示されるのが、CDB(コンテナ・データベース)ってことですかね。
PDB(プラガブル・データベース)を確認するには、
SELECT name, open_mode FROM v$pdbs;
でいけるみたいです。
「SHOW PDBS」を使っても
SHOW PDBS;
いけるみたいです。「SHOW PDB」はエラーになりました。
・Oracle Database 12c (12.1.0.2.0) で遊んでみた(その2) 〜プラガブル・データベース〜 - カタカタブログ
⇧ 上記サイト様によると、ユーザーの作成などは、PDBに接続を切り替えて、PDBが起動していることを確認して行う必要があるとのことです。(12cから変わったみたいですね。)
SQL Developerのインストール
⇧ 上記サイト様を参考に、データベース接続などができるGUIツールである「SQL Developer」をインストールしていきたいと思います。
Oracle SQL Developer ダウンロード にアクセスします。Oracleアカウントでサインインしておきます。
「ライセンスに同意する」にチェックを行い、JDK(Java SE 8以上)がPCに既にインストールされている場合でWindowsを利用している場合は、「Windows 32-bit/64bit」の「Download」をクリック。(旧いバージョンは、下の方にあるPrevious Version のリンクで1つ前のバージョンを選べます。遷移先で更に旧いバージョンと選べますが、一覧みたいなのがあると良いんですが見つけられず。)
ダウンロードしたzipファイルを展開します。
展開先は、前回、Oracle Database 12c(Enterprise Edition)などのzipを展開(解凍)した場所にしました。
「展開(E)」をクリック。
展開されました。
このフォルダの中の「sqldeveloper.exe」をダブルクリックします。
初回起動時に、「java.exe」のフルパス名の入力を求められる場合があります。
その際は、「java.exe」のフルパス名(例えば C:\Program Files\Java\jdk1.6.0_06\bin\java.exe)を入力してください。
SQL Developerの使い方~ダウンロード、インストール、DB接続、SQL実行 | Oracle オラクルエンジニア通信 - 技術資料、マニュアル、セミナー Blog
ということで、初回起動時、表示されましたんで、
コマンドプロンプトなどで、Javaのbinまでのパスを「JAVA_HOME」を設定してる場合は、以下で確認可能。
set JAVA_HOME
システム環境変数の「Path」にJavaのbinまでのパスを直接設定している場合は、で確認可能です。
set Path
確認した「Javaのフォルダまでのパス」を追加します。(参考にした情報は旧いようで、bin以降は必要ないようです。)
起動し始めましたね。
インポート・プリファレンスの確認画面が表示されるので、
今回新しくインストールした方であれば「いいえ」、以前旧バージョンをお使いで、設定等を引き継ぐ場合は、設定を選択して「はい」ボタンをクリックします。
ということで、「いいえ(N)」をクリック。
レポートしたくない場合はチェックを外します。「OK」をクリック。
SQL Developerが起ち上がりました。
マルチテナント・コンテナ・データベース(CDB)への接続...
Oracle Databaseでデータベースに接続する方法は2通りあるようです。
⇧ 上記サイト様によると、
の2つの方法があり、SQL Developer の接続で「SID」は、1の方法に該当し、「サービス名」は、2の方法に該当するのだと思われます...たぶん。
「接続」の上で右クリックし、「接続の作成(A)...」をクリック。
で、接続エラーになるという流れですね(涙)。
エラーの内容的には、「ホスト名(A)」か、「ポート(R)」 が合ってないってことみたいですね。
I/O例外です。: The Network Adapter could not establish the connection
・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』のフォルダに設定系のファイルがあるみたいです。
ちなみに、ファイルはデフォルトの状態で、
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
⇧ 上記サイト様を参考に、「自分自身(ホストマシン)で、 オラクルのリスナーが起動しているか」を確認するも
lsnrctl status
リスナーが起動しているかの判断がつかず。
「lsnrctl status」で表示された「リスニング・エンドポイントのサマリー...」の「(HOST=192.168.33.1)」の「192.168.33.1」で、データベース接続できるか確認。
tnsping 192.168.33.1
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
・Oracle Databaseで接続障害が発生した際の調査手法 | アシスト
⇧ 上記サイト様の図を引用させていただくと、
データベース接続には2通りあることを知ったわけですが、外部から接続する(今回でいうと、SQL Developerでの接続)にはリスナーを経由する必要があり、
「ORA-12514 (TNS-12514) 」 は、リスナーとデータベースの間で起こっているエラーのようですね。
リスナーがデータベースを認識できていないということらしいです。
サービスを動的登録させたい場合はデータベース側にリスナ情報を設定するパラメータ(local_listener)を設定する必要があります。 設定しない場合リスナがデータベースを認識できず、接続しようとすると以下のいずれかのエラーが発生します。
・SQL Developer接続エラーへの対処(ORA-12514, ORA-12505) | Rainbow Engine
⇧ 上記サイト様によると、
show parameter local_listener
でデータベースにリスナーの登録がされているか確認できるとのこと(動的リスナー)。
「VALUE」が空だと登録されていないらしい(一番初めのデータベースのインストールの仕方がまずかったのか...)
LOCAL_LISTENER
特性 | 説明 |
---|---|
パラメータ・タイプ | 文字列 |
構文 | LOCAL_LISTENER = network_name |
デフォルト値 | (ADDRESS = (PROTOCOL=TCP)(HOST= hostname )(PORT=1521)) (hostname はローカル・ホストのネットワーク名) |
変更可能 | ALTER SYSTEM |
基本 | いいえ |
リファレンスにも、デフォルト値の記載がありましたね。ってことは、「静的リスナー」を使うにしろ「動的リスナー」を使うにしろ、デフォルトの設定でリスナーを使った接続を行うには、「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は明示的にリスナへ情報を登録させるコマンドです)
alter system register;
「local_listener」の値が設定されました。
もう1つコマンドプロンプトを起動し(管理者権限で起動してます。)、
lsnrctl status
で、状態が変わりました。
SQL Developerで、
- 『ユーザー名(U)』を『sys』
- 『パスワード(P)』を最初にデータベースをインストールしたときに入力したデータベースの管理パスワード
- 『接続タイプ(Y)』を『基本』
- 『ロール(L)』を『SYSDBA』
- 『ホスト名(A)』をtnsnames.oraとlistener.oraとかで記載されていたIPアドレス
- 『サービス名(E)』をlsnrctl statusで表示されていた「サービス"orcl"」の『orcl』
を指定し、「テスト」をクリック。「ステータス: 成功」となりました。
「接続(O)」で、無事接続できました!
コマンドプロンプト側で、「sqlplus ユーザー名/パスワード@サービス名」の形でもログインできました。(パスワードはデータベースの管理パスワード、サービス名はlsnrctl statusで表示されていた「サービス"orcl"」のものを指定しました。ユーザー名は作成してないので、デフォルトで用意されているsysで。)
sqlplus sys as sysdba/データベースの管理パスワード@サービス名
今回も、ハマりにハマりましたが、なんとかOracle Database 12cを利用するスタートラインに立てたということで。
Oracle Databaseに慣れていきたいですね。
NG集(リスナーの復活への道)
リスナーの再起動とかしようとして、リスナーを停止して、
lsnrctl stop
リスナーを開始しようと、
lsnrctl start
ってやっても処理が進む気配がない。
Windowsのサービスで「OracleOraDB12Home1TNSListener」 (TNSListener)っちゅうのも止まっちまってました。
外部からの接続を受け入れるためにはサーバ側にてTNSlistenerと呼ばれるプログラム(以下、リスナ)の設定が必要です。 リスナを起動することでポートが開き、外部からのTCPプロトコルを利用したoracle net接続が受け入れられるようになります。
⇧ 上記サイト様によると、「OracleOraDB12Home1TNSListener」 =「TNSListener」ってことですかね?
コマンドプロンプトで起動できないならば、Windowsのサービスのほうからリスナーを起動しようとして、
「開始」をクリックしたところ、
下記のようなダイアログが!
で、タスクマネージャーを確認したら、「extproc.exe」が22個ぐらい実行中ってなってたんだけど、大丈夫なんすかね...
とりあえず、一旦、全部の「extproc.exe」を「タスクの終了(E)」で。
その結果、サービスが起動しました!
コマンドプロンプトのほうの、「lsnrctl start」のほうも無事動き出していました。11:53:46に開始して、12:34:31に動き出すという...繋がらないならエラーでスパッと処理を中止するとかにして欲しいですな(涙)。