CentOS 7.4系にインストールしたOracle Database 12c Release 2 (12.2.0.1.0) でリスナー(Oracle Net Listener)の設定

突然ですが、下記の式に直線1本だけ引いて等式にしてください。

f:id:ts0818:20180401181321p:plain

って、携帯の広告で載ってたんですが、これ解けたらIQ150以上って...そんあわけあるか~い!

まぁ、答えを確認してないけど、こんな感じでしょうね、きっと。とんちか!一休さ~ん!

f:id:ts0818:20180401181528p:plain

というわけで、のっけから話が脱線してしまいましたが、

前回までで、ORACLEインスタンスとDBのマウントまではできました。 

ts0818.hatenablog.com

 

今回は、いよいよネットワーク経由のDB接続に入っていきたいと思います。

例によって、めちゃくちゃハマってます...もう何もやる気が起きませんね....。

それでは、レッツトライ。

 

Oracle DatabaseのDB接続

Oracle DataBaseのDB接続には、大まかに分けて、

  • ネットワーク経由しない
    • sqlplusで直接接続
  • ネットワーク経由する
    • SQLDeveloperなどを利用
    • Javaプログラムなどで(JDBCドライバの利用)

の2つのパターンになると思われます。(sqlplusでも後述するリスナーを利用してネットワーク経由の接続ができると思われます。)

今回は、ネットワーク経由で接続するための設定にトライしていきたいと思います。

Oracle Net Service というコンポーネントを利用することで、ネットワーク経由の接続が可能になるようです。

ORACLEの公式の説明だと、 

⇧  こんな感じですね。 

 

Oracle Net Listener

Oracle Net Listenerは、Oracle Net Service というコンポーネントの中の1つで、 

Oracle DatabaseサーバーはOracle Net Listenerを通じて初期接続を受け取ります。Oracle Net Listener(このマニュアルではリスナーと呼びます)は、クライアント要求を受け取ってサーバーに渡します。リスナーはプロトコル・アドレスで構成されており、同じプロトコル・アドレスで構成されたクライアントは、そのリスナーに接続要求を送信できます。接続が確立されると、クライアントとOracleサーバーは互いに直接通信します。

Oracle Net Servicesの概要

と説明されていて、

⇧  こんな感じですね。

Oracle Net Lisnterの説明はこんな感じ。

Oracle Net Listenerは、データベース・サーバーで実行される独立したプロセスです。着信中のクライアント接続要求を受信し、データベース・サーバーに対する要求の通信量を管理します。

Oracle Net Listenerの構成と管理

で、このリスナー(Oracle Net Lisnter)の概念が、むちゃくちゃ分かりづらいです。 

まず、リスナーに必要な情報が、 

リスナーは、1つ以上のリスニング・プロトコル・アドレス、サポートされるサービスについての情報および実行時の動作を制御するパラメータから構成されます。リスナーの構成は、listener.oraとネーミングされた構成ファイルに格納されます。

Oracle Net Listenerの構成と管理

となっていてるんですが、listner.oraにデフォルトのリスナーが用意されているので、リスナーを起動すれば接続できると。(ただし、起動時はサービスが登録されていないので、HOST、つまりIPアドレスとかが正しく設定されていないと接続されないと思われます。)

構成パラメータにはデフォルト値が設定されているため、構成前のリスナーを起動して使用できます。デフォルトのリスナーはLISTENERとネーミングされ、起動時はサービスがサポートされていないため次のTCP/IPプロトコル・アドレスのリスニングを行います。

(ADDRESS=(PROTOCOL=tcp)(HOST=host_name)(PORT=1521))

Oracle Net Listenerの構成と管理

じゃあ、サービスってどうやって登録されるんですかね、となりますが、 

このサービスの登録のされ方ですが、 

  • 静的サービス登録(listener.oraとネーミングされた構成ファイルを利用)
  • 動的サービス登録(データベース初期化ファイルを利用)

※ データベース初期化ファイルは、『テキスト形式のpfile(初期化パラメータ・ファイル) ==  init[ORACLE_SID].ora』のことだと思われます。

と、 2パターンあるのではないかと。

リスナーはクライアント要求をサポートされているサービスに転送します。これらのサービスは、リスナーに動的に登録されます。この動的登録機能は、サービス登録と呼ばれます。登録は、リスナー登録(LREG)プロセスによって実行されます。動的サービス登録では、listener.oraファイルでの手動による構成は不要です。

Oracle Net Listenerの構成と管理

で、ちょっと待ってくれ、そもそもサービスって何ぞ?

サービス登録の理解

接続記述子ではデータベース・サービス名を指定し、これを使用してクライアントは接続の確立を試みます。リスナーは接続要求を処理できるサービスを認識しますが、これは、Oracle Databaseがこの情報をリスナーに動的に登録しているためです。この登録プロセスは、サービス登録と呼ばれます。登録によって、データベース・インスタンス、および各インスタンスで利用可能なサービス・ハンドラに関する情報がリスナーに提供されます。ディスパッチャまたは専用サーバーがあります。

データベースの識別とアクセス

サービスは、 

ということですかね。

ちなみに、接続記述子は、 

接続識別子

接続記述子または接続記述子にマッピングされる名前。接続識別子は、ネットワーク・サービス名、データベース・サービス名ネットワーク・サービス別名のいずれかです。

Oracle® Database Net Services管理者ガイド 12c Release 1 (12.1) 用語集

接続識別子の説明で出てきますね。 

接続記述子

ネットワーク接続の宛先を示す特殊なフォーマットの記述子です。接続記述子には、宛先サービスおよびネットワーク・ルートの情報が含まれています。

宛先サービスは、そのサービス名で示されます。ネットワーク・ルートは、少なくとも、ネットワーク・アドレスによってリスナーの位置を提供します。

Oracle® Database Net Services管理者ガイド 12c Release 1 (12.1) 用語集

 

 

listener.oraを利用してリスナーを起動してみる

