您的位置:首页 > 数据库 > Oracle

分享一个Linux下安装ASM+ORACLE的自动化脚本(二)

2015-09-13 15:35 453 查看
  在安装好linux操作系统并配置好静态IP之后,完整的Linux下 ASM+ORACLE安装大致分为如下三大部分:

 一、前期准备配置工作,需要使用root用户进行

【01】配置hosts映射

【02】检查并配置yum源并安装所需软件包

【03】创建oracle、grid 用户及对应组

【04】配置安全限制

【05】是否配置登录验证限制

【06】是否配置系统环境变量

【07】是否创建相应目录

【08】是否配置grid、oracle用户的环境变量

   添加好 ASM磁盘组所需磁盘,并重启系统    

【09】是否安装并配置oracleasm

【10】是否开始对ASM所需磁盘进行分区

【11】根据磁盘分区创建ASM磁盘

二、Grid infrastructure 安装

三、Oracle数据库软件安装及数据库创建

如上具体步骤不再详述。这里仅提供一个参考的文章  Oracle11gR2+ASM安装详细操作

     下面步入正题开始分享shell脚本,脚本分也分三部分 Oracle_Install_root.sh、Oracle_Install_grid.sh、Oracle_Install_oracle.sh 

      百度云盘下载地址

     在执行脚本之前,建议做如下确定一个在自己笔记本上可以携带的ftp server 或者web server站点,以方便后面配置为yum源 获取相关的 安装包。当然脚本亦支持官网的yum源、官网的下载地址,前提是得保证你的服务器连得上公网,这在生产环境显然是不被允许的。

我在编写调试该脚本时 使用的是在另一个Linux主机上搭建的 ftp server,把安装过程中可能用到的安装介质都放在一个源中,对于经常要安装数据库的DBA来说是十分方便的。

目录结构如下

 


把Oracle_Install_root.sh脚本上传到 服务器中

 初始执行,预览结构如下图

   


Oracle_Install_root.sh脚本源代码如下

 

#!/bin/bash
###########配置hosts#############################################
read -p "【01】是否配置hosts映射[Y|N]?
" hosts_answer
case $hosts_answer in
Y | y)
echo "正在配置hosts文件"
host_name=`hostname`
ipstring=`ifconfig eth0 | gawk -F: '{print $2}' | sed '3,8d' | sed '1d' | gawk '{ print $1}'`
IP=1
function get_inputip {
read -p "请指定为$host_name添加记录的IP地址:[$ipstring] : " IP
check_ip
}
function check_ip {
if [ $IP != "" ]
then
local answer="Y"
read -p "确认添加hosts记录 $IP $host_name $host_name.localdomain[Y/N]?[Y]"  answer
case $answer in
Y | y)
add_hosts;;
N | n)
get_inputip;;
*)
get_inputip;;
esac
else
read -p "确认添加hosts记录 $ipstring  $host_name $host_name.localdomain[Y/N]?"  answer
case $answer in
Y | y)
IP=$ipstring
add_hosts;;
N | n)
get_inputip;;
*)
get_inputip;;
esac
fi
}
function add_hosts {
if `echo "$IP $host_name $host_name.localdomain" >> /etc/hosts`
then
echo "添加hosts记录成功!"
else
echo "添加记录失败,请手动添加,文件/etc/hosts "
fi
}
get_inputip ;;
N | n)
echo "已跳过hosts配置";;
*)
echo "已跳过hosts配置";;
esac

