技術ブログ
目次
渡部です。10/15に開催した 「出版記念特別企画:黒本著者が解説 ORACLE MASTER Bronze DBA 試験対策セミナー」 に、非常に多くの方にご参加頂きました。ありがとうございました。
オンラインセミナーで取り上げたトピックについて説明しつつ、 それぞれのトピックで頂戴した質問についても、 当日回答できないかったものも含め、 回答してみたいと思います。
記事は前半と後半の2つに分かれています。
歴史ある翔泳社さんの資格対策書籍シリーズである、いわゆる「黒本」の新Bronze DBA版です。 正式な書名は「オラクルマスター教科書 Bronze DBA Oracle Database Fundamentals」です。
この書籍は、2020年2月に開始された新しいORACLE MASTER試験である 「Bronze DBA Oracle Database Fundamentals(試験番号1Z0-085)」 の試験対策書籍です(以下、「新Bronze DBA黒本」と記載)。新Bronze DBA黒本は、2020年10月時点で、1Z0-085試験に対応する唯一の試験対策書籍です。
この試験に合格すると、ORACLE MASTER新体系における資格「ORACLE MASTER Bronze DBA」を取得できます。
詳細は以下をご確認下さいませ。
ORACLE MASTER Bronze DBA 2019試験対策本を執筆しました
黒本の第4章の章構成とポイントは以下の通りです。
リモート接続の流れは以下の通りです。 リスナーは、新規リモート接続を中継する役割を持ちます。
デモでは、リスナーの起動と、リスナーの起動後にデータベースの情報がリスナーに伝わる動作(サービス登録) の様子をお見せしました。
リモート接続の動作を細かく見ると、接続先情報として、以下の3つが必要なことが分かります。
リモート接続時は、ユーザー名/パスワードの後に@に続けて接続識別子を指定します。
リモート接続時のコマンドには接続識別子を指定しますが、 実際のリモート接続処理を実行するためには接続先情報(ホスト名、ポート番号、データベースサービス名)が必要です。
Oracleでは、接続識別子に対応する接続先情報を得る方法をネーミングメソッドと呼びます。
ローカルネーミングとは、クライアントマシン上の設定ファイルtnsnames.oraから接続先情報を得るネーミングメソッドです。
なお、ローカルネーミングの場合、特に接続識別子をネットサービス名と呼びます。
Oracle Net Managerを使用すると、tnsnames.oraにネットサービス名を定義できます。
簡易接続ネーミングとは、接続文字列にすべての必要な接続先情報を指定するネーミングメソッドです。 (接続情報の解決をしていないので、個人的にはネーミングメソッドと呼ぶことに抵抗がありますが・・・)
設定ファイルは不要です。
オンラインセミナーでいただいた質問に回答します。
ある程度事前に予想していたのですが、やはりネットワークについては理解しにくい部分が多いようで、多数の質問を頂きました。
なお、自分の質問が抜けている、質問の主旨を取り違えているなどあれば、 Twitterで@wrcsus4 (私のTwitterアカウント)までご連絡をお願いします。
リモート接続の場合はORACLE_SID環境変数はデータベースサーバー側にある認識で合っていますでしょうか?
クライアントマシンからリモート接続する場合、クライアントマシンのコマンド実行環境(シェル)にORACLE_SID環境変数を設定する必要はありません。ORACLE_SID環境変数はローカル接続で必要な環境変数であるためです。
なお、データベースサーバーのコマンド実行環境(シェル)には、おそらく、ORACLE_SID環境変数が設定されているはずです。なぜなら、データベースサーバーでOracleに接続する場合、一般的にローカル接続を使用するためです。
データベースの情報がリスナーに伝わるまでの時間はパラメータファイルなどで設定可能なのでしょうか?
設定で変更することはできません。ただし、セミナーでは説明しませんでしたが、ALTER SYSTEM REGISTER;コマンドを実行すると手動でデータベースの情報をリスナーに伝達できます(手動でのサービス登録)。
リモート接続でSQL*Plusを使用した際には、「sqlplus ユーザid/パスワード」のみで、接続識別子を付けていた覚えがありません。ユーザは意図せず、他の設定でそれらを保管していた、ということなのでしょうか?
原則的に、リモート接続では接続識別子を指定する必要があります。 このため、質問いただいた状況は考えにくいため、あらためて状況を確認することをお勧めします。
ただし・・・ セミナーではあえて説明しませんでしたが、実は省略も可能なのです。 マイナーすぎて、ほとんど誰も知らない機能なのですが、接続識別子をTWO_TASK環境変数に設定しておくと、 リモート接続で接続識別子の指定を省略できます。
一応以下に実行結果を載せておきます。ただし、繰り返しになりますが、この機能は非常にマイナーです。かつ、知られていないためトラブルの恐れがあります。できる限り使わないことをお勧めします・・・。
$ sqlplus system/Password123@ORCL
SQL*Plus: Release 19.0.0.0.0 - Production on 土 10月 17 21:51:47 2020
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
最終正常ログイン時間: 日 10月 04 2020 23:58:04 +09:00
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL> exit
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0との接続が切断されました。
$ export TWO_TASK=ORCL
$ sqlplus system/Password123
SQL*Plus: Release 19.0.0.0.0 - Production on 土 10月 17 21:51:59 2020
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
最終正常ログイン時間: 月 10月 05 2020 02:02:35 +09:00
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL> exit
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0との接続が切断されました。
$
ホスト名を設定する代わりにIPアドレスを設定してもよいのでしょうか?
リモート接続でIPアドレスで指定するべきでしょうか、ホスト名で指定するべきでしょうか。
Oracle固有の話ではなく、TCP/IPネットワーク一般の話になりますが、ホスト名はIPアドレスと同等と考えてOKです。 よって、ホスト名を設定する代わりにIPアドレスを設定してもよいです。
ただし、この場合、あるホストのIPアドレスが変更がされると設定を変更する必要が出てきますのでご注意ください。
テキストエディタでtnsnames.oraを編集したあとに、Oracle Net Managerからもtnsnames.oraを編集できますか?
もしかしたら細かい例外はあるかもしれませんが、基本的に可能と考えてOKです。 私の経験上、特に問題になったことはありません。
データベースサービス名とは何ですか?
Bronzeレベルでは、データベースサービス名は、DBCAでデータベースを作成したときに指定したグローバルデータベース名と同じと考えてください。
なお、グローバルデータベース名とデータベースサービス名、ORACLE_SIDの関係は以下の通りです。
[ドメイン名を指定した場合]
グローバルデータベース名 : orcl.world
データベースサービス名 : orcl.world
ORACLE_SID : orcl
[ドメイン名を指定しなかった場合]
グローバルデータベース名 : orcl
データベースサービス名 : orcl
ORACLE_SID : orcl
細かい話をすると、必ずしもグローバルデータベース名とORACLE_SIDを対応づける必要はないとか、 1つのデータベースに複数のデータベースサービス名を持たせることができるとか、色々あるのですが、 Bronzeレベルでは理解しなくて良いはずです。
sqlnet.oraファイルの役割について教えてください。
sqlnet.oraファイルはオプションの設定ファイルで、Oracle Netの設定をデフォルトから 変更したい場合に使用します。すくなくともBronzeレベルでは、sqlnet.oraファイルの理解は不要なはずです。
tnsnames.oraにはhost名指定をしていますが、そこから実際のDBサーバへ接続するためにはIPアドレスを知る必要があると思いますが、そこはOS側で/etc/hostsやDNSサーバでの名前解決が必要ということでしょうか?
その通りです。ただし、ホスト名からIPアドレスの解決は、OS側の役割であり、Oracleの役割ではないことに注意してください。
tnsnames.oraでホスト名にlocalhostを記述するのは一般的ですか?
TCP/IP一般の話ですが、localhostとは自ホストに対応するホスト名です。 クライアントアプリケーションが、接続先ホストにlocalhostを指定するということは、 自ホスト内で動作するサーバーアプリケーションに接続することを意味します。
このため、tnsnames.oraでホスト名にlocalhostを指定するということは、 Oracleのクライアントアプリケーションが、自ホスト内で動作するOracleにリモート接続すること(させたいこと)を意味します。
逆に、他ホストで動作するOracleにリモート接続すること(させたいこと)場合は、 tnsnames.oraでホスト名にlocalhostを指定してはいけません。「他ホスト」に対応するホスト名を指定する必要があります。 (厳密に言うと、tnsnames.oraには複数の接続識別子を指定できるので、指定してはいけませんは言い過ぎですが、すくなくとも、そのリモート接続に対応する接続識別子のホスト名にはlocalhostを指定してはいけません。)
もしかすると、この質問は、自ホスト内で動作するOracleにリモート接続する時に、ホスト名としてlocalhostを指定すべきか、それとも、IPアドレス(またはIPアドレスに対応するホスト名)を指定すべきか?という意図かもしれません。
どちらでもよい気がしますが、リモート接続を行う処理部分を、別ホストに移動する可能性がある場合はIPアドレス(またはIPアドレスに対応するホスト名)を指定したほうが良いかもしれません。なお、この話は特にOracle固有の話ではない点、ご理解くださいませ。(TCP/IP一般の話です)
複数DBサーバで同一の接続識別子名が設定されている場合、sqlplus接続する際にどのDBサーバに接続されるのでしょうか? それとも接続識別子名は複数DBサーバで重複してはいけないのでしょうか?
質問の「接続識別子」を、ローカルネーミングにおけるネットサービス名に読み替えて回答します。
ローカルネーミングにおけるネットサービス名の設定がtnsnames.oraであることから明らかと思いますが、 ローカルネーミングにおけるネットサービス名は、マシンごと(マシン個別)に設定します。
SQLPlusを用いてリモート接続する場合、SQLPlusを実行したマシンにあるtnsnames.oraの設定に従って、接続先が決定されます。
クライアントマシンAのtnsnames.oraのネットサービス名ORCLの接続先がホスト1で、 クライアントマシンBのtnsnames.oraのネットサービス名ORCLの接続先がホスト2だった場合の動作は以下の通りです。
上記の通り、マシンが異なれば、同じネットサービス名に対して、別の設定を行うことができます。 (ただし、トラブルの元になるため、そういうことはしないと思いますが)
tnsnames.oraはマシン単位で設定することに注意してください。
以前DBを作成した際にリモート接続にて接続しようとすると接続できない現象が発生しました。 Windowsファイアウォールの受信の規則にてポート番号(1521)を設定する必要がありますか?
Oracleに限定されないTCP/IP一般の話ですが、ネットワーク通信を行うためには、ファイアウォールのブロック対象から除外する必要があります。
Oracleのリモート接続ではデフォルトでTCPの1521ポートを使用します。Oracleのリモート接続で使用するポートを、 ファイアウォールのブロック対象から除外する必要があります。
黒本の第5章の章構成とポイントは以下の通りです。
インスタンスを停止するには、SQL*Plusのshutdownコマンドを使用します。
インスタンスを停止するにはSYSDBA権限が必要です。 事前作成済みユーザーでSYSDBA権限をもつのはSYSユーザーのみです。 SYSTEMユーザーはSYSDBA権限をもたないことに注意してください。
デモでは、SYSTEMユーザーではインスタンスの停止ができない点、 SYSユーザーではインスタンスの停止ができる点をお見せしました。
インスタンスを停止するには、SQL*Plusのstartupコマンドを使用します。
インスタンスを起動するにはSYSDBA権限が必要です。 事前作成済みユーザーでSYSDBA権限をもつのはSYSユーザーのみです。 SYSTEMユーザーはSYSDBA権限をもたないことに注意してください。
デモでは、以下の点をお見せしました。
オンラインセミナーでいただいた質問に回答します。
なお、自分の質問が抜けている、質問の主旨を取り違えているなどあれば、 Twitterで@wrcsus4 (私のTwitterアカウント)までご連絡をお願いします。
バックグラウンドプロセスやSGA(PGA)などありますが、イメージしたり理解できるコツがあればお教え下さい。イマイチ理解に苦しんでいます。
バックグラウンドプロセスは、複数のプロセスの総称です。 それぞれのプロセスには異なる役割があるため、バックグラウンドプロセスひとくくりで特にイメージを持つ必要はありません。 しいて言えば、インスタンス起動時に起動する。程度の理解でよいでしょう。
SGAは、データをキャッシュするための大きなメモリ領域と考えてください。キャッシュされたデータはプロセス間で共有され、性能向上に寄与します。 よって、SGAのサイズを(物理メモリを超えない範囲で)大きくすると、一般に処理性能を向上できます。
なお、SGAのコンポーネントの役割と代表的なバックグラウンドプロセスであるLGWR、DBWnについては、
で説明しています。
PGAは、プロセス専用のメモリ領域です。Bronzeレベルではデータをソートする際に使用するメモリ領域。程度の理解でOKのはずです。
SGAとプロセス数・セッション数はどう関係あるのでしょうか。
直接の関係はありませんが、セッション数が大きいシステムは一般に負荷が大きいため、 (メモリサイズなどが大きい)強力なハードウェアを持つデータベースサーバーが必要になるはずです。
ですので、SGAとプロセス数・セッション数にはある程度の相関関係があると考えられます。ま、直接の関係はありませんけどね。しいて言えば、そういう傾向ということです。
なお、この質問と関連して、トラブル動作に関する質問も頂戴していましたが、トラブル動作については、 実際の状況を見ない限り回答は困難です(状況次第なので)。ご理解くださいませ。
黒本の第6章の章構成とポイントは以下の通りです。
セミナーでは、記憶域の構造を中心に解説しました。
表領域はデータファイルをグループ化したものです。
以下に2つのデータファイルで構成した表領域のイメージ図を示します。
データファイルはブロック単位で使用されます。ブロックは、2~18KBの固定サイズの領域(通常8KB)です。
Oracleでテーブルなどに記憶域を割り当てるときは、格納先となる表領域を指定します。
テーブルなどを表領域に作成すると、その表領域を構成するデータファイルから記憶域(端的に言うとブロック)が割り当てられます。
記憶域割り当ての仕組みを、より詳細に理解するには、 表→セグメント→エクステント→ブロックの関係を理解する必要があります。
オブジェクトとセグメントは、1対1に対応します(一部のオブジェクトを除く)。
セグメントは、特定の表領域に保管されます。
セグメントは、1つ以上のエクステントから構成されます。
エクステントは、1つのデータファイル内の連続した複数のブロックから構成されます。
データファイルはブロック単位で使用されます。
索引でも同様の仕組みで記憶域が確保されます。
下の図で、エクステント同士が重なり合っていないことに注意しましょう。 すなわち、異なるオブジェクトに同じブロックが割り当てられることはありません。
よくよく考えればこれは当たり前です。 異なるオブジェクトに同じブロックが割り当てられると、 表のデータを更新すると索引が破壊されるような動作になってしまいますから。
オンラインセミナーでいただいた質問に回答します。
なお、自分の質問が抜けている、質問の主旨を取り違えているなどあれば、 Twitterで@wrcsus4 (私のTwitterアカウント)までご連絡をお願いします。
表の作成時に表領域の指定は必須ですか?
いいえ、必須ではありません。 省略した場合、表はユーザーのデフォルト表領域に格納されます。
OSも物理的に容量が足りなくなった場合にDBは壊れますか?
データベースは破損しません。ただし、それ以上データの追加ができなくなったり、 データの更新ができなくなったりします。
新体系ORACLE MASTER 2019の変更点と留意点 – 18c/19c対応
ORACLE MASTER Platinumとは何か / コーソルはPlatinum取得者数No.1!