title: Linux下静默安装Oracle 11g RAC
categories: 数据库
tags:
- RAC
- Cluster
- HA
- Oracle
timezone: Asia/Shanghai
date: 2019-01-06

环境

# Red Hat Enterprise Linux Server release 6.10.x86_64 (Santiago)
# Oracle Linux 7.5 x86_64

p13390677_112040_Linux-x86-64_1of7.zip
p13390677_112040_Linux-x86-64_2of7.zip
p13390677_112040_Linux-x86-64_3of7.zip

注意事项

1.主机名都用小写字母,长度不能超过15位,不要有特殊符号

2.两个节点的Plublic和VIP所在网卡的网卡名要一样

3.表决盘应该都是相同的大小。不同的大小可能导致可用性降低。

第一步:规划IP地址和主机名

1.IP地址规划

节点

hostname

类型

IP地址

接口

备注

1

rac1

Plublic IP

10.0.1.131

eth0

手动设置

2

rac2

Plublic IP

10.0.1.132

eth0

手动设置

1

rac1-vip

Virtaual IP

10.0.1.133

eth0

集群自动设置

2

rac2-vip

Virtaual IP

10.0.1.134

eth0

集群自动设置

Cluster

rac-scan

SCAN IP

10.0.1.135

eth0

集群自动设置

1

rac1-priv

Private IP

11.11.11.131

eth1

手动设置

2

rac2-priv

Private IP

11.11.11.132

eth1

手动设置

2.在两个节点分别将Plublic IP和Private IP写入(by all)

只需要手动在两个节点上设置静态IP地址即可。修改主机名、关闭防火墙等使用下边脚本来完成

vim /etc/sysconfig/network-scripts/ifcfg-eth0
vim /etc/sysconfig/network-scripts/ifcfg-eth1

第二步:设置共享存储

1.现在Win2012上创建5个存储盘 这里创建了三个1G的投票盘(votingdisk),一个20G的数据盘(data),一个10G的备份盘(backup)。

2.连接iscsi 安装并设置自动启动(by all)

扫描iscsi存储并重启服务器,重启后会自动挂载

mkdir -p /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
cd /mnt/cdrom/Packages

----- RedHat6:
rpm -ivh iscsi-initiator-utils-6.2.0.873-27.el6_9.x86_64.rpm
chkconfig iscsid on
iscsiadm -m discovery -t sendtargets -p 10.0.1.141:3260

----- RedHat7:
rpm -ivh iscsi-initiator-utils-6.2.0.874-7.0.1.el7.x86_64.rpm
systemctl start iscsid
systemctl enable iscsid
iscsiadm -m discovery -t sendtargets -p 10.0.1.141:3260

3.查看挂载磁盘并分区(任意一个节点操作即可)

ll /dev/sd*
fdisk /dev/sdb
fdisk /dev/sdc
fdisk /dev/sdd
fdisk /dev/sde
fdisk /dev/sdf

分区后如果看不到分区可用以下命令刷新
partprobe /dev/sdb
partprobe /dev/sdc
partprobe /dev/sdd
partprobe /dev/sde
partprobe /dev/sdf

4.配置裸盘(by all)

vim /etc/udev/rules.d/60-raw.rules

ACTION=="add", KERNEL=="sdb1", RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", KERNEL=="sdc1", RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add", KERNEL=="sdd1", RUN+="/bin/raw /dev/raw/raw3 %N"
ACTION=="add", KERNEL=="sde1", RUN+="/bin/raw /dev/raw/raw4 %N"
ACTION=="add", KERNEL=="sdf1", RUN+="/bin/raw /dev/raw/raw5 %N"
KERNEL=="raw[1-5]*", OWNER="grid" GROUP="asmadmin", MODE="660"

5.启动并验证udev(by all)

----- RedHat6:
/sbin/start_udev

[root@rac1 sshsetup]# ll /dev/raw/
总用量 0
crw-rw---- 1 grid asmadmin 162, 1 12月 28 20:14 raw1
crw-rw---- 1 grid asmadmin 162, 2 12月 28 20:14 raw2
crw-rw---- 1 grid asmadmin 162, 3 12月 28 20:14 raw3
crw-rw---- 1 grid asmadmin 162, 4 12月 28 20:14 raw4
crw-rw---- 1 grid asmadmin 162, 5 12月 28 20:14 raw5
crw-rw---- 1 root disk     162, 0 12月 28 20:14 rawctl

----- RedHat7:
/sbin/udevadm trigger --type=devices --action=change
重新加载udev rule
/sbin/udevadm control --reload
诊断udev rule
/sbin/udevadm test /sys/block/sdb

ll /dev/raw/

如果磁盘有数据的可以使用以下命令清空磁盘信息(任意一个节点操作即可)

dd if=/dev/zero of=/dev/raw/raw1 bs=1024 count=256
dd if=/dev/zero of=/dev/raw/raw2 bs=1024 count=256
dd if=/dev/zero of=/dev/raw/raw3 bs=1024 count=256
dd if=/dev/zero of=/dev/raw/raw4 bs=1024 count=256
dd if=/dev/zero of=/dev/raw/raw5 bs=1024 count=256