##########配置yum源#############################################
#####oracle_linux6.5下适用方法##################################
function chk_cre_yum {
os_ver=`cat /etc/issue | sed '2d' | gawk '{ print \$5}' | gawk -F. '{print \$1}'`
if  [ $os_ver -eq 6 ]
then
if `yum clean all > yum_check.log && yum makecache >> yum_check.log`
then
echo "yum源可用"
else
echo "yum源不可用,开始配置yum源"
sed -e 's!enabled=1!enabled=0!; s!enabled=$uekr3!enabled=0!; s!enabled=$uek!enabled=0!' /etc/yum.repos.d/public-yum-ol6.repo >> /etc/yum.repos.d/public-yum-ol6.repo.new
rm -rf /etc/yum.repos.d/public-yum-ol6.repo
mv /etc/yum.repos.d/public-yum-ol6.repo.new /etc/yum.repos.d/public-yum-ol6.repo
read -p "请输入新的repo源英文名称: " repo_name
read -p "请输入repo源的baseurl: " baseurl
if `echo "[$repo_name]
name=$repo_name
baseurl=$baseurl
gpgcheck=0
enabled=1" >> /etc/yum.repos.d/public-yum-ol6.repo`
then
echo "新配置成功"
chk_cre_yum
else
echo "配置失败"
fi

fi
fi
######oracle_linux 5.8下适用########################
if [ $os_ver -eq 5 ]
then
file_name=`ls /etc/yum.repos.d/ | sed -n '/\.repo/p'`
first_file=`echo $file_name | gawk '{print \$1}'`
if [ "$file_name" != "" ]
then
if `yum clean all > yum_check.log && yum makecache >> yum_check.log`
then
echo "yum源可用"
else
echo "yum源不可用,开始配置yum源"
for file in $file_name
do
sed -e 's!enabled=1!enabled=0!; s!enabled=$uekr3!enabled=0!; s!enabled=$uek!enabled=0!' /etc/yum.repos.d/$file >> /etc/yum.repos.d/$file.new
rm -rf /etc/yum.repos.d/$file
mv /etc/yum.repos.d/$file.new /etc/yum.repos.d/$file
done
read -p "请输入新的repo源英文名称: " repo_name
read -p "请输入repo源的baseurl: " baseurl
if `echo "[$repo_name]
name=$repo_name
baseurl=$baseurl
gpgcheck=0
enabled=1" >> /etc/yum.repos.d/$first_file`
then
echo "新配置成功"
chk_cre_yum
else
echo "配置失败"
fi
fi
else
read -p "请输入新的repo源英文名称: " repo_name
read -p "请输入repo源的baseurl: " baseurl
if `echo "[$repo_name]
name=$repo_name
baseurl=$baseurl
gpgcheck=0
enabled=1" >> /etc/yum.repos.d/public-yum-ol5.repo`
then
echo "新配置成功"
chk_cre_yum
else
echo "配置失败"
fi
fi

fi
}

read -p "【02】是否检查并配置yum源并安装所需软件包[Y|N]?
?" yum_answer
case $yum_answer in
Y | y)
if `chk_cre_yum >> yum_check.log`
then
echo "开始安装oracle必须软件包"
if ` yum install kernel binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers kernel-headers ksh libaio libaio-devel libgcc libgomp libstdc+*  make numactl-devel sysstat libXp-1*  compat-libcap1.x86_64 elfutils-libelf-devel* unixODBC-devel unixODBC  -y >> yum_check.log`
then
echo "安装oracle必须软件包成功"
else
echo "安装oracle必须软件包失败"
fi
else
echo "出现异常,请排查"
fi;;
N | n)
echo "已跳过yum源检查及软件包安装";;
*)
echo "已跳过yum源检查及软件包安装";;
esac

4000

############正在创建oracle、grid用户及对应组#####################
read -p "【03】是否创建oracle、grid 用户及对应组[Y/N]?
" user_answer
case $user_answer in
Y | y)
echo "开始创建oracle、grid用户及对应组"
if `groupadd oinstall`
then
echo "成功创建组 oinstall"
else
echo "创建组 oinstall 失败"
fi
if `groupadd dba`
then
echo "成功创建组 dba"
else
echo "创建组 dba 失败"
fi
if `groupadd asmadmin`
then
echo "成功创建组 asmadmin"
else
echo "创建组 asmadmin 失败"
fi
if `groupadd asmdba`
then
echo "成功创建组 asmdba"
else
echo "创建组 asmdba 失败"
fi
if `useradd -g oinstall -G asmdba,asmadmin,dba grid`
then
echo "创建用户grid并指定 默认组 oinstall 所属组 asmdba,asmadmin,dba成功"
else
echo "创建用户 grid失败"
fi
if `useradd -g oinstall -G asmdba,dba oracle`
then
echo "创建用户oracle并指定 默认组 oinstall 所属组 asmdba,dba成功"
else
echo "创建用户 oracle失败"
fi
#echo "请指定用户grid的密码:"
passwd grid
#echo "请指定用户oracle的密码:"
passwd oracle;;
N | n)
echo "已跳过用户及组的创建";;
*)
echo "已跳过用户及组的创建";;
esac