とりあえず、デフォルトで用意してくれているっていう listener.ora を使ってリスナーを起動してみますか。

動的サービス登録により、サポート対象サービスの静的構成は不要になりました。ただし、Oracle Enterprise Manager Cloud Controlを使用する場合は、静的サービス構成が必要となります。

デフォルトで、listener.oraファイルはORACLE_HOME/network/adminディレクトリに配置されます。listener.oraファイルは次の場所に格納される場合もあります。

listener.oraファイル内のOracle Net Listenerパラメータ 

「サポート対象サービスの静的構成は不要になりました。」って...listener.oraは必要ない?わ、分からん。まぁ、聞かなかったことにして。

で、肝心の listener.ora の場所ですが、デフォルトでは、

$ORACLE_HOME/network/admin/listener.ora

に作成されているらしい。

f:id:ts0818:20180324165822p:plain

 ⇧  はい、先生、listener.ora 君がいません。

 

ameblo.jp

⇧  上記サイト様によると、Oracle DatabaseのインストーラーでDBの作成までしておかないと、listener.ora、sqlnet.ora、tnsnames.ora は作成されないんだそうな...そんなこと言われましても、初学者には分からんってことですよね。

無いなら作るしかないわけで、listener.oraを作成するには、

  • Oracle Net Configuration Assistantを起動して「リスナー構成」を実行してファイルを作成(GUI
  • Oracle Net Configuration Assistantをレスポンス・ファイルを使用して実行してファイルを作成
  • テキスト・エディタなどでファイルを作成

のどれかになるそうです。

一応、listener.oraなどの雛型になるファイルが、

$ORACLE_HOME/network/admin/samples

に用意されてるっぽいです。

f:id:ts0818:20180324171709p:plain

 ⇧  雛型から作ろうとしてドハマりしました。詳細はページ下部のNG集で。

 

Oracle Net Configuration Assistantを起動して「リスナー構成」を実行してファイルを作成」ほうでトライされるという方は、

www.server-world.info

⇧  上記サイト様が参考になりそうです。

 

そんでは、レスポンスファイルを準備していくわけですが、 

ts0818.hatenablog.com

⇧  このときに利用したレスポンスファイルの雛型(テンプレートファイル)とは別のファイルを利用していくのですが、 

Oracleには、製品、インストール・タイプおよび構成ツールごとに、レスポンス・ファイルのテンプレートが用意されています。これらのファイルは、ORACLE_HOME/assistants/ディレクトリ、およびインストール・メディアのdatabase/responseディレクトリにあります。

レスポンス・ファイルを使用したOracle Databaseのインストールおよび構成

⇧  場所的には、$ORACLE_HOME/assistants/ もしくは、database/response/ のディレクトリにあるらしいと。

レスポンスファイルのテンプレートの種類としては、 

レスポンスファイル 説明
db_install.rsp Oracle Database 12cのサイレント・インストール
grid_install.rsp Oracle Grid Infrastructureのサイレント・インストール
dbca.rsp Database Configuration Assistantのサイレント・インストール
netca.rsp Oracle Net Configuration Assistantのサイレント・インストール

ってなってますね。

で、実際に確認してみると、

f:id:ts0818:20180401102625p:plain

grid_install.rsp以外はいましたね。 (grid_install.rspは、Oracle Grid Infrastructure導入の場合に利用するものらしく、Oracle Databaseとは異なるようです。)

で、今回は、netca.rspを利用していく感じですね。 

ただ、またしてもOracleの説明が分かりづらい。

レスポンス・ファイルのディレクトリからシステム上のディレクトリに、レスポンス・ファイル・テンプレートnetca.rspをコピーします。

$ cp /directory_path/response/netca.rsp local_directory

って、local_directoryの説明が一切ない。どこでも良いってこと?

www.dbaglobe.com

⇧  ネットの情報を見ると、netca.rspに関しては、みなさんコピーせずに直接実行してらっしゃる... 

レスポンス・ファイルを適切に構成しないと、Net Configuration Assistantに障害が発生します。』 

って関係ないじゃん...。

 

まぁ、とりあえず、コピーしてファイルの中身を確認してみますか。

cp database/response/netca.rsp database/response/netca12c.rsp

f:id:ts0818:20180401111847p:plain

######################################################################
## Copyright(c) 1998, 2016 Oracle Corporation. All rights reserved. ##
##                                                                  ##
## Specify values for the variables listed below to customize your  ##
## installation.                                                    ##
##                                                                  ##
## Each variable is associated with a comment. The comment          ##
## identifies the variable type.                                    ##
##                                                                  ##
## Please specify the values in the following format:               ##
##                                                                  ##
##         Type         Example                                     ##
##         String       "Sample Value"                              ##
##         Boolean      True or False                               ##
##         Number       1000                                        ##
##         StringList   {"String value 1","String Value 2"}         ##
##                                                                  ##
######################################################################
##                                                                  ##
## This sample response file causes the Oracle Net Configuration    ##
## Assistant (NetCA) to complete an Oracle Net configuration during ##
## a custom install of the Oracle12c server which is similar to     ##
## what would be created by the NetCA during typical Oracle12c      ##
## install. It also documents all of the NetCA response file        ##
## variables so you can create your own response file to configure  ##
## Oracle Net during an install the way you wish.                   ##
##                                                                  ##
######################################################################

[GENERAL]
RESPONSEFILE_VERSION="12.2"
CREATE_TYPE="CUSTOM"

#-------------------------------------------------------------------------------
# Name       : SHOW_GUI
# Datatype   : Boolean
# Description: This variable controls appearance/suppression of the NetCA GUI,
# Pre-req    : N/A
# Default    : TRUE
# Note:
# This must be set to false in order to run NetCA in silent mode.
# This is a substitute of "/silent" flag in the NetCA command line.
# The command line flag has precedence over the one in this response file.
# This feature is present since 10.1.0.3.
#-------------------------------------------------------------------------------
#SHOW_GUI=false

#-------------------------------------------------------------------------------
# Name       : LOG_FILE
# Datatype   : String
# Description: If present, NetCA will log output to this file in addition to the
#              standard out.
# Pre-req    : N/A
# Default    : NONE
# Note:
#       This is a substitute of "/log" in the NetCA command line.
# The command line argument has precedence over the one in this response file.
# This feature is present since 10.1.0.3.
#-------------------------------------------------------------------------------
#LOG_FILE=""/oracle12cHome/network/tools/log/netca.log""

[oracle.net.ca]
#INSTALLED_COMPONENTS;StringList;list of installed components
# The possible values for installed components are:
# "net8","server","client","aso", "cman", "javavm"
INSTALLED_COMPONENTS={"server","net8","javavm"}

#INSTALL_TYPE;String;type of install
# The possible values for install type are:
# "typical","minimal" or "custom"
INSTALL_TYPE=""typical""

#LISTENER_NUMBER;Number;Number of Listeners
# A typical install sets one listener
LISTENER_NUMBER=1

#LISTENER_NAMES;StringList;list of listener names
# The values for listener are:
# "LISTENER","LISTENER1","LISTENER2","LISTENER3", ...
# A typical install sets only "LISTENER"
LISTENER_NAMES={"LISTENER"}

#LISTENER_PROTOCOLS;StringList;list of listener addresses (protocols and parameters separated by semicolons)
# The possible values for listener protocols are:
# "TCP;1521","TCPS;2484","NMP;ORAPIPE","IPC;IPCKEY","VI;1521"
# For multiple listeners, separate them with commas ex "TCP;1521","TCPS;2484"
# For multiple protocols in single listener, separate them with "&" ex  "TCP;1521&TCPS;2484"
# A typical install sets only "TCP;1521"
LISTENER_PROTOCOLS={"TCP;1521"}

#LISTENER_START;String;name of the listener to start, in double quotes
LISTENER_START=""LISTENER""ted with a comment. The comment          ##

#NAMING_METHODS;StringList;list of naming methods
# The possible values for naming methods are:
# LDAP, TNSNAMES, ONAMES, HOSTNAME, NOVELL, NIS, DCE
# A typical install sets only: "TNSNAMES","ONAMES","HOSTNAMES"
# or "LDAP","TNSNAMES","ONAMES","HOSTNAMES" for LDAP
NAMING_METHODS={"TNSNAMES","ONAMES","HOSTNAME"}

#NOVELL_NAMECONTEXT;String;Novell Directory Service name context, in double quotes
# A typical install does not use this variable.
#NOVELL_NAMECONTEXT = ""NAMCONTEXT""

#SUN_METAMAP;String; SUN meta map, in double quotes
# A typical install does not use this variable.
#SUN_METAMAP = ""MAP""

#DCE_CELLNAME;String;DCE cell name, in double quotes
# A typical install does not use this variable.
#DCE_CELLNAME = ""CELL""

#NSN_NUMBER;Number;Number of NetService Names
# A typical install sets one net service name
NSN_NUMBER=1

#NSN_NAMES;StringList;list of Net Service names
# A typical install sets net service name to "EXTPROC_CONNECTION_DATA"
NSN_NAMES={"EXTPROC_CONNECTION_DATA"}

#NSN_SERVICE;StringList;Oracle12c database's service name
# A typical install sets Oracle12c database's service name to "PLSExtProc"
NSN_SERVICE={"PLSExtProc"}

#NSN_PROTOCOLS;StringList;list of coma separated strings of Net Service Name protocol parameters
# The possible values for net service name protocol parameters are:
# "TCP;HOSTNAME;1521","TCPS;HOSTNAME;2484","NMP;COMPUTERNAME;ORAPIPE","VI;HOSTNAME;1521","IPC;IPCKEY"
# A typical install sets parameters to "IPC;EXTPROC"
NSN_PROTOCOLS={"TCP;HOSTNAME;1521"}

#SERVICEUSERPASSWORD;String;Windows service user password
# If the oracle home is installed as secure user, supply the password
#SERVICEUSERPASSWORD=""svcpassword""

デフォルトのLISETNERを利用していく分には編集不要ってことですかね?

レスポンスファイルを実行する場合は、oracleユーザー(Oracle Databaseのインストールを実行したときのユーザー)で、環境変数ORACLE_HOMEが設定されている状態で行います。

/opt/app/oracle/product/12.2.0.1/dbhome_1/bin/netca -silent -responsefile database/response/netca12c.rsp

 

f:id:ts0818:20180401160422p:plain

⇧  はい、エラー。 

どうやら、絶対パスで指定しないとマズかったようです。

/opt/app/oracle/product/12.2.0.1/dbhome_1/bin/netca -silent -responsefile /home/oracle/database/response/netca12c.rsp

f:id:ts0818:20180401160601p:plain

無事、リスナーが構成されたようです。

リスナーの状態を確認。

f:id:ts0818:20180401161130p:plain

⇧  NATのほうのIPアドレスでリスニングされてしまっているんだが....ホストオンリーアダプターのほうでリスニングしてくれない...。

まぁ、ファイルのほうは作成されているようです。だが、しかし、 tnsnames.oraが作成されとらんのだが...。おそらく、

INSTALLED_COMPONENTS={"server","net8","javavm"}

って部分で、

INSTALLED_COMPONENTS={"client","server","net8","javavm"}

ってしておけば良かったのかな?

このへんの説明まったくないし、Oracleが、安定の不親切さ と言われる所以ですかね。

f:id:ts0818:20180401161912p:plain

まぁ、やり直しは効かないんで。しかも、一度作成したリスナーを削除するには、Oracle Clusterware制御(CRSCTL)ユーティリティってコマンドを導入する必要があるらしい...なんだかな~。そんな作りは、あたしゃ認めないよ!って言いたくもなりますわな。

DBに接続して、

f:id:ts0818:20180401162058p:plain

ローカルリスナーが...登録されとらんやん。

f:id:ts0818:20180401162426p:plain

⇧  デフォルトのLISETNERの設定が登録されてるって噂があったんですが。

リスナーも起動してるっぽいんですが。

f:id:ts0818:20180401163039p:plain

リスナーがORACLEインスタンスを認識できていないようです。

tech.blog.arsnv.co.jp

⇧  上記サイト様を参考に、リスナーを停止し、listener.oraを編集してみたいと思います。

f:id:ts0818:20180401203015p:plain

f:id:ts0818:20180401203207p:plain

追記します。

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC = 
      (SID_NAME = orcl)
      (ORACLE_HOME=/opt/app/oracle/product/12.2.0.1/dbhome_1)
    )
  )