第三步:使用初始化脚本初始化系统环境(见附录1)

1.使用本脚本应注意事项(by all)

1.必须使用root执行
2.请确认已经将PlublicIP设置为静态IP
3.请确认已挂载Linux安装光盘
4.本脚本可以重复执行
5.本脚本会覆盖hosts设置,如有特殊需求的请在安装完毕后手动恢复所需内容
6.vip和priv主机名格式为:“主机名-vip”和“主机名-priv”,如有需要请更改
7.此脚本编写环境为RedHat6.10 && Oracle 11g RAC
8.此脚本只针对两个节点的RAC环境初始化,脚本启动的时候会让选择节点1还是节点2
9.最后请请根据自己实际情况修改脚本内最上部变量后即可执行

2.本脚本所实现功能(by all)

1.关闭SELinux
2.关闭iptables
3.修改主机名
4.写入hosts
5.禁用ntpd
6.创建所需要的账户和组
7.新建grid和oracle安装目录
8.配置oracle和grid用户变量
9.配置本地YUM并安装依赖包

第四步:安装grid

注意:在以上的脚本里并没有对系统内核做修改,在这步我们使用grid检测脚本来进行环境的检测的同时生成修复脚本来完成对系统内核的修改,可以在提高效率的同时方式手动修改造成错误。
1.配置ssh互信

1.1.使用oracle官方系统的脚本(用root账户在其中一个节点执行即可)

注意:需要同时配置grid和oracle两个账户下的public ip和vip的ssh互信

注意:在生成秘钥的时候不要设置密码

/home/grid/grid/sshsetup/sshUserSetup.sh -user oracle -hosts 'rac1 rac2 rac1-priv rac2-priv' -advanced
/home/grid/grid/sshsetup/sshUserSetup.sh -user grid -hosts 'rac1 rac2 rac1-priv rac2-priv' -advanced

-hosts 表示:需要配置互信的服务器ip
-user 表示:用于远程登录到服务器上的用户名
-advanced 表示:hosts里的主机,每两个主机之间都是互信的。
    如果不加-advanced,例如:本机是HOST-A,在本机执行./sshUserSetup.sh -user aime -hosts A B C。那么就是HOST-A->A, HOST-A->B, HOST-A->C 的互信关系。A,B,C之间是不互信的。

1.2.可以使用以下命令测试刚才做的ssh互信是否生效,如果没有提示输入密码并且输出了系统时间就OK(by all)

su - oracle
ssh rac1 date && \
ssh rac2 date && \
ssh rac1-priv date && \
ssh rac2-priv date

su - grid
ssh rac1 date && \
ssh rac2 date && \
ssh rac1-priv date && \
ssh rac2-priv date
2.执行安装前的检查并使用生成的脚本修改内核参数

2.1.执行安装前的检查(任意节点执行一次即可)

su - grid
/home/grid/grid/./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -verbose -fixup

语法说明:
-pre: 该选项主要检查是否满足安装的需要。 
-post:该选择主要检查安装后组件是否正常。 
-n:该选项用于指定节点列表。 
-verbose:该选项用于输出详细的验证信息。 
-fixup:这是Oracle 11gR2中新增加的一个参数。利用这个参数,可以产生一个名为runfixup.sh的脚本。

runfixup.sh脚本中包含一系列的操作系统命令,利用这个脚本可以对操作系统进行一定的修改,使其满足安装条件。完成系统进行校验之后,以root用户的身份执行脚本runfixup.sh,就可以解决操作系统中一些尚不满足安装条件的情况。

2.2.根据提示使用root用户在两个节点执行修复脚本并安装cvuqdisk和pdksh,安装完成后再此运行检查应该除了GNS和时间同步其他全部OK(by all)

/tmp/CVU_11.2.0.4.0_grid/runfixup.sh
rpm -ivh /home/grid/grid/rpm/cvuqdisk-1.0.9-1.rpm
rpm -ivh pdksh-5.2.14-37.el5_8.1.i386.rpm
rpm -ivh pdksh-5.2.14-37.el5_8.1.x86_64.rpm

pdksh需要单独下载:
https://pan.baidu.com/s/1cb3nsP7plx2tAqyLmeMGiQ
https://pan.baidu.com/s/1zL3bawYb4sLYx3bqEHQzlw
3.执行静默安装(静默安装脚本见附录2)(节点1执行即可,会自动复制到节点2)
/home/grid/grid/runInstaller -showProgress -silent -responseFile /home/grid/grid.rsp

-showProgress       用于在控制台上显示安装进度。仅在无提示安装下才支持此选项。
-ignorePrereq       忽略运行先决条件检查。由于我们没有使用DNS来解析SCAN所以会报一个SCAN的错误,因为使用udev绑定裸设备而没有使用ASMLIB来使用ASM,所以会报一个ASM的错误,这两个错误都是可以忽略的,但静默安装在检测到错误后就会停止安装,不能像图形界面那样点一下忽略跳过,所以我们使用这个参数来绕过预检
-silent             对于无提示模式下的操作, 输入内容可以是一个响应文件, 也可以是命令行变量值对的列表。
-responseFile       指定要使用的响应文件和路径。
其它命令请查询帮助 -help
4.根据提示分别在两个节点按以下顺序执行sh脚本(by all)
1.节点1:/u01/app/oraInventory/orainstRoot.sh
2.节点2:/u01/app/oraInventory/orainstRoot.sh

3.节点1:/u01/app/11.2.0/grid/root.sh
4.节点2:/u01/app/11.2.0/grid/root.sh

Redhat7在执行root.sh的时候出现以下错误提示,经查是个bug:
ohasd failed to start
Failed to start the Clusterware. Last 20 lines of the alert log follow: 
2018-12-31 21:40:24.432: 
[client(11531)]CRS-2101:The OLR was formatted using version 3.

解决方法1:
/bin/dd if=/var/tmp/.oracle/npohasd of=/dev/null bs=1024 count=1
5.根据提示需要提供密码脚本文件

在运行安装程序的节点使用grid用户执行以下脚本

关于此密码文件的官方说明:https://docs.oracle.com/database/121/CWLIN/app_nonint.htm#CWLIN379

touch /home/grid/cfgrsp.properties
/u01/app/11.2.0/grid/cfgtoollogs/configToolAllCommands RESPONSE_FILE=/home/grid/cfgrsp.properties

在这里我们只提供一个空文件,关于官方说明只是在需要使用智能管理平台界面IPMICA的时候才需要提供密码。
6.至此grid已安装完成,附上群集状态检查
[grid@rac1 ~]$ crsctl check crs
CRS-4638: Oracle High Availability Services is online
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online

[grid@rac1 ~]$ crs_stat -t -v
Name           Type           R/RA   F/FT   Target    State     Host        
----------------------------------------------------------------------
ora....ER.lsnr ora....er.type 0/5    0/     ONLINE    ONLINE    rac1        
ora....N1.lsnr ora....er.type 0/5    0/0    ONLINE    ONLINE    rac1        
ora.OCR.dg     ora....up.type 0/5    0/     ONLINE    ONLINE    rac1        
ora.asm        ora.asm.type   0/5    0/     ONLINE    ONLINE    rac1        
ora.cvu        ora.cvu.type   0/5    0/0    ONLINE    ONLINE    rac1        
ora.gsd        ora.gsd.type   0/5    0/     OFFLINE   OFFLINE               
ora....network ora....rk.type 0/5    0/     ONLINE    ONLINE    rac1        
ora.oc4j       ora.oc4j.type  0/1    0/2    ONLINE    ONLINE    rac1        
ora.ons        ora.ons.type   0/3    0/     ONLINE    ONLINE    rac1        
ora....SM1.asm application    0/5    0/0    ONLINE    ONLINE    rac1        
ora....C1.lsnr application    0/5    0/0    ONLINE    ONLINE    rac1        
ora.rac1.gsd   application    0/5    0/0    OFFLINE   OFFLINE               
ora.rac1.ons   application    0/3    0/0    ONLINE    ONLINE    rac1        
ora.rac1.vip   ora....t1.type 0/0    0/0    ONLINE    ONLINE    rac1        
ora....SM2.asm application    0/5    0/0    ONLINE    ONLINE    rac2        
ora....C2.lsnr application    0/5    0/0    ONLINE    ONLINE    rac2        
ora.rac2.gsd   application    0/5    0/0    OFFLINE   OFFLINE               
ora.rac2.ons   application    0/3    0/0    ONLINE    ONLINE    rac2        
ora.rac2.vip   ora....t1.type 0/0    0/0    ONLINE    ONLINE    rac2        
ora....ry.acfs ora....fs.type 0/5    0/     ONLINE    ONLINE    rac1        
ora.scan1.vip  ora....ip.type 0/0    0/0    ONLINE    ONLINE    rac1        

[grid@rac1 ~]$ olsnodes -n
rac1    1
rac2    2

[grid@rac1 ~]$ ps -ef|grep lsnr|grep -v 'grep'|grep -v 'ocfs'|awk '{print$9}'
LISTENER_SCAN1
LISTENER

[grid@rac1 ~]$ srvctl status asm -a
ASM 正在 rac2,rac1 上运行
ASM 已启用。

[grid@rac1 ~]$ olsnodes -n -i -s -t
rac1    1       rac1-vip        Active  Unpinned
rac2    2       rac2-vip        Active  Unpinned

[grid@rac1 ~]$ crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   859e013bd7544f67bfb2f5ebc7ecbae4 (/dev/raw/raw1) [OCR]
 2. ONLINE   a96ac903004f4ffebf2f6da76fb5325b (/dev/raw/raw2) [OCR]
 3. ONLINE   6e53a9f9bf8e4facbf26317b8edfbd34 (/dev/raw/raw5) [OCR]
Located 3 voting disk(s).

[grid@rac1 ~]$ srvctl config scan
SCAN 名称: rac-scan, 网络: 1/10.0.1.0/255.255.255.0/eth0
SCAN VIP 名称: scan1, IP: /rac-scan/10.0.1.135

