??? 摘要:大家都知道, oracle 9i RAC(以下簡稱RAC)是oracle里相對比較復雜的部分,很大一部分原因是由于RAC的環境搭建相對不如單實例方便。通常典型的 配置 是兩臺主機加一臺存儲,但是平常我們個人如果想在家研究測試RAC的話,很少會去購買這么多設備來做測試的。幸好,我們有 VMware GSX Server (以下簡稱VMware),通過使用這款非常好的 虛擬機 模擬工具,我們可以在一臺PC電腦上模擬出多臺主機加存儲的這樣一個RAC環境。
??? 本文首先簡要介紹了RAC的原理,隨后著重詳細敘述了如何在一臺PC電腦上,使用VMware構建兩臺 RedHat Linux ?AS3(以下簡稱AS3),并虛擬一個共享存儲,創建裸設備,最后在實現RAC的搭建。
??? 1.RAC簡介
??? 簡單來說,RAC就是位于多個主機(通常都稱為節點)上的多個oracle實例同時管理一個 數據庫 。數據庫必須放在共享存儲設備上,包括數據文件、控制文件、聯機日志以及spfile都必須放在共享存儲上,這樣每個節點才能同時訪問存儲設備。每個節點之間通過高速光纖互相連接,并同步內存數據。oracle在管理不同實例里的內存里的 數據結構 ,同時要最大程度的降低I/O,引入了全局緩沖服務(GCS:Global Cache Service),同時還引入了全局鎖定服務(GES:Global Enqueue Service)用來在不同節點之間通訊時進行同步管理。這些服務都是通過一組特殊的后臺 進程 完成的,這些后臺進程主要包括:
??? (1)global cache service processes(LMSn):n從0到9,具體由信息傳輸的數量決定。用來控制信息到其他實例的流向,同時還管理對全局數據塊的訪問。LMSn進程同 樣在不同實例的數據塊緩存(buffer cache)里傳遞數據庫鏡像(block image)。該進程是Cache Fusion特性的一部分。
?(2)global enqueue service monitor(LMON):監控全局鎖定(global enqueues)及其資源,并提供global enqueues資源的恢復操作。enqueues是用來進行串行化行更新的共享的內存結構。
??? (3)global enqueue service daemon(LMD):管理對全局鎖定(global enqueues)以及全局資源的訪問。在每個實例中,LMD進程對傳入當前實例的對其他資源的訪問請求進行管理。
??? (4)lock process(LCK)管理non-Cache Fusion資源的請求,比如library cache或row cache的請求。
??? (5)diagnosability daemon(DIAG):獲得實例中有關進程失敗的診斷信息。該daemon的操作是自動的,并且它會更新alert<SID>.log文件,以記錄它所做的動作。
??? 注意:cache fusion表示一種在RAC里的非磁盤交互方式的內存同步機制。該機制使得獲得block的實例能夠將block直接從內存轉移到需要該block的實 例的SGA里去。這樣,由于減少了磁盤交互,所以將block從一個實例轉移到另一個實例的性能提高很多。而且管理也更加簡便。
??? RAC能夠對客戶端的連接請求進行 負載均衡 , 把所有客戶的連接盡可能的平均分布在不同的實例上。同時,RAC還提供failover的功能,也就是說如果其中一個節點發生意外,只要這個時候連在該損 壞節點上的session沒有正在進行事務運行,則該session不需要退出后重新登錄,oracle會自動將該session連接到一個可用的節點 上,從而保證了7×24應用的安全性和穩定性。
??? 不過,RAC不提供容災的功能,也就是說如果共享存儲損壞,仍然會導致整個應用崩潰。所以,需要采用其他容災方案結合使用,比如RAC+DataGuard等。
??? 2.準備工作
??? VMware GSX Server:筆者測試所使用的是3.2版本,建議使用3.2及以上的版本。
??? Linux:筆者使用的是RedHat Linux AS3。請使用AS2.1以上版本的linux。因為AS2.1以下的版本如果要
??? 支持RAC需要進行很多額外的配置,比如watchdog之類的,到了AS2.1以后缺省都不使用了,而是使用hangcheck,如果要使用watchdog,需要進行很多不必要的配置。安裝介質可以是光盤,也可以是ISO文件。筆者使用的是ISO文件。
??? Oracle:筆者使用的是oracle 9204 for linux,可以直接從oracle的官方網站上下載。筆者是從oracle官方網站上下載下來的三個壓縮包。
??? 主要的準備工作就是這些,當然安裝過程中可能還會需要其他的一些軟件,比如plainmaker等。在需要的時候,筆者也會說明如何使用這些軟件的。
?
? 3.安裝虛擬節點
??? 3.1 創建虛擬節點
??? VMware 安裝好以后,進入主界面,我們就可以創建兩個虛擬節點。點擊File->New Virtual Machine…,在打開的窗口中,在選擇所安裝的 操作系統 時,我們選擇 RedHat Enterprise Linux 3,其他都選擇缺省值,點擊next,一直到讓你輸入disk size時,缺省事4G,我們改成8G,最后點擊finish。這樣就創建好了一個虛擬節點,取名為linux1。同樣的方法,我們創建第二個虛擬節點,取名為linux2。
??? 3.2安裝linux
??? 創建完兩個虛擬節點以后,我們要開始安裝linux了。在窗口的左邊的Inventory框里,右鍵節點linux1,選擇virtual machine settings…,在彈出的框中,我們選中CD-ROM,然后選擇Use ISO Image,并輸入相應的linux安裝介質的第一個ISO文件的位置,如下圖所示。選擇ok以后,點擊Power->Power On,相當于為節點
???
點擊查看大圖
?加電,剩下的工作與在單PC機器上安裝linux過程一樣。這里提一點,就是在給 磁盤分區 時, 如果不使用LVM,那么在分區時,/boot給120M,/swap給256M,/給2900M,然后再創建一個/oracle,把剩下的空間都給 /oracle。在安裝過程中,當提示需要換另外一張盤時,你只要再次進入圖一所示界面,更改ISO文件并確定以后,再進入 虛擬機 ,選擇提示中的ok即可。同樣的方法,我們可以安裝好另外一臺虛擬機上的linux。
??? RAC里每個節點都需要兩塊網卡并使用固定ip,一塊作為兩個節點互相內部 通信 用, 另外一塊作為外部連接用。我們同樣的,選擇linux1,進入圖一界面,選擇add按鈕,然后選擇Ethernet Adapter,然后都選擇缺省值并點擊next直到結束。這樣就為linux1添加了第二塊網卡。同樣的方法為linux2添加第二塊網卡。分別啟動兩 個節點以后,我們在linux為網卡配置 ip地址 。筆者的配置是linux1的內部通信ip為:134.251.0.140,外部通信ip為:134.251.114.141。而linux2的內部通信ip為:134.251.0.141,外部通信ip為:134.251.114.140。
??? 4.安裝共享磁盤
??? 4.1 創建共享磁盤
?在VMware里,共享磁盤需要使用plainmaker.exe這個工具來創建。可以到VMware GSX Server 的安裝目錄下找該工具是否存在。如果不存在,則可以到 google 上搜索。很多站點提供該工具的下載。進入命令提示符,輸入下面的命令來創建共享磁盤。
??? C:\>plainmaker D:\virtualos\sharedisk.pln 2048m
??? 該命令運行以后,就會在D:\virtualos目錄下創建一個名位sharedisk.pln的共享磁盤,大小為2G。
??? 4.2 添加共享磁盤
??? 共享磁盤安裝好以后,我們需要把它加入到前面安裝好的兩臺linux虛擬機里。選擇linux1,仍然進入到圖一所示的界面里,選擇左邊的add按鈕,在彈出的框中,選擇Hard Disk,并點擊next,選擇方式如下面圖二
??? 所示,并點擊next,輸入我們剛才創建的共享磁盤名:D:\virtualos\sharedisk.pln,然后不要點擊finish,要點擊 advanced,選擇磁盤為SCSI 1:0。如下圖三所示。最后點擊finish。這樣,我們就為linux1節點添加了共享存儲。隨后,我們用同樣的方法為linux2節點也添加該共享存 儲。
???
?
?? 4.3 配置 共享磁盤
?把共享存儲添加到兩個節點以后,還不算完,必須修改兩個 虛擬機 的 配置文件 。在每個節點所在目錄下都存在一個后綴名為vmx的文件,這就是虛擬機的配置文件了,用notepad打開,把下面三行記錄添加進去。注意,這三行中的每一行都不能重復,所以仔細檢查一下vmx文件,確保這三行記錄唯一。每個節點的配置文件都必須添加這三行記錄。
??? disk.locking = FALSE
??? scsi1.sharedBus = "virtual"
??? scsi1:0.mode = "persistent"
??? 到這里,我們才算是為兩個節點都配置好了共享存儲。分別啟動兩個 linux 節點以后,進入linux,我們可以使用如下命令來確定兩個節點是否都能夠找到該存儲了。如果提示出有設備,則表示能夠識別共享存儲。
fdisk –l /dev/sdb
??? 5.設置兩個節點的互相信任機制
??? 由于RAC的節點之間需要完全無障礙的訪問,因此需要設定主機名互相訪問以及互相信任機制。注意:以下所有步驟都必須在兩臺節點上各自完成。
??? 5.1 設置主機名
??? 首先,RAC之間互相不能通過ip來訪問,而必須使用主機名來訪問,因此需要設定hosts內容。筆者設定的是節點linux1的內部訪問主機名為 linux1-prv,而外部訪問節點名為linux1;節點linux2的內部訪問主機名為linux2-prv,而外部訪問節點名為linux2。需 要將這些信息添加到/etc/hosts文件里去,如下所示。注意,要將127.0.0.1原來所對應的linux1改名為localhost。
??? # Do not remove the following line, or various programs
??? # that require network functionality will fail.
??? 127.0.0.1localhostlocalhost.localdomainlocalhost
??? 134.251.114.140 linux1
??? 134.251.114.141 linux2
??? 134.251.0.140linux1-prv
??? 134.251.0.141linux2-prv
??? 同樣的,修改linux2的/etc/hosts文件,也要將127.0.0.1原來所對應的linux2改名為localhost。其他設置與 linux1節點一樣。設置好以后,在linux1上ping linux2,在linux2上也ping linux1,如果都通的話,說明設置無誤。
??? 5.2 設置 telnet 訪問
??? (1)通常缺省都會安裝telnet-client。主要確定是否安裝了telnet-server軟件。
[root@linux1 root]# rpm –qa | grep telnet
??? (2)如果沒有安裝,則從AS3安裝介質上找到該rpm包,并進行安裝。
?(3)安裝好以后,需要啟動telnet服務。輸入以下命令,并從彈出的框中選中telnet后確認。
[root@linux1 root]# ntsysv
??? (4)激活telnet服務
[root@linux1 root]# service xinetd restart
??? (5)設置允許root進行telnet登錄
[root @linux1 /root]# vi /etc/pam.d/login
??? 將authrequiredpam_securetty.so這一行開頭添加#,從而注釋該行。
?
??? 5.3 設置rlogin、rsh
??? 由于在第一個節點上安裝 oracle 軟件時,oracle會自動將第一個節點上安裝完畢的文件拷貝到第二個節點上,因此需要配置rlogin和rsh以及rcp等。
??? (1)確定是否安裝了rsh-server軟件。
<script type="text/javascript"><!--mce:0--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"><!--mce:1--></script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"><!--mce:2--></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"><!--mce:3--></script><script><!--mce:4--></script>[root@linux1 root]# rpm –qa | grep rsh
??? (2)如果沒有安裝,則從AS3安裝介質上找到該rpm包,并進行安裝。
?(3)安裝好以后,需要啟動rsh、rlogin、rexec服務。輸入以下命令,并從彈出的框中選中rsh、rlogin、rexec后確認。
[root@linux1 root]# ntsysv
??? (4)激活rsh、rlongin服務
[root@linux1 root]# service xinetd restart
??? (5)修改/etc/securetty
[root@linux1 root]# echo "rexec" >> /etc/securetty;echo "rlogin"
>> /etc/securetty;echo "rsh" >> /etc/securetty
??? (6)設置允許root進行rsh、rlogin
[root @linux1 /root]# vi /etc/pam.d/rlogin
??? 將authrequiredpam_securetty.so這一行開頭添加#,從而注釋該行。
??? (7)在/etc目錄下建立hosts.equiv文件,表示兩臺linux節點互相信任。
[root @linux1 /root]# vi /etc/hosts.equiv
??? 在該文件里添加如下內容:
??? linux1
??? linux2
??? linux1-prv
??? linux2-prv
??? (8)在root的$HOME目錄下,建立.rhosts文件。
[root @linux1 /root]# vi .rhosts
??? 在該文件里添加如下內容。這樣,root用戶就可以直接rlogin、rsh而不用輸入密碼。
??? linux1 root
??? linux2 root
??? linux1-prv root
??? linux2-prv root
??? (9)配置完以后,我們可以測試一下是否成功。
[root @linux1 /root]# rlogin linux2
[root @linux1 /root]# rsh –l root linux2 cat /etc/hosts
[root @linux1 /root]# rcp /tmp/testlinux2:/tmp
?? 6.修改 linux內核 參數以及其他相應配置
[root @linux1 /root]# vi /etc/sysctl.conf
??? 在該文件末尾添加如下內容:
??? kernel.shmmax = 2147483648
??? kernel.shmmni = 4096
??? kernel.shmall = 2097152
??? kernel.sem = 250 32000 100 128
??? fs.file-max = 65536
??? 這里,對每個參數值做個簡要的解釋和說明。
??? (1)shmmax:該參數定義了
共享內存
段的最大尺寸(以字節為單位)。缺省為32M,對于oracle來說,該缺省值太低了,通常將其設置為2G。
??? (2)shmmni:這個內核參數用于設置系統范圍內共享內存段的最大數量。該參數的默認值是 4096 。通常不需要更改。
??? (3)shmall:該參數表示系統一次可以使用的共享內存總量(以頁為單位)。缺省值就是2097152,通常不需要修改。
??? (4)sem:該參數表示設置的信號量。
??? (5)file-max:該參數表示文件句柄的最大數量。文件句柄設置表示在
linux系統
中可以打開的文件數量。
??? 修改好內核以后,執行下面的命令使新的配置生效。
[root @linux1 /root]# /sbin/sysctl -p
??? 通常,出于性能上的考慮,還需要進行如下的設定,以便改進Oracle用戶的有關 nofile(可打開的文件描述符的最大數)和nproc(單個用戶可用的最大 進程 數量)。方法如下:
[root @linux1 /root]# vi /etc/security/limits.conf
??? 在該文件里添加如下內容:
??? oracle soft nofile 65536
??? oracle hard nofile 65536
??? oracle soft nproc 16384
??? oracle hard nproc 16384
?? 7.配置 hangcheck-timer 內核模塊
??? Oracle9202以前,都是使用watchdog來檢查系統是否掛起。從9202以后,oracle使用hangcheck-timer模塊。 hangcheck-timer模塊被加載到內核中,能夠定時檢查系統是否掛起。有個可配置的參數用來表示多少時間以后系統沒響應就認為是掛起。該模塊在 AS3中是自帶的。
??? 使用如下命令檢查該模塊是否存在:
[root @linux1 /root]# find /lib/modules -name "hangcheck-timer.o"
??? 使用相應的參數加載該模塊:
[root @linux1 /root]# /sbin/insmod hangcheck-timer hangcheck_tick=30
hangcheck_margin=180
??? 這里解釋一下兩個參數的含義:
??? hangcheck_tick:該參數定義了模塊啟動的間隔時段。其默認值為 60 秒。 Oracle建議將其設置為 30 秒。
??? hangcheck_margin:該參數定義了多少時間以后系統沒響應就認為是掛起。以秒為單位。其默認值為 180秒。Oracle 建議將其設置為 180 秒。
??? 檢查該模塊是否被成功加載:
[root @linux1 /root]# grep Hangcheck /var/log/messages
??? 為了在linux重啟以后,自動加載該模塊,可以將加載模塊的命令添加到/etc/modules.conf中
[root @linux1 /root]# echo "options hangcheck-timer hangcheck_tick=30
hangcheck_margin=180" >> /etc/modules.conf
![]()
![]()
?? 8.創建oracle用戶和dba組
[root @linux1 /root]# groupadd dba
[root @linux1 /root]# useradd –g dba oracle
[root @linux1 /root]# passwd oracle
??? 創建安裝oracle所需要的目錄。
[root @linux1 /root]# mkdir –p /oracle/ora9/product/9.2
[root @linux1 /root]# chown –R oracle.dba /oracle/ora9
???? 為oracle用戶配置.bashrc文件。
[root @linux1 /root]# su – oracle
[oracle@linux1 oracle]$ vi .bashrc
??? 將以下內容添加到.bashrc文件里。
export LD_ASSUME_KERNEL=2.4.1
export ORACLE_BASE=/oracle/ora9
export ORACLE_HOME=/oracle/ora9/product/9.2
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin:$PATH
export ORACLE_OWNER=oracle
export ORACLE_SID = rac9i1
export ORACLE_TERM=vt100
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:
/usr/local/lib:$LD_LIBRARY_PATH
![]()
![]()
??? 以上步驟必須在兩個節點上分別完成。
??? 注意: 紅色部分,在節點linux1上ORACLE_SID=rac9i1,而在節點linux2上則為ORACLE_SID=rac9i2。而藍色部分,很多 資料上只是說LD_LIBRARY_PATH=$ORACLE_HOME/lib即可。但是經過筆者測試,只寫這些是不夠的,在下面srvconfig –init時會報錯。必須按照上面藍色部分的內容進行配置。
?
??? 9.為共享設備劃分裸設備
??? 通常,對于RAC,我們都會使用裸設備來存放數據文件等需要共享的 數據庫 文件。這就需要我們對共享存儲劃分出若干的裸設備,每個裸設備對應一個文件。
??? 9.1 磁盤分區
??? 我們要對共享存儲進行分區,該步驟只需要在其中一個節點上完成即可。筆者劃分了3個主分區(primary)和一個包含11個分區的擴展分區(extend)。注意, linux 上最多只能劃分15個分區。超過的部分,linux是無法識別的。對每個分區的規劃如下所示:
??? 分區名尺寸存放的文件
??? /dev/sdb110M用于存放
Cluster
Manager Quorum文件
??? /dev/sdb2350M回滾段表空間1:Undotbs1
??? /dev/sdb3350M回滾段表空間1:Undotbs2
??? /dev/sdb5500M系統表空間:system
??? /dev/sdb610MSpfile
??? /dev/sdb7300M臨時表空間:temp
??? /dev/sdb8300M用戶表空間:user和indx,也可以不設置該分區
??? /dev/sdb910M控制文件:control file
??? /dev/sdb1010M控制文件:control file
??? /dev/sdb1120M第一個節點的第一組聯機日志文件
??? /dev/sdb1220M第一個節點的第二組聯機日志文件
??? /dev/sdb1320M第二個節點的第一組聯機日志文件
??? /dev/sdb1420M第二個節點的第二組聯機日志文件
??? /dev/sdb15100MSrvconfig模塊所需要的Shared Configuration文件
??? 規劃好以后,我們可以開始實際創建這些分區了。進入linux,執行如下命令進入分區界面。
[root @linux1 /root]# fdisk /dev/sdb
??? 首先輸入n,然后輸入p,再輸入1,回車接受缺省值,再輸入+10M,這樣我們就創建了/dev/sdb1。同樣的方法,我們可以創建sdb2和 sdb3。再次輸入n,然后輸入e,回車接受缺省值,再回車接受缺省值,這樣,我們就創建了擴展分區sdb4,同時把剩下的空間全都給了sdb4。接下 來,我們輸入n,然后回車接受缺省值,再輸入+500M,這樣,我們就創建了sdb5。同樣的方法,我們可以把剩下的所有分區都創建出來。
?創建完畢以后,輸入p,顯示我們剛才所創建的所有分區,確認無誤以后,輸入w,從而保存我們所創建的分區,并更新分區表。
??? 9.2 掛載裸設備
??? 該步驟需要在兩個節點分別進行。對裸設備的規劃如下:
??? 裸設備文件名掛載的分區存放的文件
??? /dev/raw/raw1/dev/sdb1Cluster Manager Quorum
??? /dev/raw/raw2/dev/sdb2Undotbs1
??? /dev/raw/raw3/dev/sdb3Undotbs2
??? /dev/raw/raw4/dev/sdb5system
??? /dev/raw/raw5/dev/sdb6Spfile
??? /dev/raw/raw6/dev/sdb7temp
??? /dev/raw/raw7/dev/sdb8user和indx
??? /dev/raw/raw8/dev/sdb9control file
??? /dev/raw/raw9/dev/sdb10control file
??? /dev/raw/raw10/dev/sdb11Log1-thread1
??? /dev/raw/raw11/dev/sdb12Log2-thread1
??? /dev/raw/raw12/dev/sdb13Log3-thread2
??? /dev/raw/raw13/dev/sdb14Log4-thread2
??? /dev/raw/raw14/dev/sdb15Shared Configuration
??? 確定了裸設備的規劃以后,將以下內容添加到/etc/rc.local文件。
??? raw /dev/raw/raw1 /dev/sdb1# Cluster Manager Quorum
??? raw /dev/raw/raw2 /dev/sdb2#undotbs1
??? raw /dev/raw/raw3 /dev/sdb3#undotbs2
??? raw /dev/raw/raw4 /dev/sdb5#sys01
??? raw /dev/raw/raw5 /dev/sdb6#spfile
??? raw /dev/raw/raw6 /dev/sdb7#temp01
??? raw /dev/raw/raw7 /dev/sdb8#user01&indx01
??? raw /dev/raw/raw8 /dev/sdb9#ctl1
??? raw /dev/raw/raw9 /dev/sdb10#ctl2
??? raw /dev/raw/raw10 /dev/sdb11#log1-thread1
??? raw /dev/raw/raw11 /dev/sdb12#log2-thread1
??? raw /dev/raw/raw12 /dev/sdb13#log3-thread2
??? raw /dev/raw/raw13 /dev/sdb14#log4-thread2
??? raw /dev/raw/raw14 /dev/sdb15#share configuration file
??? 檢查無誤后,修改/dev/raw1、/dev/raw/raw2一直到/dev/raw/raw15這15個裸設備文件的宿主為oracle。
[root @linux1 /root]# chown oracle.dba /dev/raw/raw1
[root @linux1 /root]# chown oracle.dba /dev/raw/raw2
。。。。。。。
[root @linux1 /root]# chown oracle.dba /dev/raw/raw15
??? 分別重新啟動兩個節點。啟動完畢以后,運行如下命令確定裸設備的 配置 情況。
[root @linux1 /root]# raw -aq
??? 10.檢查安裝oracle所需要的linux模塊以及補丁
??? 在兩個節點上分別確定以下這些rpm包是否都存在。
??? make-3.79
??? binutils-2.11
??? openmotif-2.2.2-16
??? setarch-1.3-1 compat-gcc-c++-7.3-2.96.122
??? compat-libstdc++-7.3-2.96.122
??? compat-gcc-7.3-2.96.122
??? compat-db-4.0.14-5
??? compat-libstdc++-devel-7.3-2.96.122
??? 如果沒有,則從AS3的安裝介質上找到這些包并加以安裝。安裝好上面這些模塊以后,需要打補丁,補丁號為:3006854。可以到oracle官方網站下載該補丁,發送到兩個節點上以后,執行:
??? [root @linux1 /root]# sh rhel3_pre_install.sh
?
??? 11.安裝 Oracle Cluster Manager
??? 11.1 生成OCM管理文件
?該OCM管理文件必須位于共享存儲上,按照我們的規劃,應該放在/dev/raw/raw1上。該步驟只需要在其中一個節點上執行即可。
[root @linux1 /root]# su - oracle
[oracle@linux1 oracle]$ dd if=/dev/zero of=/dev/raw/raw1 bs=1024 count=1024
??? 11.2 安裝OCM
[oracle@linux1 oracle]$ su - root
[root @linux1 /root]# mv /usr/bin/gcc /usr/bin/gcc323
[root @linux1 /root]# ln -s /usr/bin/gcc296 /usr/bin/gcc
[root @linux1 /root]# mv /usr/bin/g++ /usr/bin/g++323
[root @linux1 /root]# ln -s /usr/bin/g++296 /usr/bin/g++
??? 檢驗一下gcc和g++的版本。
[root@linux1 root]# gcc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux7/2.96/specs
gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-122)
[root@linux1 root]# g++ -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux7/2.96/specs
<script type="text/javascript"><!--mce:5--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"><!--mce:6--></script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"><!--mce:7--></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"><!--mce:8--></script><script><!--mce:9--></script>gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-122)
??? 將下載下來的 oracle安裝 介質(筆者下載的是ship_9204_linux_disk1.cpio.gz、ship_9204_linux_disk2.cpio.gz和ship_9204_linux_disk3.cpio.gz)拷貝到其中一個節點上。可以通過 ftp 拷貝也可以通過 samba 服務來拷貝。筆者個人傾向samba,很方便。拷貝完畢以后,使用如下命令解壓。
[root @linux1 /setup]# gunzip ship_9204_linux_disk1.cpio.gz
[root @linux1 /setup]# gunzip ship_9204_linux_disk2.cpio.gz
[root @linux1 /setup]# gunzip ship_9204_linux_disk3.cpio.gz
[root @linux1 /setup]# cpio -idmv < ship_9204_linux_disk1.cpio
[root @linux1 /setup]# rm –f ship_9204_linux_disk1.cpio
[root @linux1 /setup]# cpio -idmv < ship_9204_linux_disk2.cpio
[root @linux1 /setup]# rm –f ship_9204_linux_disk2.cpio
[root @linux1 /setup]# cpio -idmv < ship_9204_linux_disk3.cpio
[root @linux1 /setup]# rm –f ship_9204_linux_disk3.cpio
??? 解壓完畢,在當前目錄下有三個目錄:Disk1、Disk2、Disk3。修改宿主信息。
[root @linux1 /setup]# chown –R oracle.dba Disk1
[root @linux1 /setup]# chown –R oracle.dba Disk2
[root @linux1 /setup]# chown –R oracle.dba Disk3
???? 設置xhost +
[root @linux1 /setup]# xhost +
??? 開始安裝OCM
[root @linux1 /setup]# su - oracle
[oracle@linux1 oracle]$ /oracle/setup/Disk1/runInstall.sh
??? 在界面上,選擇安裝oracle cluster manager。點擊next,會要求你輸入public node,這時你分兩行輸入linux1和linux2。點擊next,會要求你輸入private node,這時你分兩行輸入linux1-prv和linux2-prv。點擊next,會要求輸入Quorum文件,這時輸入/dev/raw /raw1。點擊next開始安裝cluster manager軟件。這個軟件很小,安裝很快就會結束。
??? 11.3 配置OCM
[oracle@linux1 oracle]$ cd $ORACLE_HOME/oracm/admin
[oracle@linux1 admin]$ cp cmcfg.ora.tmp cmcfg.ora
[oracle@linux1 admin]$ vi cmcfg.ora
??? 將該文件內容修改為如下內容:
??? HeartBeat=15000
??? ClusterName=Oracle Cluster Manager, version 9i
??? PollInterval=1000
??? MissCount=20
??? PrivateNodeNames=linux1-prv linux2-prv
??? PublicNodeNames=linux1 linux2
??? ServicePort=9998
??? HostName=linux1
??? CmDiskFile=/dev/raw/raw1
??? 11.4 啟動OCM
[oracle@linux1 oracle]$ rm $ORACLE_HOME/oracm/log/*.ts [oracle@linux1 oracle]$ cd $ORACLE_HOME/oracm/bin [oracle@linux1 bin]$ ./ocmstart.sh [oracle@linux1 bin]$ ps –ef|grep oracm
???? 如果沒有發現oracm進程,則檢查$ORACLE_HOME/oracm/log/下的cm.log文件,查看錯誤消息。
??? 12.安裝 Oracle 軟件
<script type="text/javascript"><!--mce:10--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"><!--mce:11--></script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"><!--mce:12--></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"><!--mce:13--></script><script><!--mce:14--></script>[oracle@linux1 oracle]$ /oracle/setup/Disk1/runInstall.sh
??? 安裝過程比較簡單,也沒有出現任何錯誤。注意選擇只安裝oracle軟件,不要安裝 數據庫 。
??? 13.初始化Shared Configuration文件
??? Oracle軟件安裝完畢以后,開始設置Shared Configuration文件。
[oracle@linux1 oracle]$ su - root
[root @linux1 /root]# mkdir -p /var/opt/oracle
[root @linux1 /root]# touch /var/opt/oracle/srvConfig.loc
[root @linux1 /root]# chown oracle:dba /var/opt/oracle/srvConfig.loc
[root @linux1 /root]# chmod 755 /var/opt/oracle/srvConfig.loc
?在srvConfig.loc文件中添加Shared Configuration文件所在的路徑。而筆者的Shared Configuration文件位于共享存儲上,對應/dev/raw/raw14。
[root @linux1 /root]# echo “srvconfig_loc=/dev/raw/raw14” >> /var/opt/oracle/srvConfig.loc
??? 創建該Shared Configuration文件。
[root @linux1 /root]# su - oracle
[oracle@linux1 oracle]$ dd if=/dev/zero of=/dev/raw/raw14 bs=1024 count=102400
![]()
???? 初始化該Shared Configuration文件
[oracle@linux1 oracle]$ srvconfig -init
??? 筆者一開始執行報錯,結果把環境變量$LD_LIBRARY_PATH在.bashrc中設置為如下值后,再啟動就不會報錯了:$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH。
??? 14.創建數據庫
??? 使用dbca創建數據庫還是很簡單的。不過,筆者還是走了些彎路。主要是undotbs1不能太小,筆者一開始設置為240M,結果建庫時總是報錯。后來加大到350M后,成功建庫。啟動dbca前,要先在兩個節點上分別啟動gsd進程。
[oracle@linux1 oracle]$ $ORACLE_HOME/bin/gsdctl start
??? 然后啟動dbca。
[oracle@linux1 oracle]$ dbca
??? 選擇創建 cluster database,點擊next,把所有可以不選的組件都不選,點擊next后,在初始化參數設置的地方,修改spfile的路徑為:/dev/raw /raw5。然后點擊next,直到最后界面,筆者把表空間indx、users、tools都刪除了,為了建庫干凈。然后按照前面的規劃,分別把裸設備 文件名填寫到對應的文件上去。注意,每個文件都不要設定autoextend on。最后選擇生成腳本,點擊finish。
??? 當腳本生成完畢時,先別急著點ok。進入腳本所在目錄,檢查一下init.ora.xxxxxxxxxxxxx文件(這里xxxxxxxxxxxxx為隨 即序列號)。著重檢查最后幾行,不知為何,自動生成的init.ora文件會有點問題。比如,筆者這里生成的 init.ora.7232006164055內容為:
??? rac9i1.instance_name=rac9i
??? rac9i2.instance_name=rac9i2
??? rac9i1.instance_number=1
??? rac9i2.instance_number=2
??? rac9i2.local_listener=LISTENER_RAC9I
??? rac9i1.local_listener=LISTENER_RAC9I1
??? rac9i2.thread=2
??? rac9i1.thread=1
??? rac9i2.undo_tablespace=UNDOTBS2
??? rac9i1.undo_tablespace=UNDOTBS1
??? 筆者用紅色標示出來的地方是有問題的,按照這樣的初始化參數建立起來的RAC數據庫,第二個節點沒有辦法通過 負載均衡 來訪問。同時,最好把local_listener和remote_listener修改掉。最后修改后的這塊內容為:
??? rac9i1.instance_name=rac9i1
??? rac9i2.instance_name=rac9i2
??? rac9i1.instance_number=1
??? rac9i2.instance_number=2
??? rac9i2.local_listener='(address=(protocol=tcp)(host=linux2)(port=1521))'
??? rac9i2.remote_listener='(address=(protocol=tcp)(host=linux1)(port=1521))'
??? rac9i1.local_listener='(address=(protocol=tcp)(host=linux1)(port=1521))'
??? rac9i1.remote_listener='(address=(protocol=tcp)(host=linux2)(port=1521))'
??? rac9i2.thread=2
??? rac9i1.thread=1
??? rac9i2.undo_tablespace=UNDOTBS2
??? rac9i1.undo_tablespace=UNDOTBS1
???
??? 修改完這些內容以后,回到原來的dbca界面,點擊ok,就開始數據庫的正式安裝了。當然,也可以在dbca創建好數據庫以后再修改這些內容也是可以的。創建完數據庫以后,第二個節點的實例也會自動啟動。這時,整個RAC數據庫環境就已經搭建完畢了。
?
??? 15.驗證并測試RAC數據庫
??? 在 服務器端 ,執行如下語句。觀察是否有兩個實例在運行。
?SQL> select INSTANCE_NUMBER, STATUS,HOST_NAME from gv$instance;
INSTANCE_NUMBER STATUSHOST_NAME
--------------- ------------ ------------------
1OPENlinux1
<script type="text/javascript"><!--mce:15--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"><!--mce:16--></script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"><!--mce:17--></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"><!--mce:18--></script><script><!--mce:19--></script>2OPENlinux2
??? 15.1 測試負載均衡
??? 在客戶端上修改tnsnames.ora文件,添加如下內容:
??? rac =
??? (DESCRIPTION =
??? (ADDRESS_LIST =
??? (ADDRESS = (PROTOCOL = TCP)(HOST = linux2)(PORT = 1521))
??? (ADDRESS = (PROTOCOL = TCP)(HOST = linux1)(PORT = 1521))
??? )
??? (CONNECT_DATA =
??? (service_name = rac9i)
??? (failover_mode=(type=select)(method=basic))
??? )
??? (LOAD_BALANCE=ON)
??? (FAILOVER=ON)
??? )
??? 然后,為了能識別主機名linux1和linux2,筆者還修改了C:\WINDOWS\system32\drivers\etc目錄下的hosts文件,添加如下內容:
??? 134.251.114.140linux1
??? 134.251.114.141linux2
??? 最后,在命令窗口執行tnsping rac來檢驗是否能夠連通。檢測無誤以后,開始測試。分兩種方法,第一種方法是開兩個命令行窗口,在一個窗口中分別輸入如下的命令,然后再在另外一個窗口也輸入如下的命令。
D:\>sqlplus /nolog
SQL> connect sys/hanson@rac as sysdba
SQL> select instance_name from v$instance;
SQL> exit
?但是,從結果看起來,并沒有實現負載均衡。兩個窗口出現的都是rac9i1。而不是筆者想象中的一個窗口是rac9i1,另一個窗口是rac9i2。筆者又開了一個命令行窗口,再次重復執行上面的命令,仍然顯示rac9i1。
??? 換第二種測試方法,建立一個test.sql文件,內容如下:
connect test/test@rac;
select instance_name from v$instance;
exit
??? 然后,打開一個命令行窗口,反復執行如下命令:
D:\>sqlplus /nolog @c:\test.sql
??? 這時,顯示出來的實例名確實是負載均衡了,rac9i1和rac9i2交替出現。筆者認為,這樣的負載均衡意義似乎不是很大。
??? 15.2 測試failover
??? 實現failover,需要在客戶端的tnsnames.ora文件的CONNECT_DATA節點里添加如下行:
??? (failover_mode=(type=select)(method=basic))
??? 進入命令行窗口。
D:\>sqlplus /nolog
SQL> connect sys/hanson@rac as sysdba
SQL> select instance_name from v$instance;
INSTANCE_NAME
VMware
發表評論
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

評論