f:id:ts0818:20180401204648p:plain

で、リスナーを再起動。 

f:id:ts0818:20180401205125p:plain

⇧  状態UNKNOWNとか出てるけど、OKみたいですね...。

systemユーザーで接続を試みたところ、なんとか、リスナー経由で接続できました。

 sqlplus [Oracleデータベースに存在するユーザー]/[そのユーザーのパスワード]@[リスナーに登録してるホスト名またはIPアドレス]/[ネットサービス名]

f:id:ts0818:20180401210021j:plain

 ただし、仮想マシン内でしか接続できていないので、今度は外部(ホストOS、自分でいうとWindows 10 Home側のクライアントソフト)から接続していきたいですね。

ちなみに、SYSTEMユーザーは、 Oracle Database管理者ガイド 12c リリース2 (12.2)によりますと、

Oracle Databaseのインストール時には、次の管理ユーザー・アカウントが自動的に作成されます。

  • SYS

  • SYSTEM

  • SYSBACKUP

  • SYSDG

  • SYSKM

  • SYSRAC
Oracle Universal Installer(OUI)およびDatabase Configuration Assistant(DBCA)では、SYSおよびSYSTEMのパスワードの入力が要求され、それぞれデフォルトのパスワードである"change_on_install"または"manager"は受け入れられません。