[grid@rac1 ~]$ srvctl config scan_listener
SCAN 监听程序 LISTENER_SCAN1 已存在。端口: TCP:1521

第五步:安装Oracle Database

1.创建ASM磁盘组DATA用于存放数据库文件和BAK用于备份

方法1:使用ASMCA
方法2:使用ASMCMD



/home/oracle/database/runInstaller

-responseFile       指定要使用的响应文件和路径。
-silent             对于无提示模式下的操作, 输入内容可以是一个响应文件, 也可以是命令行变量值对的列表。
-executePrereqs     仅执行先决条件检查。
-showProgress       用于在控制台上显示安装进度。仅在无提示安装下才支持此选项。

附录:Bug(附彻底解决办法)

Bug说明:

ALERT:  Grid Infrastructure Fails to Start OHASD With RedHat Linux or Oracle Linux with RedHat Compatible Kernel (RHCK) Version 3.10.0-514.21.2.EL7.X86_64 or Higher (Doc ID 2282371.1)

https://community.oracle.com/message/14424838#14424838

解决方法:手动创建服务文件,并设置开机自动启动

touch /usr/lib/systemd/system/ohas.service
chmod 777 /usr/lib/systemd/system/ohas.service
cat <<EOF>/usr/lib/systemd/system/ohas.service
[Unit]
Description=Oracle High Availability Services
After=syslog.target

[Service]
ExecStart=/etc/init.d/init.ohasd run >/dev/null 2>&1 Type=simple
Restart=always

[Install]
WantedBy=multi-user.target
EOF

以root用户运行下面的命令

systemctl daemon-reload
systemctl enable ohas.service
systemctl start ohas.service

附录1:初始化脚本(将以下内容保存为sh文件直接执行即可)

#/bin/bash
# 本脚本针对RedHat6、CentOS6静默安装Oracle 11g RAC初始化系统参数用
# 本脚本只适用于新安装系统的初始化,已经在使用或者有调整系统参数的禁止使用!!!!!
# 注意:本脚本会覆盖hosts设置

################################### 已验证 Linux 发行版 ###################################
# Red Hat Enterprise Linux Server release 6.10.x86_64 (Santiago)
# Oracle Linux 7.5 x86_64

################################### 请根据自己实际情况修改变量 ###################################
rac1HostName=rac1
rac2HostName=rac2
rac1PlublicIP=10.0.1.131
rac2PlublicIP=10.0.1.132
rac1VIP=10.0.1.133
rac2VIP=10.0.1.134
scanIP=10.0.1.135
rac1PrivIP=11.11.11.131
rac2PrivIP=11.11.11.132
scanName=rac-scan
oraclePasswd=oracle
gridPasswd=grid

# grid and oracle 根目录
GridOracleHomeTemp=/u01

# grid实例名称(节点1为:“名称1”,节点2为:“名称2”)
GRID_SIDTemp=+ASM

# 安装grid时候的:Oracle Base
GRID_BASETemp=/u01/app/grid

# 安装grid时候的:Software Location
GRID_HOMETemp=/u01/app/11.2.0/grid

# 安装database时候的:Oracle Base
ORACLE_BASETemp=/u01/app/oracle

# 数据库名称
ORACLE_UNQNAMETemp=oracledbrac

# 数据库实例名称(节点1实例名称为:orcl1,节点2为:orcl2)
ORACLE_SIDTemp=orcl

################################### 请根据自己实际情况修改变量 ###################################


# 检查当前用户是否为root权限
if [ `id -u` -eq 0 ];then
	echo "当前用户是root用户,将继续安装!"
else
	echo "非root用户!"
	exit 0
fi

# 输出提示,是否已设置静态IP并挂载光驱
echo
read -p "请确认您已经将PlublicIP设置为静态IP并已挂载Linux安装光盘.按Enter键开始,Ctrl+C退出" tempchar
echo

# 请选择你的系统版本(RedHat6或者Redhat7)
read -p "系统版本为:6 or 7:" LinuxVer
if [ ${LinuxVer} -eq 6 ]
then
    echo "您选择的系统是Linux发行版:6"
elif [ ${LinuxVer} -eq 7 ]
then
    echo "您选择的系统是Linux发行版:7"
else
	echo "输入错误,程序将推出"
	exit
fi


# 选择当前节点(此脚本只支持双节点安装RAC)
read -p "当前节点为1 or 2:" nodeNum
if [ $nodeNum -eq 1 ]
then
    echo "当前服务器为:节点1"
    hostname=${rac1HostName}
    racPlublicip=${rac1PlublicIP}
    racVIP=${rac1VIP}
elif [ $nodeNum -eq 2 ]
then
	echo "当前服务器为:节点2"
    hostname=${rac2HostName}
    racPlublicip=${rac2PlublicIP}
    racVIP=${rac2VIP}
else
	echo -e "\033[31m节点选择错误\033[0m"
    exit
fi


# 1.关闭SELinux
grep "SELINUX=disabled" /etc/selinux/config > /dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "SElinux本身就是关闭状态"
    setenforce 0
