概述
闲来无事,把Oracle11g的自动部署脚本也写了,仅供参考。
19c的后面抽空再写了…
这里主要是考虑单机的,因为RAC的手动去装会好点,且没相关需求,就懒得写了…
一、自动部署脚本:
环境:centos7
1、整体安装步骤如下:
[1]配置主机名和hosts文件
[2]禁用selinux和防火墙
[3]配置Swap内存
[4]下载安装包
[5]安装依赖包
[6]创建用户&文件夹及授权
[7]禁用avahi服务
[8]禁用透明大页和numa
[9]禁用NetworkManager
[10]配置sysctl.conf
[11]配置nsysctl.conf
[12]配置limits.conf
[13]配置pam.d认证
[14]配置/dev/shm
[15]安装rlwrap
[16]配置环境变量
[17]解压安装包
[18]安装数据库软件
[19]创建数据库实例
[20]数据库参数初始化
[21]数据库归档及闪回配置
[22]配置数据库开机启动
[23]配置数据库归档脚本
[24]配置数据库备份脚本
[25]配置密码生命周期
[26]配置低版本数据库连接
2、实用脚本
#!/bin/bash
####################################################
#copyright by hwb
#Date:2021-08-19
#Function: Oracle 11g(Single) install on Linux 7
####################################################
#Oracle安装步骤:
#[1]配置主机名和hosts文件
#[2]禁用selinux和防火墙
#[3]配置Swap内存
#[4]下载安装包
#[5]安装依赖包
#[6]创建用户&文件夹及授权
#[7]禁用avahi服务
#[8]禁用透明大页和numa
#[9]禁用NetworkManager
#[10]配置sysctl.conf
#[11]配置nsysctl.conf
#[12]配置limits.conf
#[13]配置pam.d认证
#[14]配置/dev/shm
#[15]安装rlwrap
#[16]配置环境变量
#[17]解压安装包
#[18]安装数据库软件
#[19]创建数据库实例
#[20]数据库参数初始化
#[21]数据库归档及闪回配置
#[22]配置数据库开机启动
#[23]配置数据库归档脚本
#[24]配置数据库备份脚本
#[25]配置密码生命周期
#[26]配置低版本数据库连接
####################################################
# Parameters For Install
####################################################################################
#Oracle Install Mode(Single)
#RELS=$(more /etc/system-release)
#OS_VER_PRI=$(echo "${RELS#*release}" | awk '{print $1}' | cut -f 1 -d '.')
DAYTIME=$(date +%Y%m%d)
memTotal=$(grep MemTotal /proc/meminfo | awk '{print $2}')
swapTotal=$(grep -i 'swaptotal' /proc/meminfo | awk '{print $2}')
shmTotal=$(df -k /dev/shm | awk '{print $2}' | head -n 2 | tail -n 1)
ORA_HOSTNAME="dfwlg_tms_prod"
PUBLICIP=xx.87
ORACLE_SID=tms
ORAPASSWD=xxx1234
SYSPASSWD=oracle
SYSTEMPASSWD=oracle
#文件路径
ENV_BASE_DIR=/u01/app
ENV_ORACLE_BASE=$ENV_BASE_DIR/oracle
ENV_ORACLE_INVEN=$ENV_BASE_DIR/oraInventory
ENV_ORACLE_HOME=$ENV_ORACLE_BASE/product/11.2.0/db
ORADATADIR=/oradata
ARCHIVEDIR=/arch
BACKUPDIR=/backup
SCRIPTSDIR=/home/oracle/scripts
#AL32UTF8,ZHS16GBK
CHARACTERSET=AL32UTF8
DB_VERSION=11.2.0.4
RESPONSEFILE_VERSION=11.2
SOFTWAREDIR=/opt
oracleinstalllog="$SOFTWAREDIR/oracle11g_$(date +"%Y%m%d_%H%M%S").log"
#调用函数库
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
source /etc/profile
#Require root to run this script.
[ $(id -u) -gt 0 ] && echo "请用root用户执行此脚本!" && exit 1
#"stty erase ^H" 设置backspace为删除键
\cp /root/.bash_profile /root/.bash_profile_$(date +%F)
erase=`grep -wx "stty erase ^H" /root/.bash_profile |wc -l`
if [ $erase -lt 1 ];then
echo "stty erase ^H" >>/root/.bash_profile
source /root/.bash_profile
fi
function oracle11g_install(){
echo ""
echo -e "\033[33m**********************************oracle 11g 部署***************************************************\033[0m"
####################################################################################
## Add colors to fonts through variables
####################################################################################
function c1() {
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
PINK_COLOR='\E[1;35m'
WHITE_BLUE='\E[47;34m'
DOWN_BLUE='\E[4;36m'
FLASH_RED='\E[5;31m'
RES='\E[0m'
#Here it is judged whether the incoming parameters are not equal to 2, if not equal to 2, prompt and exit
if [ $# -ne 2 ]; then
echo "Usage $0 content {red|yellow|blue|green|pink|wb|db|fr}"
exit
fi
case "$2" in
red | RED)
echo -e "${RED_COLOR}$1${RES}"
;;
yellow | YELLOW)
echo -e "${YELLOW_COLOR}$1${RES}"
;;
green | GREEN)
echo -e "${GREEN_COLOR}$1${RES}"
;;
blue | BLUE)
echo -e "${BLUE_COLOR}$1${RES}"
;;
pink | PINK)
echo -e "${PINK_COLOR}$1${RES}"
;;
wb | WB)
echo -e "${WHITE_BLUE}$1${RES}"
;;
db | DB)
echo -e "${DOWN_BLUE}$1${RES}"
;;
fr | FR)
echo -e "${FLASH_RED}$1${RES}"
;;
*)
echo -e "Please enter the specified color code:{red|yellow|blue|green|pink|wb|db|fr}"
;;
esac
}
##Example
##c1 "Program installation error!" red
##c1 "The program is successfully installed!" green
##c1 "Output related annotation information" blue
####################################################################################
## Log Write
####################################################################################
function logwrite() {
{
c1 "####################################################################################" green
echo
c1 "# $1" blue
echo
c1 "####################################################################################" green
echo
echo "$1 :"
echo
echo "$2" > ${SOFTWAREDIR}/ex.sh
chmod +x ${SOFTWAREDIR}/ex.sh
${SOFTWAREDIR}/ex.sh
rm -rf ${SOFTWAREDIR}/ex.sh #考虑去掉
echo
} >> ${oracleinstalllog}
}
##Example
##logwrite "HostName" "hostname"
##logwrite "Firewalld" "systemctl status firewalld"
####################################################################################
# Configure hostname and hosts
####################################################################################
action "[1]配置主机名和hosts文件..." /bin/true
/usr/bin/hostnamectl set-hostname $ORA_HOSTNAME
logwrite "HOSTNAME Check" "hostname"
if [ "$(grep -E -c "#OracleBegin" /etc/hosts)" -eq 0 ]; then
[ ! -f /etc/hosts."${DAYTIME}" ] && cp /etc/hosts /etc/hosts."${DAYTIME}"
cat >>/etc/hosts <<EOF
##OracleBegin
#Public IP
$PUBLICIP $ORA_HOSTNAME
EOF
fi
logwrite "/etc/hosts Check" "cat /etc/hosts"
####################################################################################
## Disable firewall and selinux
####################################################################################
action "[2]禁用selinux和防火墙..." /bin/true
systemctl stop firewalld && systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
logwrite "Disable firewall and selinux" "systemctl status firewalld"
####################################################################################
# Check Swap
####################################################################################
action "[3]配置Swap内存..." /bin/true
COUNT=
if [ "${memTotal}" -ge 1048576 ] && [ "${memTotal}" -le 2097152 ]; then
swapNeed=$((memTotal * 3 / 2))
if [[ ${swapNeed} -gt ${swapTotal} ]]; then
COUNT=$((swapNeed - swapTotal))
fi
elif [ "${memTotal}" -gt 2097152 ] && [ "${memTotal}" -le 16777216 ]; then
swapNeed=$memTotal
if [[ ${swapNeed} -gt ${swapTotal} ]]; then
COUNT=$((swapNeed - swapTotal))
fi
elif [ "${memTotal}" -gt 16777216 ]; then
swapNeed=16777216
if [[ ${swapNeed} -gt ${swapTotal} ]]; then
COUNT=$((swapNeed - swapTotal))
fi
else
echo ""
c1 "At least 1 GB RAM for Oracle Database installations. 2 GB RAM recommended." red
exit 99
fi
##set swap space
if [ -n "${COUNT}" ] && [ ! -f /swapfile ] && [ ${COUNT} -gt 40 ]; then
c1 "Now Setting SWAP SPACE........" blue
COUNT=$((COUNT / 1024 / 1024 + 1))
dd if=/dev/zero of=/swapfile bs=1G count=${COUNT}
mkswap /swapfile #将文件格式化为swap文件格式
chmod 0600 /swapfile
swapon /swapfile #启动swap分区
echo "/swapfile swap swap defaults 0 0" >>/etc/fstab
mount -a
fi
logwrite "SWAP Check" "swapon -s"
####################################################################################
## Download packages
####################################################################################
action "[4]下载安装包..." /bin/true
if [ -f $SOFTWAREDIR/p13390677_112040_Linux-x86-64_1of7.zip ] && [ -f $SOFTWAREDIR/p13390677_112040_Linux-x86-64_2of7.zip ] && [ -f $SOFTWAREDIR/rlwrap-0.37.tar.gz ] ;then
c1 "$SOFTWAREDIR已存在Oracle数据库安装包,无需下载." yellow
else
ping -c 4 app.fslgz.com >/dev/null 2>&1
if [ $? -eq 0 ];then
wget -q https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=877191727792848896 -O $SOFTWAREDIR/rlwrap-0.37.tar.gz
wget -q https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=877206934221029376 -O $SOFTWAREDIR/p13390677_112040_Linux-x86-64_1of7.zip
wget -q https://app.fslgz.com/portal/api/public/fs/association/file/downLoad?uploadId=877205824064258048 -O $SOFTWAREDIR/p13390677_112040_Linux-x86-64_2of7.zip
if [ "$(du -sm /opt/p13390677_112040_Linux-x86-64_1of7.zip | awk '{print $1}')" -gt 1200 ] && [ "$(du -sm /opt/p13390677_112040_Linux-x86-64_2of7.zip | awk '{print $1}')" -gt 1000 ]; then
c1 "成功下载Oracle数据库安装包." green
else
c1 "下载Oracle数据库安装包失败." red
exit 99
fi
else
c1 "请手动下载Oracle数据库安装包并上传到${SOFTWAREDIR}目录!" red
exit 99
fi
fi
logwrite "Download packages" "ls -l $SOFTWAREDIR"
####################################################################################
#install rpm that oracle is necessary for installing
####################################################################################
action "[5]安装依赖包..." /bin/true
yum groupinstall -y "Server with GUI" >/dev/null 2>&1 && yum install -y tigervnc* >/dev/null 2>&1
if [ "$(rpm -q bc binutils compat-libcap1 compat-libstdc++-33 unixODBC gcc gcc-c++ elfutils-libelf elfutils-libelf-devel glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libxcb libX11 libXau libXi libXtst libXrender libXrender-devel make net-tools nfs-utils smartmontools sysstat e2fsprogs e2fsprogs-libs fontconfig-devel expect unzip openssh-clients readline psmisc --qf '%{name}.%{arch}\n' | grep -E -c "not installed|未安装")" -gt 0 ]; then
yum install -y bc \
binutils \
compat-libcap1 \
compat-libstdc++-33 \
gcc \
gcc-c++ \
elfutils-libelf \
elfutils-libelf-devel \
glibc \
glibc-devel \
ksh \
libaio \
libaio-devel \
libgcc \
libstdc++ \
libstdc++-devel \
libXext \
libxcb \
libX11 \
libXau \
libXi \
libXtst \
libXrender \
libXrender-devel \
make \
net-tools \
nfs-utils \
smartmontools \
sysstat \
e2fsprogs \
e2fsprogs-libs \
fontconfig-devel \
unixODBC \
unixODBC-devel \
zlib-devel \
expect \
unzip \
openssh-clients \
readline* \
psmisc --skip-broken >/dev/null 2>&1
fi
logwrite "RPM Check" "rpm -q bc binutils compat-libcap1 compat-libstdc++-33 unixODBC gcc gcc-c++ elfutils-libelf elfutils-libelf-devel glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libxcb libX11 libXau libXi libXtst libXrender libXrender-devel make net-tools nfs-utils smartmontools sysstat e2fsprogs e2fsprogs-libs fontconfig-devel expect unzip openssh-clients readline"
####################################################################################
# create user and directory
####################################################################################
action "[6]创建用户&文件夹及授权..." /bin/true
##create user
[ "$(grep -E -c "oinstall" /etc/group)" -eq 0 ] && /usr/sbin/groupadd -g 54321 oinstall
[ "$(grep -E -c "dba" /etc/group)" -eq 0 ] && /usr/sbin/groupadd -g 54322 dba
[ "$(grep -E -c "oper" /etc/group)" -eq 0 ] && /usr/sbin/groupadd -g 54323 oper
[ "$(grep -E -c "backupdba" /etc/group)" -eq 0 ] && /usr/sbin/groupadd -g 54324 backupdba
[ "$(grep -E -c "dgdba" /etc/group)" -eq 0 ] && /usr/sbin/groupadd -g 54325 dgdba
[ "$(grep -E -c "kmdba" /etc/group)" -eq 0 ] && /usr/sbin/groupadd -g 54326 kmdba
[ "$(grep -E -c "racdba" /etc/group)" -eq 0 ] && /usr/sbin/groupadd -g 54330 racdba
if [ "$(grep -E -c "oracle" /etc/passwd)" -eq 0 ]; then
if ! /usr/sbin/useradd -u 54321 -g oinstall -G dba,backupdba,dgdba,kmdba,racdba,oper oracle; then
cl "Command failed to adding user --oracle." red
exit 93
fi
else
/usr/sbin/usermod -g oinstall -G dba,backupdba,dgdba,kmdba,racdba,oper oracle
fi
##create directory
[ ! -d "${ENV_BASE_DIR}" ] && mkdir -p ${ENV_BASE_DIR}
[ ! -d "${ENV_ORACLE_BASE}" ] && mkdir -p ${ENV_ORACLE_BASE}
[ ! -d "${ENV_ORACLE_HOME}" ] && mkdir -p ${ENV_ORACLE_HOME}
[ ! -d "${ENV_ORACLE_INVEN}" ] && mkdir -p ${ENV_ORACLE_INVEN}
[ ! -d "${ORADATADIR}" ] && mkdir -p ${ORADATADIR}
[ ! -d "${ARCHIVEDIR}" ] && mkdir -p ${ARCHIVEDIR}
[ ! -d "${BACKUPDIR}" ] && mkdir -p ${BACKUPDIR}
[ ! -d "${SCRIPTSDIR}" ] && mkdir -p ${SCRIPTSDIR}
mkdir -p ${BACKUPDIR}/oradata && mkdir -p ${BACKUPDIR}/log && mkdir -p ${BACKUPDIR}/arch && mkdir -p ${BACKUPDIR}/control
chown -R oracle:oinstall /u01
chown -R oracle:oinstall ${ENV_BASE_DIR} && chmod -R 775 ${ENV_BASE_DIR}
chown -R oracle:oinstall ${ORADATADIR}
chown -R oracle:oinstall ${ARCHIVEDIR}
chown -R oracle:oinstall ${BACKUPDIR}
chown -R oracle:oinstall ${SCRIPTSDIR}
##Judge $ENV_BASE_DIR DISK SPACE
BASEDIR_SPACE=$(df "${ENV_BASE_DIR}" | tail -n 1 | awk '{printf $4}')
BASEDIR_SPACE=$((BASEDIR_SPACE / 1024 / 1024))
if [ "${BASEDIR_SPACE}" -lt 50 ]; then
c1 "${ENV_BASE_DIR} Disk Space ${BASEDIR_SPACE}G is not enough (50G), Install Maybe Failed." red
sleep 3
fi
##Set user oracle's password
if ! echo "${ORAPASSWD}" | passwd --stdin oracle; then
c1 "User oracle is not existing." red
exit 92
fi
logwrite "Create user and directory(oracle)" "id oracle"
####################################################################################
#Stop avahi deamon
####################################################################################
action "[7]禁用avahi服务..." /bin/true
yum install -y avahi* >/dev/null 2>&1
if [ "$(systemctl status avahi-daemon | grep -c running)" -gt 0 ]; then
systemctl stop avahi-daemon.socket
systemctl stop avahi-daemon.service
pgrep -f avahi-daemon | awk '{print "kill -9 "$2}'
fi
systemctl disable avahi-daemon.service
systemctl disable avahi-daemon.socket
logwrite "Stop avahi-daemon" "systemctl status avahi-daemon"
####################################################################################
# Disable transparent_hugepages&&numa
####################################################################################
# 如果有大页需求,Oracle建议使用标准的大页提升性能,严禁使用透明大页。透明大页与标准大页的区别在于可以在系统运行时分配内存,而标准大页只能重启生效。
# Linux下的大页分为两种类型:标准大页(Huge Pages)和透明大页(Transparent Huge Pages)。
# 1). 标准大页(Huge Pages)是从Linux Kernel 2.6后被引入的。目的是使用更大的内存页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。
# 2). 透明大页(Transparent Huge Pages)缩写为THP,这个是RHEL 6开始引入的一个功能。
# 这两者的区别在于大页的分配机制,标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。目前透明大页与传统大页混合使用会出现一些问题,导致性能问题和系统重启。ORACLE官方不建议在使用RedHat 6, OEL 6, SLES 11 and UEK2 kernels 时开启透明大页(THP), 因为透明大页存在一些问题:
# 1.在RAC环境下 透明大页(Transparent HugePages )会导致异常节点重启和性能问题;
# 2.在单机环境中,透明大页(Transparent HugePages ) 也会导致一些异常的性能问题;
action "[8]禁用透明大页和numa..." /bin/true
if [ "$(grep -E -c "/sys/kernel/mm/transparent_hugepage/enabled" /etc/rc.d/rc.local)" -eq 0 ]; then
cat >>/etc/rc.d/rc.local <<EOF
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
EOF
chmod u+x /etc/rc.d/rc.local
fi
if [ "$(grep -E -c "transparent_hugepage=never numa=off" /etc/default/grub)" -eq 0 ]; then
[ ! -f /etc/default/grub."${DAYTIME}" ] && cp /etc/default/grub /etc/default/grub."${DAYTIME}"
sed -i 's/quiet/quiet transparent_hugepage=never numa=off/' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
fi
logwrite "/etc/default/grub配置" "cat /etc/default/grub"
logwrite "Transparent_hugepages配置" "cat /sys/kernel/mm/transparent_hugepage/enabled"
logwrite "NUMA配置" "cat /proc/cmdline"
####################################################################################
# Disable NetworkManager
####################################################################################
action "[9]禁用NetworkManager..." /bin/true
#Turn off the NetworkManager(Linux 7)
if [ "$(systemctl status NetworkManager.service | grep -c running)" -gt 0 ]; then
systemctl stop NetworkManager.service
systemctl disable NetworkManager.service
fi
logwrite "Disable NetworkManager" "systemctl status NetworkManager"
####################################################################################
# Edit sysctl.conf
####################################################################################
##shmmal's Calculation formula: physical memory 8G:(8*1024*1024*1024)/4096=2097152
##shmmax's Calculation formula: physical memory 8G:(8/2)*1024*1024*1024 -1=4294967295
action "[10]配置sysctl.conf..." /bin/true
totalMemory=$((memTotal / 2048))
shmall=$((memTotal / 4))
[ $shmall -lt 2097152 ] && shmall=2097152
shmmax=$((memTotal * 1024 - 1))
[ $shmmax -lt 4294967295 ] && shmmax=4294967295
if [ "$(grep -E -c "#OracleBegin" /etc/sysctl.conf)" -eq 0 ]; then
[ ! -f /etc/sysctl.conf."${DAYTIME}" ] && cp /etc/sysctl.conf /etc/sysctl.conf."${DAYTIME}"
cat <<EOF >>/etc/sysctl.conf
#OracleBegin
##shmmal's Calculation formula: physical memory 8G:(8*1024*1024*1024)/4096=2097152
##shmmax's Calculation formula: physical memory 8G:(8/2)*1024*1024*1024 -1=4294967295
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = $shmall
kernel.shmmax = $shmmax
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 = 1048576
EOF
sysctl -p
fi
logwrite "/etc/sysctl.conf配置" "sysctl -p"
####################################################################################
# Edit nsysctl.conf
####################################################################################
action "[11]配置nsysctl.conf..." /bin/true
if [ "$(grep -E -c "#OracleBegin" /etc/sysconfig/network)" -eq 0 ]; then
[ ! -f /etc/sysconfig/network."${DAYTIME}" ] && cp /etc/sysconfig/network /etc/sysconfig/network."${DAYTIME}"
cat >> /etc/sysconfig/network <<EOF
#OracleBegin
NOZEROCONF=yes
#OracleEnd
EOF
fi
logwrite "NOZEROCONF配置" "cat /etc/sysconfig/network"
####################################################################################
# Edit limits.conf
####################################################################################
action "[12]配置limits.conf..." /bin/true
sed -i 's/* soft nproc 4096/* - nproc 16384/g' /etc/security/limits.d/20-nproc.conf
logwrite "/etc/security/limits.d/20-nproc.conf" "cat /etc/security/limits.d/20-nproc.conf | grep -v \"^\$\"|grep -v \"^#\""
if [ "$(grep -E -c "#OracleBegin" /etc/security/limits.conf)" -eq 0 ]; then
[ ! -f /etc/security/limits.conf."${DAYTIME}" ] && cp /etc/security/limits.conf /etc/security/limits.conf."${DAYTIME}"
cat <<EOF >>/etc/security/limits.conf
#OracleBegin
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
oracle soft nproc 2047
oracle hard nproc 16384
oracle hard memlock 134217728
oracle soft memlock 134217728
#OracleEnd
EOF
fi
logwrite "/etc/security/limits.conf配置" "cat /etc/security/limits.conf | grep -v \"^\$\"|grep -v \"^#\""
####################################################################################
# Edit pam.d
####################################################################################
action "[13]配置pam.d认证..." /bin/true
if [ "$(grep -E -c "#OracleBegin" /etc/pam.d/login)" -eq 0 ]; then
cat <<EOF >>/etc/pam.d/login
#OracleBegin
session required pam_limits.so
session required /lib64/security/pam_limits.so
#OracleEnd
EOF
fi
logwrite "/etc/pam.d/login配置" "cat /etc/pam.d/login | grep -v \"^\$\"|grep -v \"^#\""
####################################################################################
# Configure /dev/shm
####################################################################################
action "[14]配置/dev/shm..." /bin/true
if [ "$(grep -E -c "/dev/shm" /etc/fstab)" -eq 0 ]; then
[ ! -f /etc/fstab."${DAYTIME}" ] && cp /etc/fstab /etc/fstab."${DAYTIME}"
cat <<EOF >>/etc/fstab
tmpfs /dev/shm tmpfs size=${memTotal}k 0 0
EOF
mount -o remount /dev/shm
else
if [ "$shmTotal" -lt "$memTotal" ]; then
shmTotal=$memTotal
[ ! -f /etc/fstab."${DAYTIME}" ] && cp /etc/fstab /etc/fstab."${DAYTIME}"
line=$(grep -n "/dev/shm" /etc/fstab | awk -F ":" '{print $1}')
sed -i "${line} d" /etc/fstab
cat <<EOF >>/etc/fstab
tmpfs /dev/shm tmpfs size=${memTotal}k 0 0
EOF
mount -o remount /dev/shm
fi
fi
logwrite "/etc/fstab配置" "cat /etc/fstab | grep -v \"^\$\"|grep -v \"^#\""
logwrite "shm配置" "df -Th /dev/shm"
logwrite "df -hP" "df -hP"
####################################################################################
# Install rlwrap
####################################################################################
action "[15]安装rlwrap..." /bin/true
if [ "$(find "${SOFTWAREDIR}" -maxdepth 1 -name 'rlwrap-*.gz' | wc -l)" -gt 0 ]; then
if ! rlwrap -v >/dev/null 2>&1; then
yum install -y tar >/dev/null 2>&1
mkdir -p ${SOFTWAREDIR}/rlwrap
tar -zxvf "${SOFTWAREDIR}"/rlwrap*tar.gz --strip-components 1 -C "${SOFTWAREDIR}"/rlwrap >/dev/null 2>&1
cd "${SOFTWAREDIR}"/rlwrap || return
./configure >/dev/null 2>&1 && make >/dev/null 2>&1 && make install >/dev/null 2>&1
fi
logwrite "rlwrap部署" "rlwrap -v"
if [ "$(find "${SOFTWAREDIR}" -mindepth 1 -name 'rlwrap*' | wc -l)" -gt 0 ]; then
cd ~ || return
rm -rf ${SOFTWAREDIR}/rlwrap*
fi
fi
####################################################################################
# Edit bash_profile
####################################################################################
action "[16]配置环境变量..." /bin/true
##ORALCE:
if [ "$(grep -E -c "#OracleBegin" /home/oracle/.bash_profile)" -eq 0 ]; then
cat <<EOF >>/home/oracle/.bash_profile
################OracleBegin#########################
umask 022
export TMP=/tmp
export TMPDIR=\$TMP
export NLS_LANG=AMERICAN_AMERICA.${CHARACTERSET} #AL32UTF8,ZHS16GBK
export ORACLE_BASE=${ENV_ORACLE_BASE}
export ORACLE_HOME=${ENV_ORACLE_HOME}
export ORACLE_HOSTNAME=${ORA_HOSTNAME}
export ORACLE_TERM=xterm
export TNS_ADMIN=\$ORACLE_HOME/network/admin
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
export ORACLE_SID=${ORACLE_SID}
export PATH=/usr/sbin:\$PATH
export PATH=\$ORACLE_HOME/bin:\$ORACLE_HOME/OPatch:\$PATH
export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS"
export THREADS_FLAG=native
alias alert='tail -500f \$ORACLE_BASE/diag/rdbms/\$ORACLE_SID/\$ORACLE_SID/trace/alert_\$ORACLE_SID.log|more'
export PS1='\[\033[01m\][\[\033[01;32m\]\u\[\033[00m\]\[\033[01m\]@\[\033[01;34m\]\h\[\033[01;31m\] \[\033[01;31m\]\w\[\033[0m\]] \\$ '
#rlwrap配置
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
alias lsnrctl='rlwrap lsnrctl'
alias asmcmd='rlwrap asmcmd'
alias adrci='rlwrap adrci'
alias ggsci='rlwrap ggsci'
alias dgmgrl='rlwrap dgmgrl'
################OracleEnd###########################
EOF
fi
logwrite "Oracle Profile配置" "cat /home/oracle/.bash_profile | grep -v \"^\$\"|grep -v \"^#\""
####################################################################################
# Unzip DB Software
####################################################################################
action "[17]解压安装包..." /bin/true
if [ -d "${SOFTWAREDIR}"/database ]; then
cd ~ || return
rm -rf "${SOFTWAREDIR}"/database
fi
if unzip -qo "${SOFTWAREDIR}"/p13390677_112040_Linux-x86-64_1of7.zip -d "${SOFTWAREDIR}"; then
rm -rf "${SOFTWAREDIR}"/p13390677_112040_Linux-x86-64_1of7.zip
chown -R oracle:oinstall "${SOFTWAREDIR}"/database
else
c1 "Make sure the database installation package is in the ${SOFTWAREDIR} directory:" red
c1 "p13390677_112040_Linux-x86-64_1of7.zip" blue
exit 99
fi
if unzip -qo "${SOFTWAREDIR}"/p13390677_112040_Linux-x86-64_2of7.zip -d "${SOFTWAREDIR}"; then
rm -rf "${SOFTWAREDIR}"/p13390677_112040_Linux-x86-64_2of7.zip
chown -R oracle:oinstall "${SOFTWAREDIR}"/database
else
c1 "Make sure the database installation package is in the ${SOFTWAREDIR} directory:" red
c1 "p13390677_112040_Linux-x86-64_2of7.zip" blue
exit 99
fi
#Create db.rsp
[ -f "${SOFTWAREDIR}"/db.rsp ] && rm -rf "${SOFTWAREDIR}"/db.rsp
cat <<EOF >>"${SOFTWAREDIR}"/db.rsp
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=${ORA_HOSTNAME}
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=${ENV_BASE_DIR}/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOME=${ENV_ORACLE_HOME}
ORACLE_BASE=${ENV_ORACLE_BASE}
oracle.install.db.InstallEdition=EE
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oper
DECLINE_SECURITY_UPDATES=true
oracle.installer.autoupdates.option=SKIP_UPDATES
EOF
chown oracle:oinstall "${SOFTWAREDIR}"/db.rsp
logwrite "${SOFTWAREDIR}/db.rsp" "cat ${SOFTWAREDIR}/db.rsp"
####################################################################################
# Install Database software
####################################################################################
##Juge whether ${ENV_ORACLE_INVEN}/ContentsXML/inventory.xml contains ${ENV_ORACLE_HOME},if exists ,delete it
# if [ -f "${ENV_ORACLE_INVEN}/ContentsXML/inventory.xml" ] && [ "$(grep -E -c "${ENV_ORACLE_HOME}" "${ENV_ORACLE_INVEN}"/ContentsXML/inventory.xml)" -gt 0 ]; then
# line=$(grep -n "${ENV_ORACLE_HOME}" "${ENV_ORACLE_INVEN}"/ContentsXML/inventory.xml | awk -F ":" '{print $1}')
# sed -i "${line} d" "${ENV_ORACLE_INVEN}"/ContentsXML/inventory.xml
# fi
action "[18]安装数据库软件..." /bin/true
if ! su - oracle -c "${SOFTWAREDIR}/database/runInstaller -silent -force -showProgress -ignoreSysPrereqs -waitForCompletion -responseFile ${SOFTWAREDIR}/db.rsp -ignorePrereq"; then
c1 "Sorry, ORALCE Software Install Failed." red
exit 99
fi
if [ -d "/${SOFTWAREDIR}/"database ]; then
cd ~ || return
rm -rf "/${SOFTWAREDIR:?}/"database
fi
if [ -f "${ENV_ORACLE_INVEN}"/orainstRoot.sh ] || [ -f "${ENV_ORACLE_HOME}"/root.sh ]; then
if [ -f "${ENV_ORACLE_INVEN}"/orainstRoot.sh ]; then
"${ENV_ORACLE_INVEN}"/orainstRoot.sh
fi
if [ -f "${ENV_ORACLE_HOME}"/root.sh ]; then
"${ENV_ORACLE_HOME}"/root.sh
fi
else
echo
c1 "Oracle software installation failed, please check the log." red
exit 99
fi
##LINUX7 INSTALL 11G,NEED TO SET -lnnz11
sed -i 's/^\(\s*\$(MK_EMAGENT_NMECTL)\)\s*$/\1 -lnnz11/g' "${ENV_ORACLE_HOME}"/sysman/lib/ins_emagent.mk
logwrite "Oracle RDBMS" "su - oracle -c \"sqlplus -V\""
####################################################################################
# Create netca.rsp
####################################################################################
cat <<EOF >>"${SOFTWAREDIR}"/netca.rsp
[GENERAL]
RESPONSEFILE_VERSION="${RESPONSEFILE_VERSION}"
CREATE_TYPE="CUSTOM"
[oracle.net.ca]
INSTALLED_COMPONENTS={"server","net8","javavm"}
INSTALL_TYPE=""typical""
LISTENER_NUMBER=1
LISTENER_NAMES={"LISTENER"}
LISTENER_PROTOCOLS={"TCP;1521"}
LISTENER_START=""LISTENER""
NAMING_METHODS={"TNSNAMES","ONAMES","HOSTNAME"}
NSN_NUMBER=1
NSN_NAMES={"EXTPROC_CONNECTION_DATA"}
NSN_SERVICE={"PLSExtProc"}
NSN_PROTOCOLS={"TCP;HOSTNAME;1521"}
EOF
logwrite "${SOFTWAREDIR}/netca.rsp" "cat ${SOFTWAREDIR}/netca.rsp"
if ! su - oracle -c "netca -silent -responsefile ${SOFTWAREDIR}/netca.rsp"; then
c1 "Sorry, Listener Create Failed." red
fi
####################################################################################
## Create database
####################################################################################
action "[19]创建数据库实例..." /bin/true
su - oracle -c "lsnrctl start"
if ! su - oracle -c "dbca -silent -createDatabase -templateName General_Purpose.dbc -responseFile NO_VALUE -gdbname ${ORACLE_SID} -sid ${ORACLE_SID} -sysPassword ${SYSPASSWD} -systemPassword ${SYSTEMPASSWD} -redoLogFileSize 120 -storageType FS -datafileDestination ${ORADATADIR} -sampleSchema true -characterSet ${CHARACTERSET} -nationalCharacterSet AL16UTF16 -emConfiguration NONE -automaticMemoryManagement false -totalMemory ${totalMemory} -databaseType OLTP"; then
c1 "Sorry, Database Create Failed." red
exit 99
fi
if [ -d "${SOFTWAREDIR}"/database ]; then
cd ~ || return
rm -rf "${SOFTWAREDIR:?}"/database
fi
logwrite "ORACLE Instance" "su - oracle -c \"lsnrctl status\""
####################################################################################
# Configure DBParaSet
####################################################################################
action "[20]数据库参数初始化..." /bin/true
if [ "$(find "/home/oracle" -maxdepth 1 -name '*.sql' | wc -l)" -gt 0 ]; then
cd ~ || return
rm -rf /home/oracle/*.sql
fi
#sessions = 1.1 * processes + 5
cat > /home/oracle/oracleParaset.sql << EOF
-- set db_create_file_dest
ALTER SYSTEM SET PROCESSES=1200 SCOPE=SPFILE;
ALTER SYSTEM SET SESSIONS=1325 SCOPE=SPFILE;
ALTER SYSTEM SET OPEN_CURSORS=1000 SCOPE=BOTH;
ALTER SYSTEM SET UNDO_RETENTION=10800 SCOPE=SPFILE;
ALTER SYSTEM SET AUDIT_TRAIL=NONE SID='*' SCOPE=SPFILE;
ALTER SYSTEM SET DB_CREATE_FILE_DEST='${ORADATADIR}';
EXIT;
EOF
chown -R oracle:oinstall /home/oracle/* && chmod -R 755 /home/oracle/*
su - oracle -c "sqlplus / as sysdba @/home/oracle/oracleParaset.sql" && c1 "数据库参数初始化成功." green
####################################################################################
# Configure FRA AND ARCHIVED
####################################################################################
action "[21]数据库归档及闪回配置..." /bin/true
if [ "$(find "/home/oracle" -maxdepth 1 -name '*.sql' | wc -l)" -gt 0 ]; then
cd ~ || return
rm -rf /home/oracle/*.sql
fi
#sessions = 1.1 * processes + 5
cat > /home/oracle/oracleFra.sql << EOF
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=10000m SCOPE=BOTH;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST="${ARCHIVEDIR}" SCOPE=BOTH;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE FLASHBACK ON;
STARTUP;
EXIT;
EOF
chown -R oracle:oinstall /home/oracle/* && chmod -R 755 /home/oracle/*
su - oracle -c "sqlplus / as sysdba @/home/oracle/oracleFra.sql" && c1 "数据库归档及闪回配置成功." green
####################################################################################
# Configure instances autostart with OS start
####################################################################################
action "[22]配置数据库开机启动..." /bin/true
if [ "$(grep -E -c "#OracleBegin" /etc/oratab)" -eq 0 ]; then
[ ! -f /etc/oratab."${DAYTIME}" ] && cp /etc/oratab /etc/oratab."${DAYTIME}"
sed -i 's/db:N/db:Y/' /etc/oratab
sed -i 's/ORACLE_HOME_LISTNER=$1/ORACLE_HOME_LISTNER=$ORACLE_HOME/' "${ENV_ORACLE_HOME}"/bin/dbstart
cat <<EOF >>/etc/rc.d/rc.local
#OracleBegin
su oracle -lc "${ENV_ORACLE_HOME}/bin/lsnrctl start"
su oracle -lc ${ENV_ORACLE_HOME}/bin/dbstart
#OracleEnd
EOF
chmod +x /etc/rc.d/rc.local
fi
####################################################################################
# Configure del_arch.sh to crontab
####################################################################################
action "[23]配置数据库归档及备份脚本..." /bin/true
##create del_arch.sh
if [ ! -f ${SCRIPTSDIR}/del_arch.sh ]; then
{
echo '#!/bin/bash'
echo 'source ~/.bash_profile'
echo 'deltime=`date +"%Y%m%d%H%M%S"`'
echo "rman target / nocatalog msglog ${BACKUPDIR}/log/del_arch_\${deltime}.log<<EOF"
echo 'crosscheck archivelog all;'
echo "delete noprompt archivelog until time 'sysdate-14';"
echo "delete noprompt force archivelog until time 'SYSDATE-14';"
echo "exit;"
echo 'EOF'
} >>${SCRIPTSDIR}/del_arch.sh
fi
c1 "完成Oracle数据库定期删除归档脚本编写." green
action "[24]配置数据库备份脚本..." /bin/true
##create dbbackup_lv0.sh(0级全备)
if [ ! -f ${SCRIPTSDIR}/dbbackup_lv0.sh ]; then
{
echo '#!/bin/sh'
echo 'source ~/.bash_profile'
echo 'backtime=`date +"%Y%m%d%H%M%S"`'
echo "rman target / log=${BACKUPDIR}/log/level0_backup_\${backtime}.log<<EOF"
echo 'run {'
echo "sql 'alter system archive log current';"
echo 'allocate channel c1 device type disk;'
echo 'allocate channel c2 device type disk;'
echo "backup as compressed backupset tag full_backup_level0 incremental level 0 database format '${BACKUPDIR}/oradata/backlv0_%d_%T_%t_%s_%p';"
echo "sql 'alter system archive log current';"
echo "backup as compressed backupset format '${BACKUPDIR}/arch/arch_%T_t%t_s%s_p%p' archivelog all delete input;"
echo 'release channel c1;'
echo 'release channel c2;'
echo 'allocate channel d1 type disk;'
echo "backup format '${BACKUPDIR}/control/controlfile_%T_s%s_p%p' current controlfile;"
echo 'crosscheck backup;'
echo 'crosscheck copy;'
echo 'delete noprompt expired backup;'
echo 'delete noprompt obsolete;'
echo 'release channel d1;'
echo '}'
echo 'EOF'
} >>${SCRIPTSDIR}/dbbackup_lv0.sh
fi
##create dbbackup_lv1.sh(1级增备)
if [ ! -f ${SCRIPTSDIR}/dbbackup_lv1.sh ]; then
{
echo '#!/bin/sh'
echo 'source ~/.bash_profile'
echo 'backtime=`date +"20%y%m%d%H%M%S"`'
echo "rman target / log=${BACKUPDIR}/log/level1_backup_\${backtime}.log<<EOF"
echo 'run {'
echo "sql 'alter system archive log current';"
echo 'allocate channel c1 device type disk;'
echo 'allocate channel c2 device type disk;'
echo "backup as compressed backupset tag incr_backup_level1 incremental level 1 database format '${BACKUPDIR}/oradata/backlv1_%d_%T_%t_%s_%p';"
echo "sql 'alter system archive log current';"
echo "backup as compressed backupset format '${BACKUPDIR}/arch/archlog_%T_t%t_s%s_p%p' archivelog all delete input;"
echo 'release channel c1;'
echo 'release channel c2;'
echo 'allocate channel d1 type disk;'
echo "backup format '${BACKUPDIR}/control/controlfile_%T_s%s_p%p' current controlfile;"
echo 'crosscheck backup; '
echo 'crosscheck copy;'
echo 'delete noprompt expired backup;'
echo 'delete noprompt obsolete;'
echo "delete noprompt backup of database completed before'sysdate-8';"
echo 'release channel d1;'
echo '}'
echo 'EOF'
} >>${SCRIPTSDIR}/dbbackup_lv1.sh
fi
c1 "完成Oracle数据库备份脚本编写." green
####################################################################################
# Configure scripts to crontab
####################################################################################
##Set to oracle crontab
if [ ! -f /var/spool/cron/oracle ]; then
echo "##For oracle" >>/var/spool/cron/oracle
fi
if [ "$(grep -E -c "#OracleBegin" /var/spool/cron/oracle)" -eq 0 ]; then
[ ! -f /var/spool/cron/oracle."${DAYTIME}" ] && cp /var/spool/cron/oracle /var/spool/cron/oracle."${DAYTIME}" >/dev/null 2>&1
chown -R oracle:oinstall ${SCRIPTSDIR}/d*
chmod +x ${SCRIPTSDIR}/d*
{
echo "#OracleBegin"
echo "30 23 * * * ${SCRIPTSDIR}/del_arch.sh"
echo "00 00 * * 0 ${SCRIPTSDIR}/dbbackup_lv0.sh"
echo "00 00 * * 1-6 ${SCRIPTSDIR}/dbbackup_lv1.sh"
echo "#OracleEnd"
} >>/var/spool/cron/oracle
fi
logwrite "Oracle 定时脚本" "su - oracle -c \"crontab -l\""
####################################################################################
# Configure PASSWORD_LIFE_TIME UNLIMITED
####################################################################################
action "[25]配置密码生命周期..." /bin/true
#11g 默认会将 DEFAULT 的 PROFILE 设置登录失败尝试次数(10 次),在无意或恶意的连续使用错误密码连接时,导致数据库用户被锁住,影响业务。因此需要将登录失败尝试次数设为不限制。
cat > /home/oracle/password_unlimt.sql << EOF
ALTER PROFILE DEFAULT LIMIT PASSWORD_GRACE_TIME UNLIMITED;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LOCK_TIME UNLIMITED;
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;
ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=FALSE;
ALTER SYSTEM SET "_OPTIMIZER_CARTESIAN_ENABLED"=FALSE;
--ALTER SYSTEM SET "_USE_SINGLE_LOG_WRITER"=FALSE SCOPE=SPFILE;
ALTER SYSTEM SET RESULT_CACHE_MAX_SIZE= 0;
ALTER SYSTEM SET event='10949 trace name context forever:28401 trace name context forever,level 1:10849 trace name context forever, level 1:19823 trace name context forever, level 90' scope=spfile;
exit;
EOF
chown -R oracle:oinstall /home/oracle/* && chmod -R 755 /home/oracle/*
su - oracle -c "sqlplus / as sysdba @/home/oracle/password_unlimt.sql" && c1 "配置密码生命周期成功." green
# 记录设置后的参数值结果
cat > /home/oracle/Impliedparameters.sql << EOF
col name for a40
col VALUE for a10
col DESCRIB for a60
set lines 200
SHOW PARAMETER PROCESSES;
SHOW PARAMETER SESSIONS;
SHOW PARAMETER OPEN_CURSORS;
SHOW PARAMETER UNDO_RETENTION;
SHOW PARAMETER AUDIT_TRAIL;
SHOW PARAMETER RECOVER;
ARCHIVE LOG LIST;
SHOW PARAMETER DEFERRED_SEGMENT_CREATION;
SHOW PARAMETER RESULT_CACHE_MAX_SIZE;
SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
FROM SYS.x\$ksppi x, SYS.x\$ksppcv y
WHERE x.inst_id = USERENV ('Instance')
AND y.inst_id = USERENV ('Instance')
AND x.indx = y.indx
and x.ksppinm in ('_optimizer_cartesian_enabled','_use_single_log_writer','_use_adaptive_log_file_sync');
exit;
EOF
chown -R oracle:oinstall /home/oracle/* && chmod -R 755 /home/oracle/*
logwrite "Oracle Implied parameters" "su - oracle -c \"sqlplus / as sysdba @/home/oracle/Impliedparameters.sql\""
####################################################################################
# Sqlnet.ora Configure lower Oracle client to connect
####################################################################################
action "[26]配置低版本数据库连接..." /bin/true
if [ -f "${ENV_ORACLE_HOME}"/network/admin/sqlnet.ora ] && [ "$(grep -E -c "#OracleBegin" "${ENV_ORACLE_HOME}"/network/admin/sqlnet.ora)" -eq 0 ]; then
[ ! -f "${ENV_ORACLE_HOME}"/network/admin/sqlnet.ora."${DAYTIME}" ] && cp "${ENV_ORACLE_HOME}"/network/admin/sqlnet.ora "${ENV_ORACLE_HOME}"/network/admin/sqlnet.ora."${DAYTIME}"
su - oracle -c "cat <<EOF >${ENV_ORACLE_HOME}/network/admin/sqlnet.ora
#OracleBegin
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
#OracleEnd
EOF
"
fi
if [ "$(find "/home/oracle" -maxdepth 1 -name '*.sql' | wc -l)" -gt 0 ]; then
cd ~ || return
rm -rf /home/oracle/*.sql
fi
c1 "配置低版本数据库连接成功." green
echo ""
c1 "Congratulations, Install Successful! Please Reboot Later." blue
echo ""
echo -e "\033[33m**************************************完成oracle 11g部署**************************************\033[0m"
cat > /tmp/oracle11g.log << EOF
Oracle版本:$DB_VERSION
ORACLE IP:$PUBLICIP
ORACLE实例名:$ORACLE_SID
ORACLE数据库密码:$SYSPASSWD
Oracle安装目录:$ENV_ORACLE_HOME
数据文件路径:$ORADATADIR
归档文件路径:$ARCHIVEDIR
备份文件路径:$BACKUPDIR
EOF
cat /tmp/oracle11g.log
echo -e "\e[1;31m 以上信息10秒后消失,保存在/tmp/oracle11g.log文件下 \e[0m"
echo -e "\033[33m**********************************************************************************************\033[0m"
echo ""
sleep 10
}
oracle11g_install
二、测试结果
测试结果如下: