centos 7 静默部署oracle 11g

 本文地址:

http://peihexian.iteye.com/blog/2397975

 朋友请求帮忙在linux下面部署oracle 11.2,折腾了两天,整理下脚本以备后用。

1.准备工作

 centos 7 安装时建立一个root以外的账户,我本地虚拟机测试时只选择了最小安装,也没有图形界面,也没有其他账户,在安装完依赖包以后重启时会要求我建立一个root以外的管理员账号,要是linux已经安装完了也无所谓,看到提示时同意许可协议再按提示建账号也是可以的。

2.安装过程

centos 7用的是firewalld防火墙,不是iptables,先禁用firewalld防火墙,后期需要启用时注意放开1521端口。

#systemctl stop firewalld.service
systemctl stop firewalld
systemctl disable firewalld

3.因为我的脚本是在windows 里面编辑的,在通过ssh上传到linux时运行脚本用不了,需要通过dos2unix转一下格式,所以先安装一下dos2unix。

yum install dos2unix

 另外后面解压缩oracle linux 安装zip需要用unzip解压缩工具,同样也安装一下

yum install unzip

4. 上传oracle for linux 两个压缩zip文件到linux里面的/tmp目录中,解压缩准备使用

cd /tmp

unzip linux.x64_11gR2_database_1of2.zip

unzip linux.x64_11gR2_database_2of2.zip

 解压缩以后会在/tmp里面生成database目录。

5.运行静默安装脚本1,用来创建oracle用户及dba,oinstall等组,修改oracle用户.bash_profile里面的环境变量等参数的脚本,vi /tmp/oracle_install.sh  ,脚本内容如下