else
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    [ $? -eq 0 ] && echo "关闭SELinux - Success" || echo -e "\033[31m关闭SELinux----------Failed\033[0m"
    setenforce 0
fi

# 2.关闭iptables和firewalld(需要区分6和7)
if [ ${LinuxVer} -eq 6 ]
then
	service iptables stop
	chkconfig iptables off
	[ $? -eq 0 ] && echo "禁止iptables开机自动启动 - Success" || echo -e "\033[31m禁止iptables开机自动启动----------Failed\033[0m"
else
	systemctl stop firewalld
	systemctl disable firewalld
	[ $? -eq 0 ] && echo "禁止firewalld开机自动启动 - Success" || echo -e "\033[31m禁止firewalld开机自动启动----------Failed\033[0m"
	systemctl stop iptables
	systemctl disable iptables
	[ $? -eq 0 ] && echo "禁止iptables开机自动启动 - Success" || echo -e "\033[31m禁止iptables开机自动启动----------Failed\033[0m"
fi

# 3.修改主机名(需要区分6和7)
if [ ${LinuxVer} -eq 6 ]
then
	hostname ${hostname}
	sed -i "/HOSTNAME=/c HOSTNAME=${hostname}" /etc/sysconfig/network
	[ $? -eq 0 ] && echo "修改主机名 - Success" || echo -e "\033[31m修改主机名----------Failed\033[0m"
else
	hostnamectl set-hostname ${hostname}
	[ $? -eq 0 ] && echo "修改主机名 - Success" || echo -e "\033[31m修改主机名----------Failed\033[0m"
fi

# 4.写入hosts
cat <<EOF >/etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
${rac1PlublicIP} ${rac1HostName}
${rac2PlublicIP} ${rac2HostName}
${rac1VIP} ${rac1HostName}-vip
${rac2VIP} ${rac2HostName}-vip
${scanIP} ${scanName}
${rac1PrivIP} ${rac1HostName}-priv
${rac2PrivIP} ${rac2HostName}-priv
EOF
[ $? -eq 0 ] && echo "写入hosts文件 - Success" || echo -e "\033[31m写入hosts----------Failed\033[0m"

# 5.禁用ntpd,Oracle会自动启用自己的ctssd来进行时间同步(需要区分6和7)
if [ ${LinuxVer} -eq 6 ]
then
	service ntpd stop
	chkconfig ntpd off
	[ $? -eq 0 ] && echo "禁止ntp开机自动启动 - Success" || echo -e "\033[31m禁止ntp开机自动启动----------Failed\033[0m"
	# mv /etc/ntp.conf /etc/ntp.conf.bak > /dev/null 2>&1
else
	systemctl stop ntpd
	systemctl disable ntpd
	[ $? -eq 0 ] && echo "禁止ntp开机自动启动 - Success" || echo -e "\033[31m禁止ntp开机自动启动----------Failed\033[0m"
	# mv /etc/ntp.conf /etc/ntp.conf.bak > /dev/null 2>&1
fi

# 6.创建所需要的账户和组

#Add oracle user. If present ,do nothing but create the mandatory groups
#添加oracle用户。 如果存在,除了创建必需组之外什么也不做

USERID="54321"
GROUPID="54321"

# 6.1.检查GROUPID是否被占用
groupnum=`cat /etc/group | sort -t: -g +2 -3 | grep -v nfsnobody | cut -f3 -d":" | tail -1`
if [ "${groupnum}" -ge "${GROUPID}" ]; then
	GROUPID=`expr $groupnum + 1`
fi

# 6.2.检查USERID是否被占用
usernum=`cat /etc/passwd | sort -t: -g +2 -3 | grep -v nfsnobody | cut -f3 -d":" | tail -1`
if [ "${usernum}" -ge "${USERID}" ]; then
	USERID=`expr $usernum + 1`
fi

# 6.3.创建oinstall组
/bin/grep "^oinstall" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group oinstall - 已经存在"
else
    echo "Adding group oinstall with gid ${GROUPID}"
    /usr/sbin/groupadd -g ${GROUPID} oinstall
fi

# 6.4.创建dba组
/bin/grep "^dba" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group dba - 已经存在"
else
    echo "Adding group dba"
    /usr/sbin/groupadd dba
fi

# 6.5.创建oper组 add by 6
/bin/grep "^oper" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group oper - 已经存在"
else
    echo "Adding group oper"
    /usr/sbin/groupadd oper
fi

# 6.6.创建asmdba组 add by 6
/bin/grep "^asmdba" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group asmdba - 已经存在"
else
    echo "Adding group asmdba"
    /usr/sbin/groupadd asmdba
fi

# 6.7.创建asmadmin组 add by 6
/bin/grep "^asmadmin" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group asmadmin - 已经存在"
else
    echo "Adding group asmadmin"
    /usr/sbin/groupadd asmadmin
fi

# 6.8.创建asmoper组 add by 6
/bin/grep "^asmoper" /etc/group > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Group asmoper - 已经存在"
else
	echo "Adding group asmoper"
	/usr/sbin/groupadd asmoper
fi

