Skip to content

Instantly share code, notes, and snippets.

@benzBrake
Created October 24, 2019 11:26
Show Gist options
  • Select an option

  • Save benzBrake/2a7894a5040dff501a68e01fee774147 to your computer and use it in GitHub Desktop.

Select an option

Save benzBrake/2a7894a5040dff501a68e01fee774147 to your computer and use it in GitHub Desktop.
Oracle 12cR2 Single Node Onekey Install Script
#!/bin/bash
export PATH=${PATH}:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:.
# 函数定义
function info() {
echo -e "\e[36m[信息]$*\e[0m"
}
function warn() {
echo -e "\e[33m[警告]$*\e[0m"
}
function error() {
echo -e "\e[31m[错误]$*\e[0m"
}
function getUserRoot() {
cat /etc/passwd | grep ^${1} | awk -F: '{print $6}'
}
function backupfile() {
local POSTFIX=$(date +"%Y%m%d%H%M%S")
[[ ${DEBUG} == "true" ]] && info "备份文件 ${1} 到 $1.${POSTFIX}"
cp -f ${1} ${1}.${POSTFIX}
[[ ${DEBUG} == "true" ]] && echo -ne "\b\bOK"
}
# 默认参数定义
WORKING_DIR=${PWD}
BASE_PATH=/u01/app
DB_VERSION=12.2.0
ORACLE_SID=ORCL
PASSWORD=oracle
PDB_ENABLE=false
PDB_INSTANCE=1
PDB_NAME=PDB
AUTO_START=false
INSTALL_DELAY=200
CREATEDB_DELAY=300
CREATEDB_CHAR=
DEGUG=false
IP_ADDR=$(ip addr | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | grep -v ^127 | grep -v 255$ | head -n1)
# 参数获取
UNKNOWN_ACTION=""
action=$@
for i in "$@"
do
case $i in
-a|--autostart)
AUTO_START="true"
shift
;;
-c=*|--creatadbdelay=*)
CREATEDB_DELAY="${i#*=}"
shift
;;
-C=*|--character=*)
CREATEDB_CHAR="${i#*=}"
shift
;;
-d|--debug)
DEGUG=true
shift
;;
-i=*|--installdelay=*)
INSTALL_DELAY="${i#*=}"
shift
;;
-p=*|--pdbname=*)
PDB_ENABLE=true
PDB_NAME="${i#*=}"
shift
;;
-n=*|--pdbnums=*)
PDB_ENABLE=true
PDB_INSTANCE="${i#*=}"
shift
;;
-k=*|--password=*)
PASSWORD="${i#*=}"
shift
;;
-s=*|--sid=*)
ORACLE_SID="${i#*=}"
shift
;;
-x=*|--prefix=*)
BASE_PATH="${i#*=}"
shift
;;
-h|--help)
cat >&1<<EOF
Usage: $(basename $0) [OPTION[=PATTERN]]"
Oracle 12cR2 (12202) Onekey Installer."
Different OPTION has different PATTERN."
Example: $(basename $0) -s=ZBBB -x=/opt"
==============================================
OPTIONs and PATTERNs"
-d|--debug Enable debug
-a|--autostart Auto mount database at start
-k=STR|--password=STR Password for all oracle user
-s=STR|--sid=STR Oracle SID
-x=STR|--prefix=STR Install directory
-p=STR|--pdbname=STR Database name for ContainerDB
-n=NUM|--pdbnums=NUM ContainerDB nums
-C=STR|--character=STR Database character set
-i=NUM|--installdelay=NUM Delay for install database
software in silent mode
-c=NUM|--creatadbdelay=NUM Delay for create database
in silent mode
Report bugs to Ryan Lieu <github-benzbrake@woai.ru>
Last update: 2019-10-24
EOF
exit 0
;;
*)
UNKNOWN_ACTION="${UNKNOWN_ACTION} ${i}"
shift
;;
esac
done
cat >&1<<EOF
# ======================================================
# Oracle 12cR2 Single Node 一键安装脚本 For CentOS 7.6.1810
# Ryan Lieu <github-benzBrake@woai.ru>
# Filename: onekey_install_oracle_12cR2.sh
# Created: 2019-10-19
# Updated: 2019-10-24
# Website: https://doufu.ru
# ======================================================
# Tips:
# 1、请提前配置好yum源或者手工安装好必须rpm包
# 2、Oracle 自动安装到 ${BASE_PATH/%\//}/oracle下,请确认空间充足
# 3、SID为${ORACLE_SID}
# 4、是否启用PDB:${PDB_ENABLE}
# 5、是否自启动:${AUTO_START}
# 6、如果想要修改默认参数请查看帮助[-h]
EOF
if [[ ! -z ${UNKNOWN_ACTION} ]]; then
echo -n "# 7."
warn "未知参数:[${UNKNOWN_ACTION}]"
fi
cat >&1<<EOF
# ======================================================
EOF
if [[ "${DEGUG}" == "true" ]]; then
set -ex
fi
# 0、检查
[[ $(id -u) != "0" ]] && {
error "请使用 root 用户运行此脚本";
exit 1;
}
if [[ ! -f runInstaller ]]; then
error "请在oracle安装目录执行此文件"
exit 2
fi
OS_VERSION=$(cat /etc/*-release | head -n1 | awk '{print $4}')
if [[ ${OS_VERSION} != "7.6.1810" ]]; then
warn "本脚本仅在CentOS 7.6.1810测试过,当前系统版本:${OS_VERSION}"
fi
read -p "[确认]请确认你的网卡IP[$IP_ADDR]是否正确[Y,n]>" choice
case $choice in
n|N)
while true; do
read -p "[确认]请输入你的网卡IP→" ipaddr
echo ${ipaddr} | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[1-2]\{0,1\}[0-9]\{1,2\}$' &> /dev/null
if [[ $? -eq 0 ]]; then
IP_ADDR=ipaddr
break
else
error "IP输入错误"
fi
done
;;
*)
echo
;;
esac
# 1、关闭防火墙
info "关闭防火墙"
systemctl stop firewalld.service
systemctl disable firewalld.service &> /dev/null
echo -ne "\b\bOK"
# 2、关闭selinux
info "关闭selinux"
setenforce 0
sed -i "s@SELINUX=.*@SELINUX=disabled@g" /etc/selinux/config
echo -ne "\b\bOK"
# 3、参数修改
info "调整参数"
backupfile /etc/sysctl.conf
SYSCTLCONF="fs.aio-max-nr=1048576\nfs.file-max=6815744\nkernel.shmall=2097152\nkernel.shmmax=4294967296\nkernel.shmmni=4096\nkernel.sem=250 32000 100 128\nnet.ipv4.ip_local_port_range=9000 65500\nnet.core.rmem_default=262144\nnet.core.rmem_max=4194304\nnet.core.wmem_default=262144\nnet.core.wmem_max=1048576"
echo -e ${SYSCTLCONF} | awk -F= '{print $1}' | while read key;
do
line="$(echo -e ${SYSCTLCONF} | grep ${key})"
grep "${key}" /etc/sysctl.conf &> /dev/null
if [[ $? -ne 0 ]]; then
echo "${line}" >> /etc/sysctl.conf
else
sed -i "s#^${key}.*#${line}#g" /etc/sysctl.conf
fi
done
sysctl -p &> /dev/null
echo -ne "\b\bOK"
# 4、修改hosts
info "修改hosts"
HOSTSLINE=$(grep $IP_ADDR /etc/hosts)
if [[ -z $HOSTSLINE ]]; then
echo "$IP_ADDR $HOSTNAME" >> /etc/hosts
else
echo $HOSTSLINE | grep $HOSTNAME &> /dev/null
if [[ $? -ne 0 ]];then
sed -i "s#${HOSTSLINE}#${HOSTSLINE} $HOSTNAME#" /etc/hosts
fi
fi
echo -ne "\b\bOK"
# 5、安装依赖包
info "安装依赖包"
yum --disablerepo=\* --enablerepo=c7-media -y install binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*i686 compat-libstdc++-33 compat-libstdc++-33*.devel gcc gcc-c++ glibc glibc*.i686 glibc-devel glibc-devel*.i686 ksh libaio libaio*.i686 libaio-devel libaio-devel*.devel libgcc libgcc*.i686 libstdc++ libstdc++*.i686 libstdc++-devel libstdc++-devel*.devel libXi libXi*.i686 libXtst libXtst*.i686 make sysstat unixODBC unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686 &> /dev/null
for package in binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat unixODBC unixODBC-devel
do
rpm -q $package &> /dev/null
if [[ $? -ne 0 ]]; then
error "$package 未安装,请先安装 $package 。"
exit 1
fi
done
# 6、修改用户限制
info "修改用户限制"
# 6.1 /etc/security/limits.conf
backupfile /etc/security/limits.conf
sed -i "s@^# End of file@@g" /etc/security/limits.conf
sed -i "s#oracle\s*soft\s*nproc.*##g" /etc/security/limits.conf
echo "oracle soft nproc 2047" >> /etc/security/limits.conf
sed -i "s#oracle\s*hard\s*nproc.*##g" /etc/security/limits.conf
echo "oracle hard nproc 16384" >> /etc/security/limits.conf
sed -i "s#oracle\s*soft\s*nofile.*##g" /etc/security/limits.conf
echo "oracle soft nofile 1024" >> /etc/security/limits.conf
sed -i "s#oracle\s*hard\s*nofile.*##g" /etc/security/limits.conf
echo "oracle hard nofile 65536" >> /etc/security/limits.conf
sed -i "s#oracle\s*soft\s*stack.*##g" /etc/security/limits.conf
echo "oracle soft stack 10240" >> /etc/security/limits.conf
sed -i "s#oracle\s*hard\s*stack.*##g" /etc/security/limits.conf
echo "oracle hard stack 10240" >> /etc/security/limits.conf
echo "# End of file" >> /etc/security/limits.conf
# 6.2 /etc/pam.d/login
backupfile /etc/pam.d/login
grep "^[^#]\s*session\s*required\s*/lib64/security/pam_limits.so" /etc/pam.d/login > /dev/null
if [[ $? -ne 0 ]]; then
echo session required /lib64/security/pam_limits.so >> /etc/pam.d/login
fi
grep "^[^#]\s*session\s*required\s*pam_limits.so" /etc/pam.d/login > /dev/null
if [[ $? -ne 0 ]]; then
echo session required pam_limits.so >> /etc/pam.d/login
fi
# 6.3 /etc/profile
cat > /etc/oraprofile<<EOF
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
EOF
grep "\. /etc/oraprofile" /etc/profile > /dev/null
if [[ $? -ne 0 ]]; then
echo ". /etc/oraprofile" >> /etc/profile
fi
source /etc/oraprofile
echo -ne "\b\bOK"
# 7、新建用户
info "新建用户"
groupadd oinstall
groupadd dba
useradd -g oinstall -G dba oracle
echo oracle | passwd --stdin oracle &> /dev/null
# 8、新建目录
info "新建目录"
BASE_PATH=${BASE_PATH/%\//}
mkdir -p ${BASE_PATH}
chown -R oracle:oinstall ${BASE_PATH}
chmod -R 775 ${BASE_PATH}
mkdir -p ${WORKING_DIR}/response/
echo -ne "\b\bOK"
# 9、配置oracle用户环境变量
info "配置oracle用户环境变量"
ORACLE_USER_ROOT="$( getUserRoot oracle )"
ORACLE_USER_ROOT=${ORACLE_USER_ROOT/%\//}
cat > ${ORACLE_USER_ROOT}/.oracleprofile<<EOF
export ORACLE_BASE=${BASE_PATH}/oracle
export ORACLE_SID=${ORACLE_SID}
export ORACLE_HOME=\${ORACLE_BASE}/product/db_${DB_VERSION}
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/usr/lib
export PATH=\${PATH}:\${ORACLE_HOME}/bin
EOF
chown oracle.oinstall ${ORACLE_USER_ROOT}/.oracleprofile
[[ ! -f ${ORACLE_USER_ROOT}/.bash_profile ]] && {
touch ${ORACLE_USER_ROOT}/.bash_profile
chown oracle.oinstall ${ORACLE_USER_ROOT}/.bash_profile
}
grep "\. ~/.oracleprofile" ${ORACLE_USER_ROOT}/.bash_profile > /dev/null
if [[ $? -ne 0 ]]; then
echo ". ~/.oracleprofile" >> ${ORACLE_USER_ROOT}/.bash_profile
fi
echo -ne "\b\bOK"
# 10、安装数据库软件
info "安装数据库软件,请稍后"
chown -R oracle.oinstall ${WORKING_DIR}
rm -rf ${BASE_PATH}/oraInventory
MEM_TOTAL=$(expr $(cat /proc/meminfo | grep MemTotal | awk '{print $2}') / 1024)
MEM_ORACLE=$(expr $(expr ${MEM_TOTAL} \* 4) / 10)
su - oracle <<EOF
cd ${WORKING_DIR}
./runInstaller -silent -force -noconfig -IgnoreSysPreReqs -ignorePrereq -showProgress \
oracle.install.option=INSTALL_DB_SWONLY \
UNIX_GROUP_NAME=oinstall \
INVENTORY_LOCATION=${BASE_PATH}/oraInventory \
SELECTED_LANGUAGES=en,zh_CN \
ORACLE_BASE=${BASE_PATH}/oracle \
ORACLE_HOME=${BASE_PATH}/oracle/product/db_${DB_VERSION} \
oracle.install.db.InstallEdition=EE \
oracle.install.db.DBA_GROUP=dba \
oracle.install.db.OPER_GROUP=oinstall \
oracle.install.db.BACKUPDBA_GROUP=dba \
oracle.install.db.DGDBA_GROUP=dba \
oracle.install.db.KMDBA_GROUP=dba \
oracle.install.db.OSRACDBA_GROUP=dba \
oracle.install.db.config.starterdb.memoryLimit=${MEM_ORACLE} \
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false \
DECLINE_SECURITY_UPDATES=true
EOF
for i in `seq -w ${INSTALL_DELAY} -1 1`
do
echo -ne "\b\b\b$i";
sleep 1;
done
echo -ne "\b\b\b OK"
info "正在执行orainstRoot.sh,请稍后"
${BASE_PATH}/oraInventory/orainstRoot.sh &> /dev/null
echo -ne "\b\b\b OK"
info "正在执行root.sh,请稍后"
${BASE_PATH}/oracle/product/db_${DB_VERSION}/root.sh &> /dev/null
echo -ne "\b\b\b OK"
# 11、安装Oracle服务
info "安装Oracle服务"
cat > /etc/init.d/oracle<<EOF
#!/bin/bash
# oracle: Start/Stop Oracle Database 12c R2
# chkconfig: 345 90 10
# description: The Oracle Database is an Object-Relational Database Management System.
#
. /etc/rc.d/init.d/functions
LOCKFILE=/var/lock/subsys/oracle
ORACLE_HOME=${BASE_PATH}/oracle/product/db_${DB_VERSION}
ORACLE_USER=oracle
case "\$1" in
'start')
if [ -f \$LOCKFILE ]; then
echo \$0 already running.
exit 1
fi
echo -n \$"Starting Oracle Database:"
su - \$ORACLE_USER -c "\$ORACLE_HOME/bin/lsnrctl start"
su - \$ORACLE_USER -c "\$ORACLE_HOME/bin/dbstart \$ORACLE_HOME"
touch \$LOCKFILE
;;
'stop')
if [ ! -f \$LOCKFILE ]; then
echo \$0 already stopping.
exit 1
fi
echo -n \$"Stopping Oracle Database:"
su - \$ORACLE_USER -c "\$ORACLE_HOME/bin/lsnrctl stop"
su - \$ORACLE_USER -c "\$ORACLE_HOME/bin/dbshut"
rm -f \$LOCKFILE
;;
'restart')
\$0 stop
\$0 start
;;
'status')
if [ -f \$LOCKFILE ]; then
echo \$0 started.
else
echo \$0 stopped.
fi
;;
*)
echo "Usage: \$0 [start|stop|status]"
exit 1
esac
exit 0
EOF
chmod +x /etc/init.d/oracle
systemctl daemon-reload
if [[ ${AUTO_START} == "true" ]]; then
systemctl enable oracle &> /dev/null
fi
echo -ne "\b\b\b OK"
# 12、建立监听
info "建立监听"
su - oracle -c "${BASE_PATH}/oracle/product/db_${DB_VERSION}/bin/netca -silent -responsefile ${WORKING_DIR}/response/netca.rsp" &> /dev/null
if [[ $? -ne 0 ]]; then
echo -ne "\b\b\b\b\b\b" && echo -e "\e[31mFailed\e[0m"
else
echo -ne "\b\b\b OK"
fi
# 13、建库
info "创建数据库"
cat > ${WORKING_DIR}/response/sg_dbca.rsp<<EOF
gdbName=${ORACLE_SID}
sid=${ORACLE_SID}
databaseConfigType=SI
createAsContainerDatabase=${PDB_ENABLE}
numberOfPDBs=${PDB_INSTANCE}
pdbName=${PDB_NAME}
pdbAdminPassword=oracle
useLocalUndoForPDBs=true
templateName=General_Purpose.dbc
sysPassword=oracle
systemPassword=oracle
emConfiguration=DBEXPRESS
emExpressPort=5500
runCVUChecks=false
storageType=FS
characterSet=${CREATEDB_CHAR}
listeners=LISTENER
EOF
chown oracle.oinstall ${WORKING_DIR}/response/sg_dbca.rsp
su - oracle <<EOF
${BASE_PATH}/oracle/product/db_${DB_VERSION}/bin/dbca -silent -createDatabase -ignorePreReqs -responsefile ${WORKING_DIR}/response/sg_dbca.rsp
EOF
echo -ne "\b\b\b OK"
if [[ ${AUTO_START}} == "true" ]]; then
info "设置示例随服务启动"
SIDLINE=$(grep "^${ORACLE_SID}" /etc/oratab)
AFTLINE=$(echo "$SIDLINE" | sed "s/:N$/:Y/")
sed -i "s#${SIDLINE}#${AFTLINE}#" /etc/oratab
systemctl enable oracle
echo -ne "\b\b\b OK"
fi
set +ex
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment