web-dev-qa-db-ja.com

ORACLE_HOME / Oracle_SID変数-なぜそれらをエクスポートする必要があるのですか?

これがbash/Shellの質問なのかOracleの質問なのかわかりません。私はLinuxとOracle 11gを使用しています。

私は常にOracle_HOMEおよびOracle_SID変数をエクスポートしています。 sqlplusの呼び出しを使用しても問題ありません。

$ PATHに$ Oracle_HOME/binが追加されたPATH変数にあるため、sqlplusを呼び出すことができると思っていました。

=============================================

今日、理由がわからないので、Oracle_HOMEとOracle_SIDの設定を解除して、現在のシェルのローカル変数として宣言することにしました。私のPATHはまだ同じです。 (Oracle_home/binへの絶対パスを含む)

Oracle_HOME =/path/to/Oracle_home Oracle_SID = orcl

シェルからsqlplusを呼び出します。

==============================================

Sqlplusプログラムを見つけることはできますが、Oracle_HOMEを設定する必要があると言って実行することはできません。

[Oracle@SJOAM ~]$ sqlplus
Error 6 initializing SQL*Plus
SP2-0667: Message file sp1<lang>.msb not found
SP2-0750: You may need to set Oracle_HOME to your Oracle software directory
[Oracle@SJOAM ~]$ 

===============================================

私の質問は

1)sqlplusが現在のシェルから実行されているため、sqlplusがOracle_HOMEおよびOracle_SIDを認識できないのはなぜですか?

それは子プロセスとして呼び出され、親プロセス(bash)ローカル変数にアクセスできないためですか?

よろしく、Noob

1
Noob

これは本当にUnix/Linuxの質問ですが、それはOracleに関連しているので、答えます。

Unixでは、システムは「産卵」(または「出産」)と呼ばれるものを最大限に活用します。コマンドを実行すると、親からすべての情報を取得する新しいプロセスが作成されます。基本的に、それは親のコピーです。それは新しいbashシェルであり、その親から与えられたタスクの実行について設定します。

その子プロセスが完了すると、親にコードを返します(成功または失敗)-AFAICR、0は成功、失敗はそれ以外のことです。

したがって、シェル(別名「子」)によって生成された新しいbashプロセスは、元の(つまり、生成または親)bashシェルから変数を取得します。新しいSQLPlus ShellにSQLPlus実行可能ファイルの場所を指定しないと、エラーがスローされます。

通常、Linux/UnixおよびOracleの場合、エラーメッセージは実際に情報を提供します。これは常にそうであるとは限りません! :-)。 Unixについて大笑いしたい場合は、 this を参照してください。 Linux/Unixに公平を期して、それらはそのドキュメントが書かれてから長い道のりを歩んできましたが、それでも読む価値はあります。

したがって、「エクスポート」しない限り、つまり環境の値をすべての子プロセスにフィードしない限り、システムは正しく動作しません。

Andrew Tanenbaumの本 -または現代の優れたテキスト nixen (または * nix )を見てください。そこにはたくさんの情報があります-グーグルだけ nixとプロセス -あなたはもののトラックロードを取得します。

@StringerBellは良い点です。私が働いていた1つのジョブでは、1台のマシンに4つのテストインスタンスがありました。ログインして目的のインスタンスに移動し、oraenv.blue、oraenv.redを実行します...賛否両論があります-どちらのインスタンスがオンになっているかを忘れるのは簡単でした-おそらく、同様にプロンプ​​ト-DBAに戦いの機会を与えるために:-)

3
Vérace

.bash_profileファイルでデフォルトのSIDとOracleホームを設定できます。

Oracle_SID=ORCL; export Oracle_SID
Oracle_BASE=/u01/app/Oracle; export Oracle_BASE
Oracle_HOME=$Oracle_BASE/product/11.2.0/db_1; export Oracle_HOME

変更を保存すると、ログアウトせずにファイルを入手できます。

source .bash_profile

サーバー上に複数のデータベースがある場合、SIDを.bash_profileに含めたくない場合があります。 Oracleユーザーとしてログインした後、ORAENVを使用できます。

source oraenv
Oracle_SID = [ORCL] ?

実際、ORAENVを使用することをお勧めします。これにより、Oracle_HOME環境変数が設定されます。

The Oracle base for Oracle_HOME=/u01/app/Oracle/product/11.2.0/db_1 is /u01/app/Oracle
0
Stringer