# 6.9.创建oracle账户,如果已有oracle账号,将自动为该账号设置密码。
/bin/grep "^oracle:" /etc/passwd   > /dev/null 2>&1
if [ $? -ne 0 ]; then
	echo "Adding user oracle with user id ${USERID}, initial login group oinstall, supplementary group asmadmin,asmdba,dba,oper and  home directory /home/oracle"
	/usr/sbin/useradd -u ${USERID} -g oinstall -G asmadmin,asmdba,dba,oper -d /home/oracle oracle
	if [ "$?" -eq "0" ]; then
		echo "Changing ownership of /home/oracle to oracle:oinstall"
		/bin/chown oracle:oinstall /home/oracle
	else
		echo -e "\033[31m创建oracle用户失败----------Failed\033[0m"
	fi
else
	echo "用户oracle已经存在"
fi

# 6.10.创建grid账户 如果已有grid账号,将自动为该账号设置密码。add by 6
/bin/grep "^grid:" /etc/passwd > /dev/null 2>&1
if [ $? -ne 0 ]; then
	#Add the user - password is disabled for grid user.
    #添加用户 - 并自动为grid用户设置密码。
	echo "Adding user grid with user id ${USERID}, initial login group oinstall, supplementary group asmadmin,asmdba,asmoper,dba and  home directory /home/grid"
	/usr/sbin/useradd -u `expr ${USERID} + 1` -g oinstall -G asmadmin,asmdba,asmoper,dba -d /home/grid grid
	if [ "$?" -eq "0" ]; then
		echo "Changing ownership of /home/grid to grid:oinstall"
		/bin/chown grid:oinstall /home/grid
	else	
		echo -e "\033[31m创建grid用户失败----------Failed\033[0m"
	fi
else
	echo "用户grid已经存在"
fi

# 6.11.为oracle账户设置密码
echo ${oraclePasswd} | passwd --stdin oracle
if [ $? -eq 0 ]
then
	echo "修改oracle密码 - Success"
else
	echo -e "\033[31m修改oracle密码----------Failed\033[0m"
fi

# 6.12.为grid账户设置密码
echo ${gridPasswd} | passwd --stdin grid
if [ $? -eq 0 ]
then
	echo "修改grid密码 - Success"
else
	echo -e "\033[31m修改grid密码----------Failed\033[0m"
fi

# 6.13.检查oracle用户所属组是否正确
id oracle | grep asmadmin > /dev/null 2>&1
if [ $? -eq 0 ]
then
	echo "oracle附属组检查通过"
else
	usermod -aG asmadmin oracle
	if [ $? -eq 0 ]
	then
		echo "用oracle用户添加组成功"
	else
		echo -e "\033[31m用oracle用户添加组失败----------Failed\033[0m"
	fi
fi

id oracle | grep asmdba > /dev/null 2>&1
if [ $? -eq 0 ]
then
	echo "oracle附属组检查通过"
else
	usermod -aG asmdba oracle
	if [ $? -eq 0 ]
	then
		echo "用oracle用户添加组成功"
	else
		echo -e "\033[31m用oracle用户添加组失败----------Failed\033[0m"
	fi
fi

id oracle | grep dba > /dev/null 2>&1
if [ $? -eq 0 ]
then
	echo "oracle附属组检查通过"
else
	usermod -aG dba oracle
	if [ $? -eq 0 ]
	then
		echo "用oracle用户添加组成功"
	else
		echo -e "\033[31m用oracle用户添加组失败----------Failed\033[0m"
	fi
fi

id oracle | grep oper > /dev/null 2>&1
if [ $? -eq 0 ]
then
	echo "oracle附属组检查通过"
else
	usermod -aG oper oracle
	if [ $? -eq 0 ]
	then
		echo "用oracle用户添加组成功"
	else
		echo -e "\033[31m用oracle用户添加组失败----------Failed\033[0m"
	fi
fi

# 6.14.检查grid用户所属组是否正确
id grid | grep asmadmin > /dev/null 2>&1
if [ $? -eq 0 ]
then
	echo "grid附属组检查通过"
else
	usermod -aG asmadmin grid
	if [ $? -eq 0 ]
	then
		echo "用户 grid 添加组成功"
	else
		echo -e "\033[31m用户 grid 添加组失败----------Failed\033[0m"
	fi
fi

id grid | grep asmdba > /dev/null 2>&1
if [ $? -eq 0 ]
then
	echo "grid附属组检查通过"
else
	usermod -aG asmdba grid
	if [ $? -eq 0 ]
	then
		echo "用户 grid 添加组成功"
	else
		echo -e "\033[31m用户 grid 添加组失败----------Failed\033[0m"
	fi
fi

id grid | grep asmoper > /dev/null 2>&1
if [ $? -eq 0 ]
then
	echo "grid附属组检查通过"
else
	usermod -aG asmoper grid
	if [ $? -eq 0 ]
	then
		echo "用户 grid 添加组成功"
	else
		echo -e "\033[31m用户 grid 添加组失败----------Failed\033[0m"
	fi
fi

id grid | grep dba > /dev/null 2>&1
if [ $? -eq 0 ]
then
	echo "grid附属组检查通过"
else
	usermod -aG dba grid
	if [ $? -eq 0 ]
	then
		echo "用户 grid 添加组成功"
	else
		echo -e "\033[31m用户 grid 添加组失败----------Failed\033[0m"
	fi
fi

# 获取oinstall组的最终ID
GROUPID=`cat /etc/group | grep oinstall | awk -F ":" '{print $3}'`

# 6.15.检查oracle用户主组是否正确
id oracle | grep gid=${GROUPID} > /dev/null 2>&1
if [ $? -eq 0 ]
then
	echo "oracle主组检查通过"
else
	usermod --gid ${GROUPID} oracle
	if [ $? -eq 0 ]
	then
		echo "用户 grid 主组修改成功"
	else
		echo -e "\033[31m用户 oracle 主组修改失败----------Failed\033[0m"
	fi
fi

# 6.16.检查grid用户主组是否正确
id grid | grep gid=${GROUPID} > /dev/null 2>&1
if [ $? -eq 0 ]
then
	echo "oracle主组检查通过"
else
	usermod --gid ${GROUPID} grid
	if [ $? -eq 0 ]
	then
		echo "用户 grid 主组修改成功"
	else
		echo -e "\033[31m用户 grid 主组修改失败----------Failed\033[0m"
	fi
fi


# 7.新建grid和oracle安装目录

mkdir -p ${GRID_BASETemp}
mkdir -p ${GRID_HOMETemp}
mkdir -p ${ORACLE_BASETemp}
chown -R grid:oinstall ${GridOracleHomeTemp}
chown oracle:oinstall ${ORACLE_BASETemp}
chmod -R 775 ${GridOracleHomeTemp}

# 8.配置oracle和grid用户变量
if [ $nodeNum -eq 1 ]
then
	grep 666666 /home/oracle/.bash_profile
	if [ $? -eq 0 ]; then
		cp /home/oracle/.bash_profile.666666 /home/oracle/.bash_profile
	else
		cp /home/oracle/.bash_profile /home/oracle/.bash_profile.666666
	fi

cat <<EOF >>/home/oracle/.bash_profile
#add by 666666
export ORACLE_SID=${ORACLE_SIDTemp}1  # RAC1
export ORACLE_UNQNAME=${ORACLE_UNQNAMETemp}
export ORACLE_BASE=${ORACLE_BASETemp}
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db
export TNS_ADMIN=\$ORACLE_HOME/network/admin
export PATH=/usr/sbin:\$PATH
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
EOF

    grep 666666 /home/grid/.bash_profile
    if [ $? -eq 0 ]; then
        cp /home/grid/.bash_profile.666666 /home/grid/.bash_profile
    else
        cp /home/grid/.bash_profile /home/grid/.bash_profile.666666
    fi

cat <<EOF >>/home/grid/.bash_profile
#add by 666666
export ORACLE_SID=${GRID_SIDTemp}1  # RAC1
export ORACLE_BASE=${GRID_BASETemp}
export ORACLE_HOME=${GRID_HOMETemp}
export PATH=/usr/sbin:\$PATH
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=\$ORACLE_HOME/JRE:\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib
umask 022
EOF

else
    grep 666666 /home/oracle/.bash_profile
    if [ $? -eq 0 ]; then
        cp /home/oracle/.bash_profile.666666 /home/oracle/.bash_profile
    else
        cp /home/oracle/.bash_profile /home/oracle/.bash_profile.666666
    fi

cat <<EOF >>/home/oracle/.bash_profile
#add by 666666
export ORACLE_SID=${ORACLE_SIDTemp}2  # RAC2
export ORACLE_UNQNAME=${ORACLE_UNQNAMETemp}
export ORACLE_BASE=${ORACLE_BASETemp}
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db
export TNS_ADMIN=\$ORACLE_HOME/network/admin
export PATH=/usr/sbin:\$PATH
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
EOF

    grep 666666 /home/grid/.bash_profile
    if [ $? -eq 0 ]; then
        cp /home/grid/.bash_profile.666666 /home/grid/.bash_profile
    else
        cp /home/grid/.bash_profile /home/grid/.bash_profile.666666
    fi

cat <<EOF >>/home/grid/.bash_profile
#add by 666666
export ORACLE_SID=${GRID_SIDTemp}2  # RAC2
export ORACLE_BASE=${GRID_BASETemp}
export ORACLE_HOME=${GRID_HOMETemp}
export PATH=/usr/sbin:\$PATH
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=\$ORACLE_HOME/JRE:\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib
umask 022
EOF
fi

# 9.配置本地YUM并安装依赖包(需要区分6和7)
mkdir -p /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
mv /etc/yum.repos.d/local.repo /etc/yum.repos.d/local.repo.bak
cat <<EOF >/etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt/cdrom
gpgcheck=0
enabled=1
EOF



yum clean all       #清理本地缓存
yum clean plugins   #清理插件缓存


