Oracle

ORACLE_HOME/ORACLE_SID 變數 - 為什麼我們需要導出它們?

  • August 4, 2015

我不確定這是 bash / shell 問題還是 oracle 問題。我在linux和oracle 11g上。

我總是導出我的 ORACLE_HOME 和 ORACLE_SID 變數,例如使用呼叫 sqlplus 是沒有問題的。

我以為可以呼叫 sqlplus 是因為它在我的 PATH 變數中 $ ORACLE_HOME/bin added to $ 小路。

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

今天,不知道為什麼,我決定取消設置 ORACLE_HOME 和 ORACLE_SID 並將它們聲明為我目前 shell 的局部變數。我的 PATH 還是一樣的。(包含 oracle_home/bin 的完整路徑)

ORACLE_HOME=/path/to/oracle_home ORACLE_SID=orcl

我從 shell 呼叫 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無法知道ORACLE_HOME和ORACLE_SID,因為它是從目前shell執行的?

是因為它被作為子程序呼叫,因此無法訪問父程序(bash)局部變數嗎?

問候, 菜鳥

這確實是一個 Unix/Linux 問題,但它確實與 Oracle 有關,所以我會給出一個答案。

在 Unix 中,系統充分利用了所謂的“產卵”(或“分娩”)。當您執行命令時,將創建一個新程序,該程序從父程序獲取其所有資訊。本質上,它是父級的副本——它是一個新的 bash shell,然後開始執行其父級賦予它的任務。

當該子程序完成時,它會向父程序返回一個程式碼(成功或失敗)-AFAICR,-0 是成功,失敗是其他任何東西。

因此,由您的 shell(也稱為“子”)生成的新 bash 程序從您的原始(即生成或父)bash shell 中獲取其變數。如果您不告訴新的 SQLPlus shell 在哪裡可以找到 SQLPlus 執行檔,那麼它將引發錯誤。

對於 Linux/Unix 和 Oracle 來說,錯誤消息實際上是非常有用的。這並非總是如此!:-)。如果您想對 Unix 開懷大笑,請閱讀. 公平地說,Linux/Unix 自該文件編寫以來已經取得了長足的進步,但仍然值得一讀。

因此,除非您“導出”——即將環境的值提供給所有子程序——否則您的系統將出現異常。

看看Andrew Tanenbaum 的書——或者任何關於現代Unixen(或*nix)的好書。那裡有很多資訊——只有 Google Unix 和程序——你會得到一大堆東西。

@StringerBell 提出了一個很好的觀點。在我從事的一項工作中,我們在一台機器上有 4 個測試實例。我們會登錄,然後轉到我們想要的實例並執行 oraenv.blue、oraenv.red… 有利也有弊 - 很容易忘記哪個實例在執行 - 更改也提示 - 給 DBA 一個戰鬥的機會 :-)

您可以在 .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

引用自:https://dba.stackexchange.com/questions/109001