Linux7 安装 Oracle 19C 脚本(支持单机和RAC)

Linux7 安装 Oracle 19C 脚本(支持单机和RAC)

#!/bin/bash
## Linux7上安装Oracle数据库一键配置脚本
# 安装介质所在目录
# You must put the installation package in the /tmp/soft directory, Like this:
# /tmp/soft/
# ├── 11
# ├── 12
# ├── 19
# │   ├── LINUX.X64_193000_db_home.zip
# │   ├── LINUX.X64_193000_grid_home.zip
# │   ├── p34773504_190000_Linux-x86-64_OJVM+GI_RU_19.18.0.0.230117.zip
# │   ├── p6880880_190000_Linux-x86-64-OPatch_12.2.0.1.36.zip
# │   └── patch
# │       ├── 34762026
# │       ├── 34786990
# │       ├── PatchSearch.xml
# │       └── README.html
# └── compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm
# 定义变量
# db_type | si/SI --单实例;rac/RAC --RAC(仅两节点)
export db_type=SI
# 定义 Public IP、Virtual IP、SCAN IP 等业务网段 IP 地址信息
export PubIP1=192.168.56.6
export hostname1=Jeff-Test01
export PubIP2=192.168.56.7
export hostname2=Jeff-Test02
export VIP1=192.168.56.8
export VIP1NAME=Jeff-Test-VIP1
export VIP2=192.168.56.9
export VIP2NAME=Jeff-Test-VIP2
export SCANIP=192.168.56.10
export SCANNAME=Jeff-Test-SCAN
# Pub_Mask 业务网络子网掩码,数字 23 或者 255.255.254.0 均支持
export Pub_Mask=24
export scanPort=1521
export cluster_name=Jeff-test
export ORA_SID_PREFIX=Jefftest
export DB_NAME=Jefftest
export DB_UNIQUE_NAME=Jefftest
export ORA_SID1=${ORA_SID_PREFIX}1
export ORA_SID2=${ORA_SID_PREFIX}2
# 定义心跳网络 Private IP 信息
export PrivIP1=192.168.11.6
export Priv1NAME=Jeff-Test-Priv1
export PrivIP2=192.168.11.7
export Priv2NAME=Jeff-Test-Priv2
# Priv_Mask 心跳网络子网掩码,数字 23 或者 255.255.254.0 均支持
export Priv_Mask=24
# ntpserver 用于配置 chronyd 服务
export ntpserver=10.10.7.254
# oraver:安装的数据库版本:11、12、18、19、23
export oraver=19
# 指定root密码、oracle&grid密码、DB管理密码
export rootpw="Jeff_Test01"
export ORAPWD="Jeff_Test01"       # oracle && grid 设置相同密码
export db_admin_pwd="Jeff_Test01" # 预设数据库管理使用的统一密码
# needcdb 指定是否Y(y)需要 CDB 容器数据库,needpdb 是否Y(y)需要创建 PDB(限制创建 1 个),PDB_SID 指定 PDB 名字
export needcdb=n
export needpdb=n
export PDB_SID=Jeff_PDB
# 指定内存、FRA参数设置,如下是很小的参数了,再小会导致安装失败
export sgasize=2GB
export sga_max_size=2GB
export pgasize=500MB
export recovery_size=
export processes=5000
export redoLogFileSize=2048
export useOMF=true
# 软件安装目录设置
export rootdir=/u01
export ORA_BASE=$rootdir/app/oracle
export ORA_HOME=$ORA_BASE/product/19.3.0/db_1
export ORA_INV=$rootdir/app/oraInventory
export GI_BASE=$rootdir/app/grid
export GI_HOME=$rootdir/app/19.3.0/grid
export logfile=/tmp/install_$(date +%F).log
# 磁盘管理方式:ASM、FS(File System), Deafult --> ASM
export disk_management=FS
# FS 文件系统磁盘管理(ASM 管理时不需要填写)
export fs_data_dir=$ORA_BASE/oradata
export fs_fra_dir=/arch
export fs_redo_dir=/redo
export fs_redo2_dir=/redo2
# ASM 磁盘管理(FS管理时不需要填写)
# mapper_dir 指定提供给ASM管理的磁盘识别路径,或者 /dev/mapper 等
export mapper_dir=/dev
# sd : 提供给ASM管理的磁盘前缀
export mapper_prefix=sd
# asm_ocr_disks: OCR\Voting 磁盘组,多组使用空格\,\;等字符隔开,建议命令行使用,,不容易混乱;不写前缀
export asm_ocr_disks="b c d"
export asm_ocr_dir=OCR_VOTE
# asm_fra_disks:归档日志、闪回区 磁盘组
export asm_fra_disks="e f g"
export asm_fra_dir=FRA
# asm_data_disks:数据文件 磁盘组;默认 redo 存放 $asm_data_dir 和 $asm_fra_dir,需要另外配置则调整脚本
export asm_data_disks="h i j"
export asm_data_dir=DATA
# 指定是否需要格式化磁盘 Y(y)格式化,其他不执行
export need_format=n
# 安装介质指定
export softroot=/tmp/soft
export softdir=$softroot/$oraver
export db_zip_file=LINUX.X64_193000_db_home.zip
export grid_zip_file=LINUX.X64_193000_grid_home.zip
export opatch_zip_file=p6880880_190000_Linux-x86-64_OPatch-12.2.0.1.39.zip
export ru=35320081