yum install -y binutils-* compat-db* compat-db-* control-center* gcc-* gcc-c++-* glibc-* glibc-common-* gnome-libs-* \
make-* pdksh* sysstat-* xscreensaver-* make-* gdb-6.1post-* glibc-* glibc-common-* glibc-devel-* glibc-devel-* \
compat-gcc-* compat-gcc-c++-* compat-libstdc++-* compat-libstdc++-devel-* gnome-libs-* libstdc++-* libstdc++-devel-* \
openmotif-* sysstat-* setarch-* libaio-* libaio-devel-* libXp* libXp-devel* elfutils-libelf-devel* unixODBC-* \
unixODBC-devel-* compat-libcap1.x86_64 libcap.so.1 sg3_utils

附录2:grid静默安装响应文件

# 此文件从p13390677_112040_Linux-x86-64_2of7.zip提取
# by 6 20181231 QQ:1327133225

oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v11_2_0

# 修改1:当前安装节点的计算机名称----------------------------------------------(重点注意1)
ORACLE_HOSTNAME=rac1

# 修改2:版本信息路径(路径相关可以不修改)
INVENTORY_LOCATION=/u01/app/oraInventory

# 修改3:语言,多选用,隔开(正常来说保持默认即可)
SELECTED_LANGUAGES=en,zh_CN
oracle.install.option=CRS_CONFIG

# 修改4:grid 的 BASE 和 HOME 目录(路径相关可以不修改)
ORACLE_BASE=/u01/app/grid
ORACLE_HOME=/u01/app/11.2.0/grid

oracle.install.asm.OSDBA=asmdba
oracle.install.asm.OSOPER=asmoper
oracle.install.asm.OSASM=asmadmin

# 修改5:scan名称,和hosts对应--------------------------------------------------(重点注意2)
oracle.install.crs.config.gpnp.scanName=rac-scan

# 修改6:集群监听端口号---------------------------------------------------------(重点注意3)
oracle.install.crs.config.gpnp.scanPort=1521

# 修改7:cluster名称,可以保持默认
oracle.install.crs.config.clusterName=rac-cluster

oracle.install.crs.config.gpnp.configureGNS=false
oracle.install.crs.config.gpnp.gnsSubDomain=
oracle.install.crs.config.gpnp.gnsVIPAddress=
oracle.install.crs.config.autoConfigureClusterNodeVIP=false

# 修改8:节点信息,跟hosts对应---------------------------------------------------(重点注意4)
oracle.install.crs.config.clusterNodes=rac1:rac1-vip,rac2:rac2-vip

# 修改9:网卡信息和网段,对应ifconfig结果(两个节点的网卡名称需要一致)----------(重点注意5)
oracle.install.crs.config.networkInterfaceList=eth0:10.0.1.0:1,eth1:11.11.11.0:2

# 存储形式,使用ASM的话保持默认即可(可以不修改)
oracle.install.crs.config.storageOption=ASM_STORAGE

oracle.install.crs.config.sharedFileSystemStorage.diskDriveMapping=
oracle.install.crs.config.sharedFileSystemStorage.votingDiskLocations=
oracle.install.crs.config.sharedFileSystemStorage.votingDiskRedundancy=NORMAL
oracle.install.crs.config.sharedFileSystemStorage.ocrLocations=
oracle.install.crs.config.sharedFileSystemStorage.ocrRedundancy=NORMAL
oracle.install.crs.config.useIPMI=false
oracle.install.crs.config.ipmi.bmcUsername=
oracle.install.crs.config.ipmi.bmcPassword=

# SYS密码
oracle.install.asm.SYSASMPassword=asmadmin

# 修改10:表决盘名称(可以不修改)
oracle.install.asm.diskGroup.name=OCR

# 修改11:表决盘冗余选项(接受以下3个选项)-----------------------------------------(重点注意6)

# HIGH			高冗余:最少5块磁盘,Oracle ASM默认提供三重镜像。可以容忍在不同故障组中丢失两个Oracle ASM磁盘。
# NORMAL		正常冗余:最少3块磁盘,Oracle ASM默认提供双向镜像,这意味着镜像所有文件,以便每个范围有两个副本。容许丢失一个磁盘。
# EXTERNAL		外部冗余:最少1块盘,由外部RAID提供冗余。

oracle.install.asm.diskGroup.redundancy=NORMAL
oracle.install.asm.diskGroup.AUSize=1

# 修改12:表决盘所使用的裸盘,根据需要修改------------------------------------------(重点注意7)
oracle.install.asm.diskGroup.disks=/dev/raw/raw1,/dev/raw/raw2,/dev/raw/raw5

oracle.install.asm.diskGroup.diskDiscoveryString=

# ASMSNMP密码
oracle.install.asm.monitorPassword=asmadmin
oracle.install.crs.upgrade.clusterNodes=
oracle.install.asm.upgradeASM=false
oracle.installer.autoupdates.option=SKIP_UPDATES
oracle.installer.autoupdates.downloadUpdatesLoc=
AUTOUPDATES_MYORACLESUPPORT_USERNAME=
AUTOUPDATES_MYORACLESUPPORT_PASSWORD=
PROXY_HOST=
PROXY_PORT=0
PROXY_USER=
PROXY_PWD=
PROXY_REALM=