###########配置安全限制###########################################
read -p "【04】是否配置安全限制[Y/N]?
" secu_answer
case $secu_answer in
Y | y)
echo "正在配置安全限制"
if `echo "#====================oracle11gr2======================
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536" >> /etc/security/limits.conf`
then
echo "新增oracle、gird用户限制配置成功!"
else
echo "请手动检查配置文件 /etc/security/limits.conf"
fi;;
N | n)
echo "已跳过安全配置步骤";;
*)
echo "已跳过安全配置步骤";;
esac

###########配置登录验证机制########################################
read -p "【05】是否配置登录验证限制[Y/N]?
" login_answer
case $login_answer in
Y | y)
echo "正在配置登录验证机制"
if `echo "#=================oracle11gr2=====================
session required pam_limits.so" >> /etc/pam.d/login`
then
echo "配置登录机制成功"
else
echo "配置登录机制失败"
fi;;
N | n)
echo "已跳过登录验证机制配置步骤";;
*)
echo "已跳过登录验证机制配置步骤";;
esac

###########配置系统环境变量#########################################
read -p "【06】 是否配置系统环境变量[Y/N]?
" sys_answer
case $sys_answer in
Y | y)
echo "正在配置oracle、grid 的系统环境变量"
if `echo '#===================oracle11gr2=====================
if [ \$USER = "oracle" ] || [ \$USER = "grid" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi' >> /etc/profile`
then
echo "配置成功"
else
echo "配置失败"
fi;;
N | n)
echo "已跳过系统环境变量配置步骤";;
*)
echo "已跳过系统环境变量配置步骤";;
esac

############创建相应目录#############################################
read -p "【07】是否创建相应目录[Y/N]?
" dir_answer
case $dir_answer in
Y | y)
echo "开始创建目录"
if `mkdir -p /u01/app/oracle && chown -R oracle:oinstall /u01 && chmod -R 775 /u01`
then
echo "创建oracle安装目录成功"
else
echo "创建oracle安装目录失败"
fi
if `mkdir -p /u02/app/grid && chown -R grid:oinstall /u02 && chmod -R 775 /u02`
then
echo "创建grid安装目录成功"
else
echo "创建grid安装目录失败"
fi;;
N | n)
echo "已跳过相应目录创建步骤";;
*)
echo "已跳过相应目录创建步骤";;
esac

#############配置grid、oracle用户的环境变量##########################
read -p "【08】是否配置grid、oracle用户的环境变量[Y/N]?
" usre_answer
case $usre_answer in
Y | y)
echo "开始配置 grid用户的环境变量"
if `echo '#========================oracle11ggrid ========================
umask 022
TMP=/tmp
TMPDIR=/tmp
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ORACLE_BASE=/u02/app/grid
ORACLE_HOME=\$ORACLE_BASE/11.2.0
ORACLE_SID=+ASM
PATH=\$ORACLE_HOME/bin:\$PATH
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH TMP TMPDIR
stty erase ^h' >> /home/grid/.bash_profile`
then
echo "配置grid用户环境变量成功"
else
echo "配置grid用户环境变量失败"
fi

echo "开始配置oracle用户的环境变量"
if `echo '#======================oracle11gr2=========================
umask 022
TMP=/tmp
TMPDIR=/tmp
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
LD_LIBRARY_PATH=/usr/lib:/usr/X11R6/lib
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db_1
ORACLE_SID=orcl
LD_LIBRARY_PATH=\$ORACLE_HOME/jdk/jre/lib/i386:\$ORACLE_HOME/jdk/jre/lib/i386/server:\$ORACLE_HOME/rdbms/lib:\$ORACLE_HOME/lib:\$LD_LIBRARY_PATH
PATH=\$ORACLE_HOME/bin:\$PATH
NLS_LANG=American_America.ZHS16GBK
export ORACLE_BASE ORACLE_HOME ORACLE_SID LD_LIBRARY_PATH PATH NLS_LANG TMP TMPDIR
stty erase ^h' >> /home/oracle/.bash_profile`
then
echo "配置oracle用户环境变量成功"
else
echo "配置oracle用户环境变量失败"
fi;;
N | n)
echo "已跳过用户变量配置步骤";;
*)
echo "已跳过用户变量配置步骤";;
esac