#!/bin/bash
# oracle 11g R2 for linux 安装辅助脚本
# Redkey
# version 1.2
# date 2017.10.28
#定义常量
SYSCTL=/etc/sysctl.conf
LIMITS=/etc/security/limits.conf
PAM=/etc/pam.d/login
PROFILE=/etc/profile
BASH_PROFILE=/home/oracle/.bash_profile
#循环变量
i=1
#定义显示颜色
#颜色定义 信息(33黄色) 警示(31红色) 过程(36浅蓝)
#判断执行用户是否root
isroot()
{
    if [ $USER != "root" ];then
        echo -e "\n\e[1;31m the user must be root,and now you user is $USER,please su to root. \e[0m"
        exit4
    else
        echo -e "\n\e[1;36m check root ... OK! \e[0m"
    fi
}
#挂在光盘到/mnt/cdrom目录下
mount_cdrom()
{
echo -e "\n\e[1;31m please insert RHEL to CDROM,press any key ...\e[0m"
read -n 1
if [ -d /mnt/cdrom ];then
     mount -t auto -o ro /dev/cdrom /mnt/cdrom
else
    mkdir -p /mnt/cdrom
    mount -t auto -o ro /dev/cdrom /mnt/cdrom
fi
if [ $? -eq 0 ];then
    echo -e "\n\e[1;36m CDROM mount on /mnt/cdrom ... OK! \e[0m"
fi
}
#设置yum本地光盘源
yum_repo()
{
    rm -rf /etc/yum.repos.d/* && cat <<EOF >> /etc/yum.repos.d/Server.repo
[Server]
name=MyRPM
baseurl=file:///mnt/cdrom/Server
enabled=1
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
EOF
if [ $? -eq 0 ];then
echo -e "\n\e[1;36m  /etc/yum.repos.d/Server.repo  ... OK! \e[0m"
fi
}
#添加oracle用户,添加oracle用户所属组oinstall及附加组dba
ouseradd()
{
    if [[ `grep "oracle" /etc/passwd` != "" ]];then
    userdel -r oracle
    fi
    if [[ `grep "oinstall" /etc/group` = "" ]];then
        groupadd oinstall
    fi
    if [[ `grep "dba" /etc/group` = "" ]];then
        groupadd dba
    fi
    useradd oracle -g oinstall -G dba && echo $1 |passwd oracle --stdin
    if [ $? -eq 0 ];then
        echo -e "\n\e[1;36m oracle's password updated successfully  --- OK! \e[0m"
    else
        echo -e "\n\e[1;31m oracle's password set faild.   --- NO!\e[0m"
    fi
}
#检查oracle所需软件包并安装
packagecheck()
{
for package in binutils compat-libcap1 compat-libstdc++ gcc gcc-c++ glibc glibc-devel ksh libgcc libstdc++ libstdc++-devel libaio libaio-devel make sysstat unzip elfutils-libelf elfutils-libelf-devel elfutils-libelf-devel-static kernel-headers unixODBC unixODBC-devel 
    rpm -q $package 2> /dev/null
    if [ $? != 0 ];then
        yum -y install $package
        echo  -e "\n\e[1;36m $package is already installed ... OK! \e[0m"
    fi
done
}
#安装桌面套件 X Window System / Desktop
xdesk()
{
    LANG=C yum -y groupinstall "X Window System" "Desktop"
    if [ $? -eq 0 ];then
        echo  -e "\n\e[1;36m $package is already installed ... OK! \e[0m"
    fi
}
# 设置内核参数
kernelset()
{
    cp $SYSCTL{,.bak} && cat <<EOF >>$SYSCTL
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 4294967295
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048575
EOF
    if [ $? -eq 0 ];then
        echo -e "\n\e[1;36m kernel parameters updated successfully --- OK! \e[0m"
    fi
sysctl -p
}
#设置oracle资源限制
oralimit()
{
    cp $LIMITS{,.bak} && cat <<EOF >> $LIMITS
oracle      soft    nproc   2047
oracle      hard    nproc   16384
oracle      soft    nofile  1024
oracle      hard    nofile  65536
oracle      soft    stack   10240
EOF
    if [ $? -eq 0 ];then
        echo  -e "\n\e[1;36m $LIMITS updated successfully ... OK! \e[0m"
    fi
}
#设置login文件
setlogin()
{
    cp $PAM{,.bak} && cat <<EOF >>$PAM
session     required    pam_limits.so
EOF
    if [ $? -eq 0 ];then
        echo -e "\n\e[1;36m  $PAM updated successfully ... OK! \e[0m"
    fi
}
#设置profile文件
setprofile()
{
    cp $PROFILE{,.bak} && cat <<EOF >>$PROFILE
if [ $USER = "oracle" ];then
    if [ $SHELL = "/bin/ksh" ];then
        ulimit -p 16384
        ulimit -n 65536
    else
        ulimit -u 16384 -n 65536
    fi
fi
EOF
    if [ $? -eq 0 ];then
        echo -e "\n\e[1;36m  $PROFILE updated successfully ... OK! \e[0m"
    fi
}
#设置oracle的profile文件
setbash_profile()
{
    cp $BASH_PROFILE{,.bak} && cat <<EOF >> $BASH_PROFILE
umask 022
ORACLE_BASE=$1
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
ORACLE_SID=$2
PATH=$ORACLE_HOME/bin/:$PATH
LANG=en_US.UTF-8
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH
EOF
    if [ $? -eq 0 ];then
        echo -e "\n\e[1;36m $BASH_PROFILE updated successfully ... OK! \e[0m"
    fi
. $BASH_PROFILE
}
#系统环境检查
oscheck()
{
#查看内存大小是否大于1G
echo -e "\n check MEM Size ..."
if [ `cat /proc/meminfo | grep MemTotal | awk '{print $2}'` -lt 1048576 ];then
    echo  -e "\n\e[1;33m Memory Small \e[0m"
    exit 1
else
    echo -e "\n\e[1;36m Memory checked PASS \e[0m"
fi
#查看tmp空间大小
echo -e "\n check tmpfs Size ..."
cp /etc/fstab{,.bak}
while true;do
if [ `df | awk '/tmpfs/ {print $2}'` -lt 1048576 ];then
    echo -e "\n\e[1;33m tmpfs Smaill \e[0m"
    sed -i '/tmpfs/s/defaults/defaults,size=1G/' /etc/fstab && mount -o remount /dev/shm
    if [ $? != 0 ];then
    i=i+1
        if [ $i -eq 3 ];then
            echo -e "\n\e[1;31m set tmpfs faild. \e[0m"
            exit 3
        fi
    else
        echo -e "\n\e[1;36 tmpfs updated successfully. \e[0m"
        break
    fi
else
    echo -e "\n\e[1;36m tmpfs checked PASS \e[0m"
    break
fi
done
}
#停止防火墙IPTABLES
service iptables stop
chkconfig iptables off
#关闭SELINUX
cp /etc/selinux/config{,.bak} && sed -i '/SELINUX/s/enforcing/disabled/;/SELINUX/s/permissive/disabled/'   /etc/selinux/config
setenforce 0
#执行以上函数
isroot
oscheck
#yum_repo
#mount_cdrom
packagecheck
xdesk
kernelset
oralimit
setlogin
setprofile
echo -e "\n\e[1;33m please input oracle's user passwd: \e[0m"
read oraclepw
ouseradd $oraclepw
setbash_profile
echo -e "\n\e[1;33m please input oracle install PATH(default /oracle/db) \e[0m"
read oraclepath
if [ -z $oraclepath ];then
    oraclepath=/oracle/db
fi
echo -e "\n\e[1;33m  please input oracle_sid (default police) \e[0m"
read orasid
if [ -z orasid ];then
    orasid=police
fi
setbash_profile $oraclepath $orasid
mkdir -p $oraclepath && chown -R oracle:oinstall $oraclepath && chmod -R 755 $oraclepath
unset i
echo -e "\n\e[1;35m Oracle install pre-setting finish! && please run oracle installer as user oracle \e[0m"

  要是在windows平台编辑的oracle_install.sh脚本文件或者下载附件传到/tmp目录使用的话,需要运行dos2unix oracle_install.sh 修改字符编码格式,否则执行脚本会报错。

上面脚本中默认将oracle软件安装到/oracle/db目录,oracle sid默认是police,这两个参数根据自己的项目需要进行修改,注意后边要反复使用这两个参数的值,一定要记好自己将oracle文件安装到哪个路径去了,SID也要记好。

6.给脚本权限,运行

chmod 777 /tmp/oracle_install.sh

/tmp/oracle_install.sh

 7.脚本运行后,再次修改一些环境变量参数

su - oracle

vi .bash_profile

   上面的oracle_install.sh脚本自动创建的oracle .bash_profile文件内容有问题,一个是重复,另外参数值也需要修改,修改ORACLE_BASE为oracle安装路径,如脚本默认的/oracle/db,修改ORACLE_HOME值,如/oracle/db/product/11.2.0/db_1 ,修改SID值,如police,删除掉重复的配置参数值后保存。

source .bash_profile

   执行以上命令让修改的配置立即生效。

8.切回root用户,给oracle用户读取安装源的权限

su - root
chmod -R 777 /tmp/database
chown -R oracle:oinstall /tmp/database

9.切换到oracle 用户,修改静默安装参数文件内容

su - oracle
vi /tmp/database/response/db_install.rsp

  需要修改的关键参数有:

oracle.install.option=INSTALL_DB_SWONLY   #这个用于说明只安装软件,先不创建数据库呢
ORACLE_HOSTNAME=oracle  # 当前oracle主机hostname
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/oracle/db/oraInventory #这个注意在前面修改了ORACLE_BASE值的话这里也要改一下,用ORACLE_BASE下面的子路径会在安装时有个警告,要是确实要放到ORACLE_BASE以外的路径的话,注意需要自己手动创建及给oracle用户及dba,oinstall组写入权限,没有特殊需求就放到ORACLE_BASE路径下就行了。

SELECTED_LANGUAGES=en,zh_CN,zh_TW
ORACLE_HOME=/oracle/db/product/11.2.0/db_1  #这个要设置的和oracle用户的.bash_profile里面的配置参数一致。
ORACLE_BASE=/oracle/db #这个也是,和oracle用户的.bash_profile里面的配置值一样
oracle.install.db.InstallEdition=EE  #安装企业版
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oinstall
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE  #别动脑筋整什么自定义,这个是直接拷贝复制文件,没有执行建库脚本过程,巨快。
oracle.install.db.config.starterdb.globalDBName=police   #数据库名称,我们是给公安用的,你们自己改成自己的。

oracle.install.db.config.starterdb.SID=police  #还是,改成和oracle用户.bash_profile里面的值一样。
oracle.install.db.config.starterdb.characterSet=ZHS16GBK 
oracle.install.db.config.starterdb.memoryOption=true 
oracle.install.db.config.starterdb.password.ALL=123456   #这个密码是sys和system用户的密码,改成自己想要的值.
改到这应该就差不多了,要是安装不了用我提供的附件文件吧。

10.好了,万事具备,开始把oracle软件安装到linux系统中吧

su - oracle
cd /tmp/database
./runInstaller -silent -ignorePrereq -responseFile /tmp/database/response/db_install.rsp

   会有个警告,不用搭理,耐心的等着吧,等啥时候屏幕提示你另外需要用root用户执行脚本的时候,另外开个ssh窗口或者终端窗口,按照屏幕提示的内容去执行两个sh脚本即可(需要用root用户去执行)

#脚本名称叫啥记不住了,你就看那边屏幕提示的是啥就去执行啥就行了,好像第二个是root.sh什么什么的
/oracle/db/xxxx/xxx.sh
/oracle/db/xxxx/root.sh

    这边两个脚本执行完成以后,回到那边按回车就算完事,oracle软件安装这就结束了。

11.创建监听器

su - oracle
/oracle/db/product/11.2.0/db_1/bin/netca /silent /responseFile /tmp/database/response/netca.rsp

    

    我这边估计是哪些步骤配置有问题,缺实例名称,创建出来的监听器配置参数listener.ora还需要进一步修改,后面再说。 

12.dbca建库

   修改dbca静默建库参数文件

su - oracle
vi /tmp/database/response/dbca.rsp

需要修改的参数名称及内容如下:

GDBNAME = "police"
SID = "police"
SYSPASSWORD = "123456"    #SYS用户密码,注意和前面的一样
SYSTEMPASSWORD = "123456" #SYSTEM用户密码
CHARACTERSET = "ZHS16GBK"

开始建库,注意用oracle用户执行以下命令

su - oracle
/oracle/db/product/11.2.0/db_1/bin/dbca -silent -responseFile /tmp/database/response/dbca.rsp

13.建完以后,修改以下listener.ora 文件内容,把实例加进去

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc) 
      (Oracle_HOME = /oracle/db/product/11.2.0/db_1)
      (PROGRAM = extproc) 
     )
  (SID_DESC =
      (GLOBAL_DBNAME = police)
      (ORACLE_HOME = /oracle/db/product/11.2.0/db_1)
      (SID_NAME = police)
    )
)

14 启动监听器,启动数据库

su - oracle #注意以下命令用oracle用户执行
/oracle/db/product/11.2.0/db_1/bin/lsnrctl stop LISTENER
/oracle/db/product/11.2.0/db_1/bin/lsnrctl start LISTENER

sqlplus / as sysdba
startup;

   到这客户机就可以访问oracle服务器了。

15.配置oracle为开机启动的linux服务

su - root
vi /etc/init.d/oracle

  脚本内容为:

#!/bin/bash
#chkconfig: 2345 80 90
#description:auto_run
### END INIT INFO
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export ORACLE_USER=oracle
export ORACLE_BASE=/oracle/db
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=police


# see how we are called:
case $1 in
    start)
    su - "$ORACLE_USER"<<EOO
    lsnrctl start
    sqlplus /nolog<<EOS
    connect / as sysdba
    startup
EOS
    emctl start dbconsole
EOO
touch /var/lock/subsys/$scriptname
    ;;
    stop)
su - "$ORACLE_USER"<<EOO
    lsnrctl stop
    sqlplus /nolog<<EOS
    connect / as sysdba
    shutdown immediate
EOS
    emctl stop dbconsole
EOO
rm -f /var/lock/subsys/scriptname
    ;;
    *)
    echo "Usage: $0 {start|stop}"
    ;;
esac

    保存以上脚本后,设置权限等

    

chown root.root /etc/init.d/oracle
chmod 755 /etc/init.d/oracle
service oracle start  #启动服务
chkconfig oracle on   #设置为开机自动启动

16.后边还有一些oracle参数可以进一步优化,如关闭审计,归档,修改最大连接用户数等,为了便于编辑,可以考虑安装一个支持sqlplus命令上下滚动的程序,具体见这里

http://blog.itpub.net/16381228/viewspace-758767/

//关闭空表不分配表空间的问题

alter system set deferred_segment_creation=false;

//关闭审计

alter system set audit_trail=FALSE scope=spfile;

shutdown immediate;

startup mount;

//关闭归档

alter database noarchivelog;

alter database open;