データベースを手動で作成する場合は、これらのデフォルト・パスワードを使用しないで、SYSSYSTEMのパスワードをデータベースの作成時に指定することをお薦めします。

データベース管理スタート・ガイド

となっていて、

CREATE DATABASE文でユーザーSYSおよびSYSTEMのパスワード指定に使用する句は、次のとおりです。

  • USER SYS IDENTIFIED BY password

  • USER SYSTEM IDENTIFIED BY password

これらの句を省略すると、これらのユーザーにはそれぞれデフォルトのパスワードchange_on_installおよびmanagerが割り当てられます。デフォルトのパスワードが使用された場合は、そのことを示すレコードがアラート・ログに書き込まれます。データベースを保護するには、データベース作成直後にALTER USER文を使用して、これらのパスワードを変更する必要があります。

Oracle Databaseの作成および構成

docs.oracle.com

となっているので、特に指定してない場合は、SYSTEMユーザーのパスワードはmanagerってことですかね? (自分は変更してしまってます。)

 

な~んか、NATでリスニングされてるのがマズイ気はしますが....。

d.hatena.ne.jp

⇧  上記サイト様によると、NATだと、通常はホストOSとゲストOSの通信ができないようですね...ネットワーク難いっす。

雲行きの怪しさが止まることを知らない時の流れ~ですが...

今回はこのへんで。

 

2018年4月1日(日) 22:30 追記:

Oracleさんは、/etc/hosts ファイルを編集して直接、ホストオンリーアダプターのIPアドレスを指定しとったよ...

http://www.oracle.com/technetwork/jp/database/enterprise-edition/documentation/sionvbox-db12101onol6u4-2080482-ja.pdf

なんだかな~。

 

 

 

 

NG集(いまだ未解決)

listener.oraを雛型から作ろうとしてドハマった経緯です、まったくの無駄足でした。結局、解決してません。(vagrant仮想マシンの状態をsnapshotとして保存してる状態です。)

f:id:ts0818:20180324171709p:plain

⇧  というわけで、この方たちのコピーを、

$ORACLE_HOME/network/admin/

に作成してまいりますか。

今回は「テキスト・エディタなどでファイルを作成」でいくことに。

 

 

では、 

qiita.com

⇧  上記サイト様を参考に、一度にコピーしてみます。$ORACLE_HOMEはご自身の環境のパスに置き換えてください。