##########后续提示###################################################
echo "          环境配置工作已经完成,请确认已经添加好 ASM磁盘组所需磁盘,并重启系统!    "

##########安装oracleasm-support 、oracleasm 、oracleasmlib###################################################
read -p "【09】是否安装并配置oracleasm[Y/N]?
" asm_answer
case $asm_answer in
Y | y)
echo "正在从yum源中安装 oracleasm-support"
yum install oracleasm-support -y
#针对低版本内核 需要执行下面的安装
yum install oracleasm* -y
if `rpm -q oracleasmlib >> yum_check.log `
then
echo "系统已经安装了 oracleasmlib"
else
read -p  "请输入下载oracleasmlib rpm的URL地址: " ASMLIB_URL
wget $ASMLIB_URL
echo "开始安装 Asmlib rpm"
rpm -ivh oracleasmlib*
fi
echo "开始配置ASM   Default user: grid  Default group: asmadmin"
function asmconfig {
/etc/init.d/oracleasm configure
if `/usr/sbin/oracleasm init`
then
echo "asm配置成功"
else
asmconfig
fi
}
asmconfig;;
N | n)
echo "已跳过oracleasm安装及配置步骤";;
*)
echo "已跳过oracleasm安装及配置步骤";;
esac
##########开始对新磁盘进行分区###########################################
read -p "【10】是否开始对ASM所需磁盘进行分区[Y/N]?
" disk_answer
case $disk_answer in
Y | y)
echo "开始为电脑磁盘分区,如系统未识别出磁盘,请确定磁盘已正常添加并重启计算机"
disk_string="null"
function getdisks {
ls /dev/sd?
read -p "请输入要使用的磁盘绝对路径,多个磁盘使用空格进行分割,本脚本会帮助你进行磁盘分区: " disk_string
for disk in $disk_string
do
echo "磁盘:$disk"
done
}
function f_disks {
for disk in $disk_string
do
echo "开始对磁盘$disk进行分区"
fdisk $disk
done
}
getdisks
function checkdisks {
read -n1 -p "确认上述磁盘选择无误,针对上述磁盘进行分区[Y/N]?[Y]" answer
case $answer in
Y | y)
echo "下面开始对所选择磁盘进行分区"
f_disks;;
N | n)
echo "请重新指定磁盘"
getdisks
checkdisks;;
*)
echo "下面开始对所选择磁盘进行分区"
f_disks;;
esac
}
checkdisks;;
N | n)
echo "已跳过磁盘分区步骤";;
*)
echo "已跳过磁盘分区步骤";;
esac
##########开始创建ASM磁盘###########################################
read -p "【11】是否开始根据磁盘分区创建ASM磁盘[Y/N]?
" asmdisk_answer
case $asmdisk_answer in
Y | y)
echo "开始创建ASM磁盘"
diskp_string="null"
function getdiskps {
ls   /dev/sd??
read -p "请输入要使用的分区后的磁盘绝对路径,多个磁盘使用空格进行分割,本脚本会帮助你创建ASM磁盘: " diskp_string
for diskp in $diskp_string
do
echo "磁盘分区:$diskp"
done
}
function create_asmdisks {
i=0
for diskp in $diskp_string
do
echo "开始创建ASM磁盘ASM0$i"
oracleasm createdisk ASM0$i $diskp
i=$[ $i + 1 ]
done
}

getdiskps

function checkdiskps {
read -n1 -p "确认上述磁盘分区选择无误,系统将在上述分区中创建ASM磁盘[Y/N]?[Y]" answerp
case $answerp in
Y | y)
echo "下面开始针对分区创建ASM磁盘"
create_asmdisks;;
N | n)
echo "请重新指定磁盘"
getdiskps
checkdiskps;;
*)
echo "下面开始对所选择磁盘进行分区"
create_asmdisks;;
esac
}

checkdiskps;;
N | n)
echo "已跳过ASM磁盘创建步骤";;
*)
echo "已跳过ASM磁盘创建步骤";;
esac

