一個看似詭異的Oracle連線問題

jeanron100發表於2017-08-03

   我們知道Oracle在啟動的時,fork程式會根據ORACLE_SID來建立相關後臺程式,而在Unix和Linux系統中,ORACLE SID和ORACLE_HOME在一起雜湊後會得到一個唯一的值作為SGA的key。

   所以我丟擲一個蠻有意思的問題,在同一臺伺服器上,存在10g,11g多個ORACLE_HOME,是可以建立多個同名的Oracle例項,而如果在同一個使用者下(比如作業系統使用者是oracle),是否可能建立出兩個同名的例項來?

   我想你的腦海中已經有了答案。我換一個角度來說明是否可以。透過一個蠻有意思的DG配置問題。

  我在使用RMAN的duplicate搭建備庫的時候丟擲了下面的一個錯誤。

RMAN> duplicate target database for standby from active database nofilenamecheck;
Starting Duplicate Db at 2017-08-03 10:40:42
RMAN-03002: failure of Duplicate Db command at 08/03/2017 10:40:42
RMAN-05501: aborting duplication of target database
RMAN-06403: could not obtain a fully authorized session
RMAN-04006: error from auxiliary database: ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory

看錯誤很明顯,備庫是被啟動,找不到記憶體結構了。

但是實際上檢視資料庫程式,是沒有問題的。

而我根據服務名嘗試連線,下面的結果讓我大跌眼鏡。

sqlplus sys@s2Queuedb as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Thu Aug 3 10:41:53 2017
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Enter password:
Connected to an idle instance.

這是哪裡的問題呢,是不是例項名有大小寫的拆吧呢,在我的印象中似乎沒有。那我索性就在這個視窗下嘗試啟動,沒想到還真起來了一個新的例項。

SQL> startup nomount
ORACLE instance started.
Total System Global Area 9620525056 bytes
Fixed Size                  2261368 bytes
Variable Size            2248150664 bytes
Database Buffers         7348420608 bytes
Redo Buffers               21692416 bytes

你看這下同一個使用者下有兩個同名的例項了。

$ ps -ef|grep smon|grep -v grep
oracle    43259      1  0 10:39 ?        00:00:00 ora_smon_Queuedb
oracle    43337      1  0 10:44 ?        00:00:00 ora_smon_Queuedb

到了這裡,不要以為是bug,也不要認為以前的這些基礎知識都不奏效了。我們梳理一下思路。

首先ORACLE_SID是統一的,是同一個,而不同之處就是ORACLE_HOME了。而這個資料庫環境我只安裝了一個版本的資料庫環境,所以不存在多個ORACLE_HOME,所以這個問題讓我很糾結,我們繼續來看看ORACLE_HOME的情況,可以檢視環境變數的值。

$ cat /proc/43259/environ |xargs -0 -n1 |grep ORACLE_HOME
ORACLE_HOME=/U01/app/oracle/product/11.2.0.4

檢視另外一個例項的ORACLE_HOME變數的值。

$ cat /proc/43337/environ |xargs -0 -n1 |grep ORACLE_HOME
ORACLE_HOME=/home/U01/app/oracle/product/11.2.0.4

到了這裡,似乎有了眉目,原來是ORACLE_HOME不一樣。

而問題到了這裡還是有些奇怪,因為/home/U01和/U01是指向的同一個目錄。他們代表的含義是一樣的。

lrwxrwxrwx    1 root root     9 Aug  1 17:53 U01 -> /home/U0

這個問題到了這裡該這麼解釋呢,我們繼續理一下思路。我們在RMAN使用duplicate的時候是使用TNS連線方式的,那麼TNS連線在連線本地例項的時候指向了另外一個例項(儘管剛開始這個例項不存在),那麼本地的連線配置其實還是在listener.ora裡面。

開啟靜態註冊的內容,這樣一看就很清楚了。

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = Queuedb)
      (ORACLE_HOME = /home/U01/app/oracle/product/11.2.0.4)
      (SID_NAME = Queuedb)
    )
  )

所以瞭解了這個問題,我們可以換個思路想想有什麼場景可以把這個特點發揚光大,在一些特定的場景中起到神助攻的作用。

至少在之前的資料遷移中,我是使用多個版本的ORACLE_HOME來達到同伺服器多例項的切換,能夠極大的提高資料遷移的效率。





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2143055/,如需轉載,請註明出處,否則將追究法律責任。

相關文章