############################################ 以上是主要参数定义,以下部分可不设置 ############################################
# 以下部分没有参数设置
split1() {
   
    echo -e "\033[1;40;33m\n\n  ===================================== $(date +'%F %T') =====================================\n$1\033[0m"
}
result_err() {
   
    echo -e "\033[31m\n      (*>﹏<*)(*>﹏<*)(*>﹏<*)  $1  (*>﹏<*)(*>﹏<*)(*>﹏<*)\n\033[0m"
}
result_ok() {
   
    echo -e "\n\033[32m      (*^_^*)(*^_^*)(*^_^*)   $1   (*^_^*)(*^_^*)(*^_^*)\033[0m\n"
}
# db_zip_file 默认值 LINUX.X64_193000_db_home.zip
if [ -z ${db_zip_file} ]; then
    db_zip_file=LINUX.X64_193000_db_home.zip
fi
# grid_zip_file 默认值 LINUX.X64_193000_grid_home.zip
if [ -z ${grid_zip_file} ]; then
    grid_zip_file=LINUX.X64_193000_grid_home.zip
fi
# opatch_zip_file 默认值 p6880880_190000_Linux-x86-64.zip,每次下载最新文件
if [ -z ${opatch_zip_file} ]; then
    opatch_zip_file=p6880880_190000_Linux-x86-64.zip
fi
# 需要apply的RU,不 apply 则置空
export ru_zip_file=$softdir/p${ru}*.zip
# 识别 RU 对应的 zip 文件
export RUs=$softdir/patch/$ru
# 安装时需要同时安装的 RU 绝对路径
if [ -d $softroot ] && [ ! -d $softdir/patch ]; then
    mkdir -p $softdir/patch
fi

clear

figletexist=$(type figlet 2>/dev/null | wc -l)
if [ $figletexist -gt 0 ]; then
    figlet -cf banner -w 100 "$db_type  install"
fi

export UPPER_DB_NAME=$(echo $DB_NAME | tr [:lower:] [:upper:])
export disk_management=$(echo $disk_management | tr [:lower:] [:upper:])
export db_type=$(echo $db_type | tr [:lower:] [:upper:])
if [ "$db_type" != "SI" ] && [ "$db_type" != "RAC" ]; then
    result_err "# Please provide the correct DB type(RAC/SI), you have specified : $db_type"
    exit 1
fi

if [ -z $sga_max_size ]; then
    sga_max_size=$sgasize
fi

mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
sga_max_size=$(echo $sga_max_size | tr [:lower:] [:upper:])
sganum=$(echo $sga_max_size | tr -cd "[0-9]")
sgachar=$(echo $sga_max_size | tr -d "[0-9]")
if [ "$sgachar" == "GB" ] || [ "$sgachar" == "G" ]; then
    huge=$(($sganum * 1024 / 2 + 10))
    sga_kb=$(($sganum * 1024 * 1024))
elif [ "$sgachar" == "MB" ] || [ "$sgachar" == "M" ]; then
    huge=$(($sganum / 2 + 10))
    sga_kb=$(($sganum * 1024))
elif [ "$sgachar" == "KB" ] || [ "$sgachar" == "K" ]; then
    huge=$(($sganum / 1024 / 2 + 10))
    sga_kb=$sganum
elif [ -z "$sgachar" ]; then
    huge=$(($sganum / 1024 / 1024 / 2 + 10))
    sga_kb=$(($sganum / 1024))
else
    echo "Can not get HugePage size"
    exit 1
fi

if [ $mem_kb -le 32000000 ];then
    echo "# Avaliable RAM less than 32000000kb,not set hugepage"
    huge=
fi

if [ $sga_kb -lt $(($mem_kb*3/10)) ];then
    result_err "# SGA set less than 30% of MemTotal"
elif [ $sga_kb -gt $(($mem_kb*7/10)) ];then
    result_err "# SGA set Larger than 70% of MemTotal"
fi

export OS=$(uname -s)
if [ "$OS" != "Linux" ]; then
    result_err "# Only supported on Linux"
    exit 1
fi

if [ $disk_management == "FS" ]; then
    for dir in $fs_data_dir $fs_fra_dir $fs_redo_dir $fs_redo2_dir; do
        if [ ! -d $dir ] && [ -n "$dir" ]; then
            mkdir -p $dir
        fi
    done
fi

if [ "$db_type" == "SI" ]; then
    export PubIP2=
    export hostname2=
    export VIP1=
    export VIP1NAME=
    export VIP2=
    export VIP2NAME=
    export SCANIP=
    export SCANNAME=
    export cluster_name=
    export ORA_SID1=$ORA_SID_PREFIX
    export ORA_SID2=
    # 定义心跳网络 Private IP 信息
    export PrivIP1=
    export Priv1NAME=
    export PrivIP2=
    export Priv2NAME=
    # Priv_Mask 心跳网络子网掩码,数字 23 或者 255.255.254.0 均支持
    export Priv_Mask=
fi

echo "################    Begin : $(date +'%F %T')    ################" >$logfile
chmod -R 777 $softroot
export db_install_file=$softdir/$db_zip_file
export grid_install_file=$softdir/$grid_zip_file
export opatch_install_file=$softdir/$opatch_zip_file
if [ ! -f ${db_install_file} ]; then
    result_err "Error: DB install file not found!" >>$logfile
    exit 1
elif [ "${upper_db_type}" == "RAC" ] && [ ! -f ${grid_install_file} ]; then
    result_err "You select Db type as RAC, But can not found GRID install file!" >>$logfile
    exit 1
elif [ -n "${ru}" ] && [ ! -f ${ru_zip_file} ]; then
    result_err "You Want to apply an RU, But not found zip file!" >>$logfile
    exit 1
    if [ ! -f ${opatch_install_file} ]; then
        result_err "You choose to apply RU and must update OPatch" >>$logfile
        exit 1
    fi
fi
split1 "# 按照输入参数解析各文件压缩包名如下,The input installation media is analyzed as follows:
DB install file: $db_install_file
GRID install file: $grid_install_file
OPatch install file: $opatch_install_file
RU zip file: $ru_zip_file" >>$logfile
split1 "# 按照输入参数解析各文件压缩包名如下,The input installation media is analyzed as follows:
DB install file: $db_install_file
GRID install file: $grid_install_file
OPatch install file: $opatch_install_file
RU zip file: $ru_zip_file"
sleep 5