##############修复grid在oracle_linux 6.5上安装时的bug########################################
os_ver=`cat /etc/issue | sed '2d' | gawk '{ print \$5}' | gawk -F. '{print \$1}'`
if  [ $os_ver -eq 6 ]
then
if `echo '# Oracle OHASD startup
start on runlevel [35]
stop on runlevel [!35]
respawn
exec /etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null'  > /etc/init/oracle-ohasd.conf`
then
echo "修复成功"
else
echo "修复失败"
fi
elif [ $os_ver -eq 5 ]
then
echo "该版本无需修复"
fi


Oracle_Install_grid.sh源代码如下:

#!/bin/bash
grid_load_url="null"
function wget_grid_url {
echo "通过网络获取Oracle_grid安装包"
read -p "请输入完整的grid安装包下载地址:" grid_load_url
echo $grid_load_url
}

function grid_url_check {
read -p "是否从该网络地址中下载安装包$grid_load_url [Y/N]? [Y]" gridurl_answer
case $gridurl_answer in
Y | y)
wget $grid_load_url;;
N | n)
wget_grid_url;;
*)
wget $grid_load_url;;
esac
}

function unzip_grid {
echo "开始解压安装包"
unzip /home/grid/*grid.zip
}

function install_grid {
export LANG=en_US.UTF-8
read -p "请去确认已使用root用户执行了 xhost + 命令!!![Y/N] [Y]" xhost_answer
case $xhost_answer in
Y | y)
/home/grid/grid/runInstaller;;
N | n)
sleep 3
install_grid;;
*)
/home/grid/grid/runInstaller;;
esac
}

current_user=`who am i | gawk '{print $1}'`
current_dir=`pwd`
if [ $current_user = 'grid' ] && [ $current_dir = '/home/grid' ]
then
wget_grid_url
grid_url_check
unzip_grid
install_grid
crsctl modify resource "ora.cssd" -attr "AUTO_START=1"
crsctl modify resource "ora.diskmon" -attr "AUTO_START=1"
else
echo "当前终端会话原始用户为$current_user,安装必须使用grid用户直接建立的会话"
echo "执行脚本当前所在目录为$current_dir,脚本要求必须是在grid用户的家目录,/home/grid"
fi


Oracle_Install_oracle.sh源代码如下:
#!/bin/bash
oracle_load_url="null"
function wget_oracle_url {
echo "通过网络获取Oracle安装包"
read -p "请输入完整的oracle安装包下载地址,若为多个下载地址请用空格隔开:" oracle_load_url
for oracle_url in $oracle_load_url
do
echo $oracle_url
done
}

function oracle_url_check {
read -p "是否从该网络地址中下载安装包 [Y/N]? [Y]" oracleurl_answer
case $oracleurl_answer in
Y | y)
for oracle_url in $oracle_load_url
do
wget $oracle_url
done;;
N | n)
wget_oracle_url;;
*)
for oracle_url in $oracle_load_url
do
wget $oracle_url
done;;
esac
}

function unzip_oracle {
echo "开始解压安装包"
database_string=`ls /home/oracle/ | grep linux.x64_11gR2_database`
for dbfile in $database_string
do
unzip $dbfile
done
echo "数据库安装文件解压完成"
}

function install_oracle {
export LANG=en_US.UTF-8
read -p "请去确认已使用root用户执行了 xhost + 命令!!![Y/N] [Y]" xhost_answer
case $xhost_answer in
Y | y)
/home/oracle/database/runInstaller;;
N | n)
sleep 3
install_oracle;;
*)
/home/oracle/database/runInstaller;;
esac
}

current_user=`who am i | gawk '{print $1}'`
current_dir=`pwd`
if [ $current_user = 'oracle' ] && [ $current_dir = '/home/oracle' ]
then
wget_oracle_url
oracle_url_check
unzip_oracle
install_oracle
else
echo "当前终端会话原始用户为$current_user,安装必须使用oracle用户直接建立的会话"
echo "执行脚本当前所在目录为$current_dir,脚本要求必须是在oracle用户的家目录,/home/oracle"
fi


下面将会通过one by one 来详细说明并演示 脚本的使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息