近日通過複製Oracle Home($ORACLE_HOME)目錄來安裝Oracle的時候遇到了幾個問題。
首先建好Oracle的相關OS使用者、組還有調整好核心參數,當然還有設定Oracle使用者的一些環境變數(~/.bash_profile),對於正規安裝過Oracle的朋友來說這都是浮雲。
如果源機和目標機的Oracle Home目錄一樣,使用者、組也一樣,那直接複製過去後重新用root使用者運行一下root.sh就可以了,非常簡單。
如果源機和目標機的Oracle Home目錄一樣,使用者、組不一樣(主要是使用者ID不一樣),複製過去後要重新設定一下檔案所屬 chown -R 使用者:組 $ORACLE_HOME,然後 relink all(relink all可以參考這篇文章),再運行一下root.sh就可以了,其實也沒什麼大不了的。
如果使用者、組和Oracle Home目錄都不一樣,就比較麻煩了,也就是本文的重點內容,一下類比這個過程。
先介紹一下環境,源機:
1 |
[oracle@test01 oracle]$ echo $ORACLE_BASE |
3 |
[oracle@test01 oracle]$ echo $ORACLE_HOME |
4 |
/u01/app/oracle/11.2.0.2 |
5 |
[oracle@test01 oracle]$ id |
6 |
uid=1003(oracle) gid=501(oracle) groups=501(oracle) |
目標機:
1 |
[ora11g@test06 ora11g]$ echo $ORACLE_BASE |
3 |
[ora11g@test06 ora11g]$ echo $ORACLE_BASE |
4 |
/u01/app/ora11g/product/11.2.0.2/db_1 |
5 |
[ora11g@test06 ora11g]$ id |
6 |
uid=731(ora11g) gid=700(oradba) groups=700(oradba) |
首先在源機上對Oracle Home打包,要用root使用者執行,並且保留相關的許可權,複製到目標機器上:
1 |
[oracle@test01 oracle]$ echo $ORACLE_HOME |
2 |
/u01/app/oracle/11.2.0.2 |
3 |
[oracle@test01 oracle]$ exit |
4 |
[oracle@test01 ~]$ cd /u01/app/oracle/ |
5 |
[root@test01 oracle]# tar zcvfp 11.2.0.2.tar.gz ./11.2.0.2/ |
6 |
[root@test01 oracle]# scp ./11.2.0.2.tar.gz 10.168.0.206:/u01/app/ora11g/product/11.2.0.2/ |
下文就和源機沒有什麼關係了,在目標機上解壓這個壓縮包,並替換新的Oracle Home目錄,當然還要將檔案歸屬搞好:
01 |
[root@test06 ~]# cd /u01/app/ora11g/product/11.2.0.2/ |
02 |
[root@test06 11.2.0.2]# tar zxvf 11.2.0.2.tar.gz |
03 |
[root@test06 11.2.0.2]# ll |
05 |
drwxr-xr-x 75 1003 oradba 4096 Nov 20 22:19 11.2.0.2 |
06 |
-rw-r--r-- 1 root root 2178854174 Jan 21 09:35 11.2.0.2.tar.gz |
07 |
drwxr-xr-x 2 ora11g oradba 4096 Jan 21 09:47 db_1 |
08 |
[root@test06 11.2.0.2]# rm -rf db_1/ |
09 |
[root@test06 11.2.0.2]# mv 11.2.0.2 db_1 |
10 |
[root@test06 11.2.0.2]# chown -R ora11g:oradba ./db_1/ |
修改 $ORACLE_HOME/rdbms/lib/config.c 將Oracle使用者的組名改過來,relink all一下就可以了:
01 |
[root@test06 ~]# su - ora11g |
02 |
[ora11g@test06 ~]$ cat $ORACLE_HOME/rdbms/lib/config.c |
04 |
/* SS_DBA_GRP defines the UNIX group ID for sqldba adminstrative access. */ |
05 |
/* Refer to the Installation and User's Guide for further information. */ |
07 |
/* IMPORTANT: this file needs to be in sync with |
08 |
rdbms/src/server/osds/config.c, specifically regarding the |
09 |
number of elements in the ss_dba_grp array. |
12 |
#define SS_DBA_GRP "oradba" |
13 |
#define SS_OPER_GRP "oradba" |
14 |
#define SS_ASM_GRP "oradba" |
16 |
char *ss_dba_grp[] = {SS_DBA_GRP, SS_OPER_GRP, SS_ASM_GRP}; |
17 |
[ora11g@test06 ~]$ relink all |
修改 $ORACLE_HOME 中的 oraInst.loc 檔案,其實就是填入正確 oraInventory 目錄,這個oraInventory 可以不建,但是父目錄必須存在,並且Oracle使用者可以寫入(建目錄):
01 |
[ora11g@test06 ~]$ cd $ORACLE_HOME |
02 |
[ora11g@test06 db_1]$ cp oraInst.loc{,.bak} |
03 |
[ora11g@test06 db_1]$ vim oraInst.loc |
04 |
[ora11g@test06 db_1]$ more oraInst.loc* |
08 |
inventory_loc=/u01/app/ora11g/oraInventory |
13 |
inventory_loc=/u01/app/oracle/oraInventory |
修改 $ORACLE_HOME/clone/config/cs.properties 在最後加上參數-invPtrLoc 指明 oraInst.loc 所在的路徑:
1 |
[ora11g@test06 db_1]$ cd $ORACLE_HOME/clone/config |
2 |
[ora11g@test06 config]$ cat cs.properties |
3 |
# Copyright (c) 2005, Oracle. All rights reserved. |
6 |
clone_command_line= -silent -noConfig -nowait -invPtrLoc "/u01/app/ora11g/product/11.2.0.2/db_1/oraInst.loc" |
再去到 $ORACLE_HOME/clone/bin 目錄執行一下一個perl指令碼:
2 |
ORACLE_HOME= "/u01/app/ora11g/product/11.2.0.2/db_1" \ |
3 |
ORACLE_BASE= "/u01/app/ora11g" \ |
5 |
OSOPER_GROUP= "oradba" \ |
7 |
ORACLE_HOME_NAME= "OracleHome1" |
01 |
[ora11g@test06 config]$ cd $ORACLE_HOME/clone/bin |
02 |
[ora11g@test06 bin]$ ls |
03 |
clone.pl prepare_clone.pl |
04 |
[ora11g@test06 bin]$ ./clone.pl \ |
05 |
[ora11g@test06 bin]> ORACLE_HOME="/u01/app/ora11g/product/11.2.0.2/db_1" \ |
06 |
[ora11g@test06 bin]> ORACLE_BASE="/u01/app/ora11g" \ |
07 |
[ora11g@test06 bin]> OSDBA_GROUP="oradba" \ |
08 |
[ora11g@test06 bin]> OSOPER_GROUP="oradba" \ |
09 |
[ora11g@test06 bin]> OSASM_GROUP="oradba" \ |
10 |
[ora11g@test06 bin]> ORACLE_HOME_NAME="OracleHome1" |
最後按照提示用root使用者執行那個 $ORACLE_HOME 的 root.sh 就OK了。