# 如下实现掩码数字计算:255.255.254.0 转换 23
export tmp1=$(echo $Pub_Mask | grep -o '\.' | wc -l)
if [ $tmp1 -eq 3 ]; then
    export Pub_Mask=$(echo $Pub_Mask | sed 's/\./ + /g;s/255/8/g;s/254/7/g;s/252/6/g;s/248/5/g;s/240/4/g;s/224/3/g;s/192/2/g;s/128/1/g' | bc)
elif [ $tmp1 -gt 0 ]; then
    result_err "# 请输入正确的 Public 网卡子网掩码($Pub_Mask)" >>$logfile
    exit 1
elif [ $Pub_Mask -lt 32 ] && [ $Pub_Mask -gt 1 ] && [ $tmp1 -eq 0 ]; then
    echo -e
else
    result_err "# 请输入正确的 Public($Pub_Mask) 网卡掩码位数字 2-31" >>$logfile
    exit 1
fi
echo "# 业务IP子网掩码: $Pub_Mask" >>$logfile

if [ -n "$Priv_Mask" ] && [ "$db_type" == "RAC" ]; then
    export tmp2=$(echo $Priv_Mask | grep -o '\.' | wc -l)
    if [ $tmp2 -eq 3 ]; then
        export Priv_Mask=$(echo $Priv_Mask | sed 's/\./ + /g;s/255/8/g;s/254/7/g;s/252/6/g;s/248/5/g;s/240/4/g;s/224/3/g;s/192/2/g;s/128/1/g' | bc)
    elif [ $tmp2 -gt 0 ]; then
        result_err "# 请输入正确的 Private 网卡子网掩码($Priv_Mask)" >>$logfile
        exit 1
    elif [ $Priv_Mask -lt 32 ] && [ $Priv_Mask -gt 1 ] && [ $tmp2 -eq 0 ]; then
        echo -e
    else
        result_err "# 请输入正确的 Private($Priv_Mask) 网卡掩码位数字 2-31" >>$logfile
        exit 1
    fi
    echo "# 虚拟IP子网掩码: $Priv_Mask" >>$logfile
fi

# 获取子网函数
get_ipgate() {
   
    #ip地址转换整数
    ipgate_int=$(echo $1 | awk -F'.' '{print $1*(256^3) + $2*(256^2) + $3*256 + $4}')
    #主机位:32 - $2
    #按位运算,右移,ip地址移除主机位,保留网络位
    #按位运算,左移,ip地址以0补全主机位
    ((ipgate = ((ipgate_int >> ((32 - $2)))) << ((32 - $2))))
    #获取子网:整数转换ip地址,整数右移取低8位
    echo $((ipgate >> 24 & 0xFF)).$((ipgate >> 16 & 0xFF)).$((ipgate >> 8 & 0xFF)).$((ipgate & 0xFF))
}
export pub_subnet=$(get_ipgate $PubIP1 $Pub_Mask)

if [ -n "$Priv_Mask" ] && [ "$db_type" == "RAC" ]; then
    export priv_subnet=$(get_ipgate $PrivIP1 $Priv_Mask)
fi
echo "# pub-subnet: $pub_subnet ; Priv-subnet: $priv_subnet" >>$logfile

netcard_name() {
   
    findIP=$1
    # 按照网卡名行,开头为数字编号,进行过滤选择
    for devEnum in $(ip link show | grep ^[0-9]\\+: | awk -F ' ' {
    'print $2'}); do
        # 去掉后缀冒号
        devName=${devEnum%:}
        # 去掉可能的子网卡接口后缀
        devName=${devName%@*}
        if [ $(ip addr show $devName | grep -c $findIP) -gt 0 ]; then
            echo $devName
            break
        fi
    done
}

if [ "$(hostname)" == "$hostname1" ]; then
    pub_netcard=$(netcard_name $PubIP1)
    if [ -n "$PrivIP1" ] && [ "$db_type" == "RAC" ]; then
        priv_netcard=$(netcard_name $PrivIP1)
    fi
    echo "# pub_netcard: $pub_netcard ; priv_netcard: $priv_netcard" >>$logfile
fi

# 提取 ASM 磁盘信息,转换后提供 for 循环使用(-->21 asm 配置)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值