cp $ORACLE_HOME/network/admin/samples/*.ora $ORACLE_HOME/network/admin/

f:id:ts0818:20180324172633p:plain

⇧  コピーされました。

で編集していくわけですが、 

 ・listener.oraファイル内のOracle Net Listenerパラメータ

 ・プロトコル・アドレス構成

⇧  上記の説明を参考にしました。まずは、viエディターでlistener.oraを開きます。

f:id:ts0818:20180324181236p:plain

で、開きましたら、

f:id:ts0818:20180324181415p:plain

ってなってる部分を、

# LISTENER =
#  (ADDRESS_LIST=
#       (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
#       (ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY)))

のように編集します。HOSTは仮想マシンのIPまたはホスト名、PORTは仮想マシン内の他のアプリと被らなければ何でも良いかと。KEYは、「Oracleシステム識別子(SID)」つまり環境変数ORACLE_SIDの値で大丈夫かと。

 LISTENER =
  (ADDRESS_LIST=
       (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.33.10)(PORT=1521))
       (ADDRESS=(PROTOCOL=ipc)(KEY=ORCL)))

f:id:ts0818:20180324192531p:plain

そしたらば、リスナーを起動してみますか。

Oracleリスナーは、ホストが再起動するたびに自動的に起動するように設定されています。ただし、システムに予期しない状況が起きたときまたは手動でリスナーを停止したときはコマンドラインで再起動できます。

リスナーの起動および停止

lsnrctl start

f:id:ts0818:20180324194020j:plain

 ⇧ はい、駄目でした。

CentOS7のネットワークが以下のようになっていて、Oracleのリスナーがenp0s3のほうを探しに行ってしまっていたようです。

f:id:ts0818:20180324200424j:plain

ネットワークインターフェイス「enp0s8」が「NAT」に、「enp0s9」が「ホストオンリーアダプター」に割り当てられています。

※割り当てられるネットワークインターフェイスの名前は、環境によって異なります。

※「xx:xx:xx:xx:xx:xx」の部分に表示されているMACアドレスは、VirtualBoxのネットワークの設定で、アダプターの高度な設定を開いたときに確認できるMACアドレスになっています。これによりNATとホストオンリーアダプターの区別が付きます。

CentOS7.2 64bit インストール後にVirtualBoxでNAT、ホストオンリーアダプターに変更する場合のネットワークの設定 | kakiro-web カキローウェブ

⇧  上記サイト様によりますと、「enp0s3」は「ブリッジアダプター」で、ブリッジアダプターのネットワークインターフェイスがOSの起動時にネットワークの接続を自動で行ってしまうのが問題だったようです。

ブリッジアダプターのネットワークインターフェイスがOSの起動時にネットワークの接続を自動で行わないように設定。 

nmcli connection modify enp0s3 connection.autoconnect no

f:id:ts0818:20180324202355j:plain

しまった、スーパーユーザー(rootユーザー )で実行せんと駄目だった。

f:id:ts0818:20180324202824p:plain

 で、ネットワークの再起動で変更を反映しようとしたらば、

systemctl restart network.service

f:id:ts0818:20180324203951p:plain

まったく処理が進まなくなっちまいました。

仕方ないので、もう一つコマンドプロンプトを起ち上げて、ip a ってコマンド入力したら、処理が止まってたコマンドプロンプトが動き出しましたが、慌ててて問題の起こってたコマンドプロンプトをすぐ閉じてしまった....。

f:id:ts0818:20180324205858j:plain

⇧  上記のlink/etherの横の2桁づつ「:」で区切られてる英数字(モザイクかかってるけど)が、MACアドレスになるらしいです。

enp0s3が沈黙してるんですが、VirtualBoxを確認したところ、停止されたのは「NAT」でした...。

f:id:ts0818:20180324220935j:plain

enp0s8のほうは、「ホスト・オンリー・アダプター」ですね。

f:id:ts0818:20180324220947j:plain

いまさらだけど、「NAT」「ホスト・オンリー・アダプター」「ブリッジアダプター」の違いって...?

d.hatena.ne.jp

⇧  上記サイト様が分かりやすいです。

zorinos.seesaa.net

⇧  上記サイト様は図解してくれています。

 

結局どういうネットワーク設定にすれば?

http://www.oracle.com/technetwork/jp/database/enterprise-edition/documentation/sionvbox-db12101onol6u4-2080482-ja.pdf

⇧  ORACLEVirtualBoxのネットワーク設定は、「ホスト・オンリー・アダプター」ってなってたので、「ホスト・オンリー・アダプター」のみでいってみますか。

いま、enp0s8の「ホスト・オンリー・アダプター」だけになってるからいけるのでは?

f:id:ts0818:20180324223130p:plain

駄目でした。

www.cosol.jp

⇧  上記サイト様を参考に、原因を探っていきます。tnsnames.ora を開いてみたら、

f:id:ts0818:20180324223951p:plain

⇧  コメントアウトされてない行が多い...ひどっ。

 

このtnsnames.oraファイルは、ローカル・ネーミング・メソッドの接続記述子にマップされるネットワーク・サービス名、またはリスナーのプロトコル・アドレスにマップされるネット・サービス名が含まれた構成ファイルです。

ネット・サービス名は、 接続記述子に含まれているデータベース・ネットワーク・アドレスにマップされる別名です。接続記述子には、プロトコル・アドレスによるリスナーの位置、および接続先データベースのサービス名が含まれています。(他のデータベース・サーバーのクライアントである)クライアントとデータベース・サーバーは、アプリケーションとの接続時にネット・サービス名を使用します。

tnsnames.oraファイル内のローカル・ネーミング・パラメータ

⇧   ここを参考に設定していくしかないわけだけど、

<alias>= [ (DESCRIPTION_LIST =  # Optional depending on whether u have
                                # one or more descriptions
          (DESCRIPTION=
            [ (SDU=2048) ]      # Optional, defaults to 2048
                                # Can take values between 512 and 32K
            [ (ADDRESS_LIST=    # Optional depending on whether u have
                                # one or more addresses
                                # If there is just one address, unnecessary ]
              (ADDRESS=
                [ (COMMUNITY=<community_name>) ]
                (PROTOCOL=tcp)
                (HOST=<hostname>)
                (PORT=<portnumber (1521 is a standard port used)>)
              )
              [ (ADDRESS=
                  (PROTOCOL=ipc)
                  (KEY=<ipckey (PNPKEY is a standard key used)>)
                )
              ]
              [ (ADDRESS=
                  [ (COMMUNITY=<community_name>) ]
                  (PROTOCOL=decnet)
                  (NODE=<nodename>)
                  (OBJECT=<objectname>)
                )
              ]
              ... # More addresses
            [ ) ] # Optional depending on whether ADDRESS_LIST is used or not
            [ (CONNECT_DATA=
              )
            ]
            [ (SOURCE_ROUTE=yes) ]
          )
          (DESCRIPTION=
            [ (SDU=2048) ]      # Optional, defaults to 2048
                                # Can take values between 512 and 32K
            [ (ADDRESS_LIST= ]  # Optional depending on whether u have more
                                # than one address or not
                                # If there is just one address, unnecessary
              (ADDRESS
                [ (COMMUNITY=<community_name>) ]
                (PROTOCOL=tcp)
                (HOST=<hostname>)
                (PORT=<portnumber (1521 is a standard port used)>)
              )
              [ (ADDRESS=
                  (PROTOCOL=ipc)
                  (KEY=<ipckey (PNPKEY is a standard key used)>)
                 )
              ]
              ...               # More addresses
            [ ) ]               # Optional depending on whether ADDRESS_LIST
                                # is being used
            [ (CONNECT_DATA=
                (SID=<oracle_sid>)
                [ (GLOBAL_NAME=<global_database_name>) ]
              )
            ]
            [ (SOURCE_ROUTE=yes) ]
          )
          [ (CONNECT_DATA=
              (SID=<oracle_sid>)
              [ (GLOBAL_NAME=<global_database_name>) ]
            )
          ]
          ...   # More descriptions
        [ ) ]   # Optional depending on whether DESCRIPTION_LIST is used or not

これ、どう設定すれば?って感じですね。何が欲しくて何が要らないのか...。

0:00過ぎたし、ちょっと疲れたので、明日へ持ち越しで。

 

で、翌日、 公式の説明だと、

net_service_name= 
 (DESCRIPTION= 
   (ADDRESS=(protocol_address_information))
   (CONNECT_DATA= 
     (SERVICE_NAME=service_name))) 

が最低限、必要な情報ということですかね。protocol_address_informationは、

protocol_address_information=(PROTOCOL=[通信プロトコル])(HOST=[ホスト名またはIPアドレス])(PORT=[ポート番号])

といった構造で、なんとなくどんな値をセッティングするか予測はつきそうですが、net_service_name、service_nameに指定する値はどうすれば?

サービス名=SERVICE_NAMEということで良いと仮定すると、

データベースの論理的表現で、クライアントに対してデータベースはこの形式で表現されます。サービス名は、インストールまたはデータベースの作成時に入力された、データベース名とドメイン名の組合せであるグローバル・データベース名の文字列です。グローバル・データベース名がわからない場合は、初期化パラメータ・ファイルのSERVICE_NAMESパラメータの値から確認できます。

サービス名は、接続記述子接続データ部分に含まれています。

Oracle® Database Net Services管理者ガイド 12c Release 1 (12.1) 用語集

ということで、『テキスト形式のpfile(初期化パラメータ・ファイル) ==  init[ORACLE_SID].ora』の「SERVICE_NAMES」の値を確認すれば良さそうです。

net_service_nameは、

ネット・サービス名は対応する文字列の内容がtnsnames.ora ファイルに設定される。
慣習として、データベース名やSIDがそのまま設定されることが多いが、実際にはユーザの任意で決めることができる。

ネットサービス名 - 解決!ORACLE!

www.noguopin.com

⇧  上記サイト様によると、適当で良いようです。

 

で、vagrant upで仮想マシンを起ち上げたところ、

はい、エラー。どうやら仮想マシンに接続できずにタイムアウト

f:id:ts0818:20180325142440p:plain

お察しの通り、ネットワークの設定を変更したことによる影響かと。

vagrantが「Adapter1: nat(停止してしまったenp0s3)」でssh接続を試みてるようです。

f:id:ts0818:20180325142751p:plain

 

Vagrantのネットワークについては、

labs.septeni.co.jp

⇧  上記サイト様が詳しいです。

 

で、どうすべきか?

とりあえず、開発環境ということで、ゲストOSでも外部ネットワークが利用できるように、NATは使えるようにしたいですね。

VirtualBoxを起動してみたら、

f:id:ts0818:20180325155237p:plain

⇧  仮想マシン自体は起動しているようです。だが、しかし、

f:id:ts0818:20180325155513p:plain

⇧  vagrant sshでアクセスできない。vagrant使わずに、普通のsshでは?

f:id:ts0818:20180325155832p:plain

⇧  接続できてしまう...え~!

f:id:ts0818:20180325161334j:plain

とりあえず、enp0s8(自分の場合ですと、「ホスト・オンリー・アダプター」)でつながってるってことですかね。

全然関係ないけど、いままでvagrant sshでログインしてからじゃないと、スーパーユーザー(rootユーザー)に切り替えれないと思い込んでましたが、普通のsshでログイン後に、「su -」でパスワード(vagrantで作成した仮想マシンの場合、デフォルトでは、vagrantでいけるかと。)入力して切り替えれてたという...(涙)

f:id:ts0818:20180325162305p:plain

⇧  スーパーユーザー(rootユーザー)になれたので、NAT(自分の場合ですと、enp0s3)を有効に戻しますか。 

nmcli connection modify enp0s3 connection.autoconnect yes

f:id:ts0818:20180325163238p:plain

NATが復活しました。

f:id:ts0818:20180325163701j:plain

vagrant sshもつながるようになりました。

f:id:ts0818:20180325163959p:plain

 

長らく脱線してしまいましたが、$ORACLE_HOME/network/admin/tnsnames.oraを編集していきますか。 

その前に、サービス名を確認しておきます。まずは、$ORACLE_HOMEの場所を...

f:id:ts0818:20180325170457p:plain

 ⇧  おんや?環境変数が消えてる?失礼しました...ユーザーがoracleになってませんでした。

f:id:ts0818:20180325171136p:plain

⇧  あんれ?oracleユーザーでも駄目? 

f:id:ts0818:20180325171255p:plain

⇧  /home/oracleに移動しても変わらず...「姉さん、事件です」 

まぁ、待ちんしゃい。/home/oracle/.bash_profileを開いてみたら良かとですね。

f:id:ts0818:20180325171716p:plain

あんら、設定されてる...設定が反映されてないですね。

f:id:ts0818:20180325171919p:plain

teratail.com

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

原因は、/home/oracle/.bash_profileはoracleユーザーのログイン時にしか反映されないからだと言えそうです。

つまり、oracleユーザー以外でログインした場合は、/home/oracle/.bash_profileが反映されず、その後、ユーザーをoracleに切り替えたとしても、ログインは他のユーザーで済んでしまっているので、ってことですかね。

f:id:ts0818:20180325173439p:plain

⇧  oracleユーザーでログインした場合だと、/home/oracle/.bash_profileが反映されています。

まぁ、また脱線してしまいましたが、$ORACLE_HOME/dbs/init[ORACLE_SID].oraのservice_nameを確認しますか。

f:id:ts0818:20180325175002p:plain

f:id:ts0818:20180325175124p:plain

⇧  はい、そんな設定値はありませんでした。予想通りの展開と言いますか、pfile(初期化パラメータ・ファイル)に設定値がない場合のことも考慮した情報が欲しいっすね。

で、どうすれば?sqlplus使うしかないかと。サービス名の確認。ORCLですね。

show parameter service_name

f:id:ts0818:20180325195352p:plain

ドメイン名の確認。空っぽですね。

show parameters db_domain

f:id:ts0818:20180325195826p:plain

インスタンス名の確認。ORCLですね。

select instance_name from v$instance;

f:id:ts0818:20180325200018p:plain

データベース名の確認。ORCLですね。

show parameter db_name

f:id:ts0818:20180325200154p:plain

ORACLEインスタンスとDBは起動した状態で、一旦、ログアウト。

f:id:ts0818:20180325200503p:plain

そんでは、$ORACLE_HOME/network/admin/tnsnames.ora を編集。

f:id:ts0818:20180325200804p:plain

まずは、「#tailored to the user's needs」以降を削除します。「i」キーでINSERTモードになって、最終行まで一回カーソルで移動しておいたほうが良いかも。(コマンドプロンプトだと、そうしないと全行表示されないっぽい。)

f:id:ts0818:20180325201006p:plain

一旦、「Escキー」でINSERTモードを解除して、

itengine.seesaa.net

⇧  上記サイト様を参考に、削除したい範囲の開始位置で、「ms」と入力し、削除したい行の最終行で「me」と入力したら、

:'s,'ed

で、選択範囲を削除できます。

f:id:ts0818:20180325203400p:plain

 f:id:ts0818:20180325201629p:plain

そしたらば、IPアドレスやサービス名などはご自分の環境に合わせていただく感じで、下記を追記します。

orclTest= 
 (DESCRIPTION= 
   (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.33.10)(PORT=1521))
   (CONNECT_DATA= 
     (SERVICE_NAME=ORCL)))

f:id:ts0818:20180325203538p:plain 

保存したらば、リスナーを起動してみます。 

f:id:ts0818:20180325204611j:plain

う~ん、enp0s8(「ホスト・オンリー・アダプター」)のほうのIPアドレスにアクセスして欲しいんですが、enp0s3(「NAT」)のほうのIPアドレスに行ってしまう。

 

時間的に厳しいんで、来週に持ち越し。

一旦、ORACLEインスタンスとかを停止しようとして、間違って「SHUR」って入力したらシャットダウンされてしまった...不安になりますな。

f:id:ts0818:20180325223256p:plain

とりあえず、一旦、仮想マシンを停止。

qiita.com

⇧  上記サイト様を参考に、VirtualBoxのコマンドで停止しようとして怒られる。バージョンによってオプションが変わってるようです。

f:id:ts0818:20180325224707j:plain

d.hatena.ne.jp

⇧  上記サイト様が詳しいです。

ちなみに、ACPIについては、

ソフトによるパソコンさんの電源管理に関する決まり事(規格)の1つが「ACPI(エーシーピーアイ)」です。
Advanced Configuration and Power Interface(アドバンスド・コンフィグレーション・アンド・パワー・インターフェイス」の略で「ACPI」ですが、別に覚える必要はありません。

ACPIとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

上記サイト様が詳しいです。

では、シャットダウンの開始

VBoxManage controlvm CentOS7.4 acpipowerbutton

f:id:ts0818:20180325230859p:plain

この状態で既に仮想マシンが止まってるようだけど。

f:id:ts0818:20180325230929p:plain

電源OFF。

VBoxManage controlvm CentOS7.4 poweroff

f:id:ts0818:20180325231034p:plain

⇧   う~ん、acpipowerbuttonもpoweroffもシャットダウンするにはどっち使っても良いんですかね?

 

ご無沙汰です、再開ですよ~。

ワシもインドで考えたわけです。(嘘です、自宅で考えてます。)

ネットワークを勉強していかねばならんちゅうことですかね。

yudoufu.hatenablog.jp

⇧  上記サイト様によると、今回のようにVirtualBox仮想マシンにネットワークが2つある状態だと、設定をちゃんとしてあげないとマズイようです。

CentOS7系からは、ネットワークの設定を行う場合、NetworkManager というものを利用していくことが推奨されているようですが、

  • nmcliコマンド(CUI
  • nmtui(GUIで操作できる)

のどちらかを利用していくのが一般的のようです。 

thinkit.co.jp

⇧  上記サイト様が詳しいです。

 

そして、nmcliコマンドの詳細については、

www.atmarkit.co.jp

⇧  上記サイト様が詳しいです。

で、さっそくいろいろ試してみると、

f:id:ts0818:20180331141145p:plain

f:id:ts0818:20180331141324p:plain

なんか、DNSに設定されてるIPアドレスが、NATのものになっていますが....

CentOS 7において、参照先のDNSサーバーのIPアドレスNICに設定されている場合、デフォルトでは、/etc/resolv.confファイルが自動的に更新されるようになっています。しかし、環境によっては、NICの参照先DNSサーバーのIPアドレスの変更に伴う/etc/resolv.confファイルの自動更新を無効にしたい場合があります。

CentOS 7のネットワーク管理基礎(前編) | Think IT(シンクイット)

⇧  上記サイト様によると、自動更新される設定になってるそうです。

そもそも、DNSサーバーにはどちらのIPアドレスを設定するのが良いか分からんですね。そして、Oracleのリスナーに、このへんの設定って影響してるんですかね?

コマンド自体は、/usr/bin/ にあるようですね。

f:id:ts0818:20180331173112p:plain

 

まぁ、結論から言いますと、「LOCAL_LISTENER 」というものがDBに登録されていなかったという話らしいです、たぶん。(違ってました、DNSも関係してたっぽいです。)

Oracle Net Configuration Assistantを利用してリスナーを構成することが一般的らしいんですが、このとき、DBに「LOCAL_LISTENER 」も一緒に登録されてるのではないかと。

で、今回、Oracle Net Configuration Assistantを使わずにリスナーを構築しようとして、

  • listener.ora
  • tnsname.ora

が、最低限あればいけると思っていたんですが、 

  • listener.ora
  • tnsname.ora
  • DBへ「LOCAL_LISTENER 」が登録されていること

が、最低限の構成っぽいですね。このへんの説明なさすぎてむちゃくちゃハマりました。(Oracle Net Configuration Assistantを利用すればすんなりいくんでしょうけど。)

 

で、「LOCAL_LISTENER 」どうなのよ?

show parameter local_listener

f:id:ts0818:20180331165305p:plain

⇧  はい、VALUEが空っぽでした。じゃあ、VALUEに何を設定すれば良いかというと、

LOCAL_LISTENERには、Oracle Netローカル・リスナー(このインスタンスと同じシステム上で実行中のリスナー)のアドレスまたはアドレス・リストを解決するネットワーク名を指定します。アドレスまたはアドレス・リストは、TNSNAMES.ORAファイルまたはご使用のシステム用に構成されている他のアドレス・リポジトリで指定されます。

LOCAL_LISTENER

⇧  と仰っております、う~ん、安定の不親切さ。

で、デフォルト値は、

(ADDRESS = (PROTOCOL=TCP)(HOST=hostname)(PORT=1521))

※(hostnameはローカル・ホストのネットワーク名)

ってなってますね。(設定されていなかったけどな!) 

tnsname.oraでリスナーのアドレスを設定している場合は、つまり、

orclTest= 
 (DESCRIPTION= 
   (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.33.10)(PORT=1521))
   (CONNECT_DATA= 
     (SERVICE_NAME=ORCL)))

⇧ のように設定してる場合、「LOCAL_LISTENER 」のVALUEには、ネットワーク・サービス名(net_service_nameで、ここでは、tnsname.oraのorcTestのこと)を設定してあげれば良いようです。

リスナーが複数ある場合は、VALUEにカンマ区切りで複数登録する必要があるようです。

せっかくなんで、デフォルトのLISETNER(PORT=1521)以外のリスナーを、tnsname.oraに追加で設定して、「LOCAL_LISTENER」に複数のリスナーを登録してみたいと思います。

もう一つコマンドプロンプトを起ち上げ、仮想マシンoracleユーザーでログインし、

f:id:ts0818:20180331173603p:plain

f:id:ts0818:20180331173836p:plain

2つ目のリスナーを追加。

f:id:ts0818:20180331173920p:plain

保存したらば、DB接続していたほうのコマンドプロンプトで、

ALTER SYSTEM SET local_listener=orclTest,orclTest2 SCOPE=BOTH;

f:id:ts0818:20180331174632p:plain

 と実行。ALTER SYSTE SETですが、『Oracle Database SQL言語リファレンス12cリリース1 (12.1)』の説明では、

alter_system_set_clause

従来のプレーン・テキストのパラメータ・ファイル(PFILE)を使用してデータベースを起動したか、サーバー・パラメータ・ファイル(SPFILE)を使用してデータベースを起動したかに応じて、現行のインスタンスの多くの初期化パラメータ値を変更できます。Oracle Databaseリファレンス』では、各パラメータの説明で、これらのパラメータが「変更可能」というカテゴリに分類されています。PFILEを使用した場合、変更はインスタンスの存続期間中のみ保持されます。一方、SPFILEを使用してデータベースを起動した場合、SPFILE自体のパラメータの値を変更できるため、後続のインスタンスで新しい値が使用されます。

ALTER SYSTEM

となっていて、 

SCOPE句

SCOPE SCOPE句を使用すると、変更が有効になるタイミングを指定できます。この句の動作は、非CDB、CDBルートまたはPDBのいずれに接続されているかによって異なります。

非CDBまたはCDBルートに接続しているときにALTER SYSTEM文を発行した場合、有効範囲は、データベースの起動に使用したファイルが従来のプレーン・テキストのパラメータ・ファイル(pfile)か、サーバー・パラメータ・ファイル(spfile)かによって異なります。

ALTER SYSTEM

で、SCOPEに指定できるものが、 

SCOPEの値 内容
MEMORY 変更がメモリーで行われ、すぐに有効になり、データベースが停止するまで持続されます。パラメータ・ファイル(pfile)を使用してデータベースを起動した場合、この有効範囲のみを指定できます。
SPFILE 変更がサーバー・パラメータ・ファイルで行われます。新しい設定は、データベースが次に停止し、再起動されたときに有効になります。『Oracle Databaseリファレンス』に変更不可能と示されている静的パラメータ値を変更する場合は、SPFILEを指定する必要があります。
BOTH 変更がメモリーとサーバー・パラメータ・ファイルの両方で行われます。新しい設定はすぐに有効になり、データベースが停止し、再起動された後も持続します。

※ データベースの起動でサーバー・パラメータ・ファイルを使用した場合は、BOTHがデフォルトです。データベースの起動でパラメータ・ファイルを使用した場合は、MEMORYがデフォルトで、これ以外の有効範囲は指定できません。

となっています。 

で、リスナーを起動するも、やっぱりNATのほうのIPアドレスでリスニングされてしまう... 、どうやら、。

f:id:ts0818:20180331185237p:plain

 

ちなみにリスナーをリセットするには、

alter system reset local_listener scope = BOTH sid = '*';

⇧ でいけるようです。

とりあえず、解決できてないけど、一旦、ここまでで、ごめんなさい、時間を見つけて調査します。

何か分かりましたら、追記していきます。 

 

onefact.jp

 

yoshiyatam.hatenablog.com