
bash
[root@oracleServer install_oracle11g]#cat 1.sh
bash
#!/bin/bash
# 定义日志文件(统一到/tmp目录)
LOG_FILE="/tmp/oracle_install.log"
# 修复日志文件权限(允许oracle用户写入)
if [ -f "$LOG_FILE" ]; then
chmod 666 "$LOG_FILE" # 所有用户可读写
else
touch "$LOG_FILE"
chmod 666 "$LOG_FILE"
fi
> $LOG_FILE # 清空日志文件
# 终端输出函数
red_echo () { echo -e "\033[031;1m$@\033[0m"; }
green_echo () { echo -e "\033[032;1m$@\033[0m"; }
yellow_echo () { echo -e "\033[033;1m$@\033[0m"; }
blue_echo () { echo -e "\033[034;1m$@\033[0m"; }
purple_echo () { echo -e "\033[035;1m$@\033[0m"; }
# 日志输出函数
log_red () { echo -e "\033[031;1m$@\033[0m" >> $LOG_FILE; }
log_green () { echo -e "\033[032;1m$@\033[0m" >> $LOG_FILE; }
log_yellow () { echo -e "\033[033;1m$@\033[0m" >> $LOG_FILE; }
log_blue () { echo -e "\033[034;1m$@\033[0m" >> $LOG_FILE; }
log_purple () { echo -e "\033[035;1m$@\033[0m" >> $LOG_FILE; }
log_echo () { echo "$@" >> $LOG_FILE; }
# 导出日志函数,使其在子shell中可用
export -f log_red log_green log_yellow log_blue log_purple log_echo
export LOG_FILE
# 步骤开始输出
begin () {
printf "\033[036;1m[%d/%d]\033[0m %-40s... " "$step_current" "$step_total" "$step_desc"
log_echo -n "[$step_current/$step_total] $step_desc... "
}
# 状态提示
failure () {
red_echo "失败"
log_red "失败"
echo "--------------------------------------------------"
exit 1
}
success () {
green_echo "完成"
log_green "完成"
echo "--------------------------------------------------"
}
# 步骤计数器
step_current=0
step_total=20
proc () {
test -f .oracle_install.step || touch .oracle_install.step
step=$@
step_current=$((step_current + 1))
# 设置步骤描述
case $step in
"pre_check") step_desc="预先检查" ;;
"set_hostname") step_desc="设置主机名" ;;
"set_users_and_groups") step_desc="设置用户和组" ;;
"set_oracle_password") step_desc="设置oracle用户密码" ;;
"create_data_directories") step_desc="创建数据目录" ;;
"install_dependencies") step_desc="安装软件依赖" ;;
"adjust_kernel_parameters") step_desc="调整内核参数" ;;
"modify_system_resource_limits") step_desc="修改系统资源限制参数" ;;
"disable_transparent_hugepage") step_desc="关闭透明页" ;;
"set_timezone") step_desc="修改时区" ;;
"disable_selinux") step_desc="禁用SELINUX" ;;
"disable_firewall") step_desc="关闭防火墙" ;;
"switch_to_oracle_user") step_desc="切换到oracle用户并创建环境变量文件" ;;
"install_oracle_database_1") step_desc="静默安装数据库软件步骤1" ;;
"install_oracle_database_2") step_desc="静默安装数据库软件步骤2" ;;
"start_lns") step_desc="启动并查看监听" ;;
"install_oracle_database_3") step_desc="静默安装数据库软件步骤3" ;;
"start_database") step_desc="启动Oracle数据库实例" ;;
"check_oracle") step_desc="验证环境并创建数据库用户" ;;
*) step_desc="$step" ;;
esac
if grep "$step" .oracle_install.step &> /dev/null
then
printf "\033[036;1m[%d/%d]\033[0m %-40s... %s\n" "$step_current" "$step_total" "$step_desc" "$(yellow_echo '已跳过')"
log_yellow "[$step_current/$step_total] $step_desc... 已跳过"
echo "--------------------------------------------------"
else
begin
if exec_"$step" >> $LOG_FILE 2>&1; then
echo "$step" >> .oracle_install.step
success
else
failure
fi
fi
}
# 开始提示
echo "=================================================="
purple_echo " 开始安装 Oracle 11g "
echo "=================================================="
log_purple "****** 开始安装 Oracle 11g ******"
shopt -s expand_aliases
########### 自定义变量 ###########
SERVICE_IP=192.168.59.141
ORACLE_HOSTNAME=oracleServer
ORACLE_SID=testdb
ORACLE_UNIQUE_NAME=orcl
SYSTEM_LANGUAGE=en_US
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
GLOBAL_DATABASE_NAME=orcl
DATAFILE_DESTINATION=/u01/data
TOTAL_MEMORY=6000
SYS_PASSWORD=oracle
SYSTEM_PASSWORD=oracle
CHARACTER_SET=UTF8
NATIONAL_CHARACTER_SET=AL16UTF16
ORACLE_TERM=xterm
NLS_DATE_FORMAT='yyyy-mm-dd HH24:MI:SS'
NLS_LANGUAGE=AMERICAN_AMERICA.UTF8
THREADS_FLAG=native
######## 安装配置 ########
ORACLE_INSTALL_OPTION=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_INSTALL_DB_INSTALL_EDITION=EE
ORACLE_INSTALL_DB_EE_OPTIONS_SELECTION=false
ORACLE_INSTALL_DB_DBA_GROUP=dba
ORACLE_INSTALL_DB_OPER_GROUP=oinstall
DECLINE_SECURITY_UPDATES=true
SECURITY_UPDATES_VIA_MY_ORACLE_SUPPORT=false
RESPONSE_FILE_VERSION="11.2.0"
OPERATION_TYPE="createDatabase"
TEMPLATE_NAME=General_Purpose.dbc
STORAGE_TYPE=FS
TOTALMEMORY=$(grep 'MemTotal' /proc/meminfo | awk '{printf ("%d\n",($2*0.8)/1024)}')
# 检查root权限
if [ "$(id -u)" != "0" ]; then
red_echo "错误:此脚本必须以root权限运行"
log_red "此脚本必须以root权限运行"
exit 1
fi
# 预先检查
exec_pre_check() {
log_blue "预先检查"
log_purple "检查oracle.env配置情况"
ALL_VAR=0
SET_VAR=0
error_flag=0
while IFS= read -r line || [ -n "$line" ]; do
line=$(echo "$line" | xargs)
if [[ -z "$line" ]] || [[ "$line" =~ ^# ]]; then
continue
fi
log_echo -n "$line "
((ALL_VAR++))
KEY="${line%%=*}"
VALUE="${line##*=}"
if [ -z "$VALUE" ]; then
log_red "[ERROR] 变量值为空: $KEY"
error_flag=1
else
log_green "[OK]"
((SET_VAR++))
fi
done < oracle.env
# 检查Oracle安装包
log_purple "检查Oracle安装包"
PKG1="/root/install_oracle11g/pkgs/Linux-x86-64_database_1of7.zip"
PKG2="/root/install_oracle11g/pkgs/Linux-x86-64_database_2of7.zip"
if [ ! -f "$PKG1" ]; then
log_red "[ERROR] 安装包不存在: $PKG1"
error_flag=1
else
log_green "[OK] 找到安装包: $PKG1"
fi
if [ ! -f "$PKG2" ]; then
log_red "[ERROR] 安装包不存在: $PKG2"
error_flag=1
else
log_green "[OK] 找到安装包: $PKG2"
fi
if [ $error_flag -eq 1 ]; then
log_red "[ERROR] 存在错误,脚本终止。"
return 1
fi
log_green "[SUCCESS] 检查通过,自动继续安装"
}
# 切换到oracle用户并创建环境变量文件
exec_switch_to_oracle_user() {
log_blue "切换到oracle用户并创建环境变量文件"
su - oracle -c "
# 在oracle用户环境中重新定义日志函数
log_echo() { echo \"\$@\" >> $LOG_FILE; }
log_blue() { echo -e \"\033[034;1m\$@\033[0m\" >> $LOG_FILE; }
log_green() { echo -e \"\033[032;1m\$@\033[0m\" >> $LOG_FILE; }
# 创建环境变量文件
cat >> ~/.bash_profile <<'EOF'
PS1=\"[\$(whoami)@\$(hostname):'\$PWD]\$'\"
export PS1
export TMP=/tmp
export LANG=$SYSTEM_LANGUAGE
export TMPDIR=\$TMP
export ORACLE_UNQNAME=$ORACLE_UNIQUE_NAME
ORACLE_SID=testdb; export ORACLE_SID
ORACLE_BASE=$ORACLE_BASE; export ORACLE_BASE
ORACLE_HOME=$ORACLE_HOME; export ORACLE_HOME
ORACLE_TERM=$ORACLE_TERM; export ORACLE_TERM
export TNS_ADMIN=\$ORACLE_HOME/network/admin
NLS_DATE_FORMAT=\"$NLS_DATE_FORMAT\"; export NLS_DATE_FORMAT
NLS_LANG=$NLS_LANGUAGE; export NLS_LANG
PATH=.:\$PATH:\$HOME/.local/bin:\$HOME/bin:\$ORACLE_HOME/bin; export PATH
THREADS_FLAG=$THREADS_FLAG; export THREADS_FLAG
umask=022
EOF
source ~/.bash_profile
log_blue "Oracle环境变量:"
env | grep ORACLE | log_echo
" || {
log_red "[ERROR] 创建环境变量文件失败"
return 1
}
log_green "[SUCCESS] 切换到oracle用户并创建环境变量文件成功"
}
# 启动监听
exec_start_lns(){
log_blue "切换到oracle启动监听"
su - oracle -c "
# 重新定义日志函数
log_echo() { echo \"\$@\" >> $LOG_FILE; }
log_blue() { echo -e \"\033[034;1m\$@\033[0m\" >> $LOG_FILE; }
cp $ORACLE_HOME/inventory/Scripts/ext/lib/libclntsh.so.11.1 $ORACLE_HOME/lib/
cd /home/oracle/software/database || exit 1
netca -silent -responseFile /home/oracle/software/database/response/netca.rsp
log_blue \"监听文件列表:\"
ls -l $ORACLE_HOME/network/admin | log_echo
log_blue \"监听状态:\"
lsnrctl status | log_echo
" || {
log_red "[ERROR] 启动监听失败"
return 1
}
log_green "[SUCCESS] 启动并查看监听成功"
}
# 数据库创建步骤
exec_install_oracle_database_3() {
log_blue "切换到oracle用户静默安装数据库"
su - oracle -c "
# 重新定义日志函数
log_echo() { echo \"\$@\" >> $LOG_FILE; }
cd /home/oracle/software/database/ || exit 1
sed -i 's/^OPERATION_TYPE =.*/OPERATION_TYPE = \"$OPERATION_TYPE\"/' response/dbca.rsp
sed -i 's/^GDBNAME =.*/GDBNAME = \"$GLOBAL_DATABASE_NAME\"/' response/dbca.rsp
sed -i 's/^SID =.*/SID = \"$ORACLE_SID\"/' response/dbca.rsp
sed -i 's/^TEMPLATENAME =.*/TEMPLATENAME = \"$TEMPLATE_NAME\"/' response/dbca.rsp
sed -i 's|^STORAGETYPE =.*|STORAGETYPE = \"$STORAGE_TYPE\"|' response/dbca.rsp
sed -i 's|^DATAFILEDESTINATION =.*|DATAFILEDESTINATION = \"$DATAFILE_DESTINATION\"|' response/dbca.rsp
sed -i 's|^CHARACTERSET =.*|CHARACTERSET = \"$CHARACTER_SET\"|' response/dbca.rsp
sed -i 's|^NATIONALCHARACTERSET=.*|NATIONALCHARACTERSET = \"$NATIONAL_CHARACTER_SET\"|' response/dbca.rsp
sed -i 's|^TOTALMEMORY =.*|TOTALMEMORY = \"$TOTALMEMORY\"|' response/dbca.rsp
sed -i 's|^SYSPASSWORD =.*|SYSPASSWORD = \"$SYS_PASSWORD\"|' response/dbca.rsp
sed -i 's|^SYSTEMPASSWORD =.*|SYSTEMPASSWORD = \"$SYSTEM_PASSWORD\"|' response/dbca.rsp
sed -i 's|^#STORAGETYPE =.*|STORAGETYPE = \"$STORAGE_TYPE\"|' response/dbca.rsp
sed -i 's|^#DATAFILEDESTINATION =.*|DATAFILEDESTINATION = \"$DATAFILE_DESTINATION\"|' response/dbca.rsp
sed -i 's|^#CHARACTERSET =.*|CHARACTERSET = \"$CHARACTER_SET\"|' response/dbca.rsp
sed -i 's|^#NATIONALCHARACTERSET=.*|NATIONALCHARACTERSET = \"$NATIONAL_CHARACTER_SET\"|' response/dbca.rsp
sed -i 's|^#TOTALMEMORY =.*|TOTALMEMORY = \"$TOTALMEMORY\"|' response/dbca.rsp
sed -i 's|^#SYSPASSWORD =.*|SYSPASSWORD = \"$SYS_PASSWORD\"|' response/dbca.rsp
sed -i 's|^#SYSTEMPASSWORD =.*|SYSTEMPASSWORD = \"$SYSTEM_PASSWORD\"|' response/dbca.rsp
dbca -silent -responseFile /home/oracle/software/database/response/dbca.rsp
" || {
log_red "[ERROR] 数据库创建失败"
return 1
}
log_green "[SUCCESS] 数据库创建完成"
}
# 关键修复:启动Oracle数据库实例(处理已启动情况)
exec_start_database() {
log_blue "启动Oracle数据库实例"
# 先检查数据库当前状态
status=$(su - oracle -c "
source ~/.bash_profile
sqlplus -S / as sysdba <<'EOF'
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT status FROM v\$instance;
EXIT;
EOF
")
# 处理不同状态
if [ "$status" = "OPEN" ]; then
log_green "数据库实例已处于运行状态,无需重复启动"
return 0 # 成功退出
elif [ -z "$status" ]; then
log_blue "数据库未运行,尝试启动..."
# 尝试启动数据库
startup_output=$(su - oracle -c "
source ~/.bash_profile
sqlplus -S / as sysdba <<'EOF'
startup;
EXIT;
EOF
")
# 检查启动后的状态
new_status=$(su - oracle -c "
source ~/.bash_profile
sqlplus -S / as sysdba <<'EOF'
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT status FROM v\$instance;
EXIT;
EOF
")
if [ "$new_status" = "OPEN" ]; then
log_green "数据库实例启动成功,状态:$new_status"
return 0
else
log_red "数据库启动失败,输出:$startup_output"
return 1
fi
else
log_red "数据库当前状态异常:$status"
return 1
fi
}
# 验证步骤
exec_check_oracle() {
log_blue "开始验证数据库环境并创建用户..."
sleep 10 # 等待数据库稳定
su - oracle -c "
source ~/.bash_profile
sqlplus -S / as sysdba <<'EOF'
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
select instance_name,status from v\$instance;
select file_name, tablespace_name from dba_data_files;
CREATE USER test_user IDENTIFIED BY test_password;
GRANT CONNECT, RESOURCE TO test_user;
EXIT;
EOF
" || {
log_red "[ERROR] 验证数据库或创建用户失败"
return 1
}
status=$(su - oracle -c "
source ~/.bash_profile
sqlplus -S / as sysdba <<'EOF'
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT status FROM v\$instance;
EXIT;
EOF
")
if [ "$status" = "OPEN" ]; then
log_green "Oracle 数据库服务安装成功并且状态正常。"
log_green "测试用户 test_user 已成功创建。"
else
log_red "Oracle 数据库服务状态异常:$status"
return 1
fi
}
# 其他函数保持不变
exec_set_hostname() {
log_blue "设置主机名"
hostnamectl set-hostname "$ORACLE_HOSTNAME"
echo "$SERVICE_IP" "$ORACLE_HOSTNAME" >> /etc/hosts
log_echo " hosts文件内容:"
cat /etc/hosts >> $LOG_FILE
log_green "[SUCCESS] 设置主机名成功"
}
exec_set_users_and_groups() {
log_blue "设置用户和组"
/usr/sbin/groupadd -g 60001 oinstall
/usr/sbin/groupadd -g 60002 dba
/usr/sbin/groupadd -g 60003 oper
useradd -u 61001 -g oinstall -G dba,oper oracle
log_green "[SUCCESS] 设置用户和组成功"
}
exec_set_oracle_password() {
log_blue "设置oracle用户密码"
echo "oracle:MyPassWd@123!" | chpasswd
log_green "[SUCCESS] 设置oracle用户密码成功"
}
exec_create_data_directories() {
log_blue "创建数据目录"
mkdir -p /u01/app/oracle/product/11.2.0
mkdir -p /u01/app/oraInventory
chown -R oracle:oinstall /u01
log_green "[SUCCESS] 创建数据目录成功"
}
exec_install_dependencies() {
log_blue "安装软件依赖"
umount /dev/sr0 /media 2>/dev/null
mkdir -p /mnt/localrepo
mount /dev/sr0 /mnt/localrepo
if [ $? -ne 0 ]; then
log_red "挂载光盘失败"
return 1
fi
log_echo "挂载结果:"
df -h | grep /mnt/localrepo >> $LOG_FILE
cd /etc/yum.repos.d/
rm -rf *
cat > /etc/yum.repos.d/local.repo << EOF
[local-repo]
name=Local Offline Repository
baseurl=file:///mnt/localrepo
gpgcheck=0
enabled=1
EOF
yum clean all >> $LOG_FILE 2>&1
yum makecache >> $LOG_FILE 2>&1
yum install /root/install_oracle11g/depFiles/compat-libcap1-1.10-1.x86_64.rpm -y >> $LOG_FILE 2>&1
yum install /root/install_oracle11g/depFiles/compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm -y >> $LOG_FILE 2>&1
rpm -ivh /root/install_oracle11g/depFiles/libnsl-2.28-49.p03.ky10.x86_64.rpm --nodeps --force >> $LOG_FILE 2>&1
yum install -y unzip
yum install -y device-mapper-persistent-data lvm2 wget \
net-tools nfs-utils lrzsz gcc gcc-c++ \
make cmake libxml2-devel openssl-devel \
curl curl-devel sudo ntp libaio-devel \
wget vim ncurses-devel autoconf automake zlib-devel \
python-devel openssh-server \
ntpdate telnet psmisc bc binutils gdb glibc ksh \
elfutils-libelf elfutils-libelf-devel fontconfig-devel \
glibc-devel libaio libXrender libXrender-devel libX11 \
libXau sysstat libXi libXtst libgcc librdmacm-devel \
libstdc++ libstdc++-devel libxcb compat-libcap1 compat-libstdc++-33 \
smartmontools targetcli python python-configshell python-rtslib \
python-six unixODBC unixODBC-devel iscsi-initiator-utils device-mapper \
device-mapper-multipath unbound bind-utils numactl libnsl >> $LOG_FILE 2>&1
if [ $? -ne 0 ]; then
log_red "安装依赖包失败"
return 1
fi
\cp /root/install_oracle11g/depFiles/libaio.so.1.0.1.new /usr/lib64/
ln -sf /usr/lib64/libaio.so.1.0.1.new /usr/lib64/libaio.so.1
\cp /root/install_oracle11g/depFiles/libpthread_nonshared.a /usr/lib64/
log_green "[SUCCESS] 安装软件依赖成功"
}
exec_adjust_kernel_parameters() {
log_blue "调整内核参数"
SHMMAX=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*1024*0.8)}')
SHMALL=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*1024/4096*0.8)}')
sed -i "s/kernel.shmmax/#kernel.shmmax/g" /etc/sysctl.conf
sed -i "s/kernel.shmall/#kernel.shmall/g" /etc/sysctl.conf
cat >> /etc/sysctl.conf << EOF
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 = 1048576
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
EOF
sysctl -p >> $LOG_FILE 2>&1
log_green "[SUCCESS] 调整内核参数成功"
}
exec_modify_system_resource_limits() {
log_blue "修改系统资源限制参数"
SMEMLOCK=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*0.9)}')
HMEMLOCK=$(grep 'MemTotal' /proc/meminfo |awk '{printf ("%d\n",$2*0.9)}')
cat >> /etc/security/limits.conf << EOF
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 2048
grid hard nofile 65536
grid soft stack 10240
grid hard stack 32768
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 2048
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
oracle soft memlock $SMEMLOCK
oracle hard memlock $HMEMLOCK
EOF
sysctl -p >> $LOG_FILE 2>&1
log_green "[SUCCESS] 修改系统资源限制参数成功"
}
exec_disable_transparent_hugepage() {
log_blue "关闭透明页"
log_echo "当前透明页状态:"
cat /sys/kernel/mm/transparent_hugepage/defrag >> $LOG_FILE
cat /sys/kernel/mm/transparent_hugepage/enabled >> $LOG_FILE
cat << 'EOF' > /etc/rc.d/rc.local
# Disable Transparent Huge Pages
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF
chmod +x /etc/rc.d/rc.local
sh /etc/rc.d/rc.local >> $LOG_FILE 2>&1
log_green "[SUCCESS] 关闭透明页成功"
}
exec_set_timezone() {
log_blue "修改时区"
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
log_echo "当前硬件时钟:"
hwclock >> $LOG_FILE
log_green "[SUCCESS] 修改时区成功"
}
exec_disable_selinux() {
log_blue "禁用SELINUX"
cp /etc/selinux/config /etc/selinux/config_$(date +"%Y%m%d%H%M%S").bak
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0 >> $LOG_FILE 2>&1
log_green "[SUCCESS] 禁用SELINUX成功"
}
exec_disable_firewall() {
log_blue "关闭防火墙"
log_echo "防火墙状态:"
systemctl status firewalld.service >> $LOG_FILE 2>&1
systemctl stop firewalld.service >> $LOG_FILE 2>&1
systemctl disable firewalld.service >> $LOG_FILE 2>&1
log_green "[SUCCESS] 关闭防火墙成功"
}
exec_install_oracle_database_1() {
log_blue "分发安装包"
mkdir -p /home/oracle/software/
chown -R oracle:oinstall /home/oracle/software/
PKG1="/root/install_oracle11g/pkgs/Linux-x86-64_database_1of7.zip"
PKG2="/root/install_oracle11g/pkgs/Linux-x86-64_database_2of7.zip"
if [ ! -f "/home/oracle/software/Linux-x86-64_database_1of7.zip" ]; then
cp "$PKG1" /home/oracle/software/ || {
log_red "[ERROR] 复制安装包1失败: $PKG1"
return 1
}
fi
if [ ! -f "/home/oracle/software/Linux-x86-64_database_2of7.zip" ]; then
cp "$PKG2" /home/oracle/software/ || {
log_red "[ERROR] 复制安装包2失败: $PKG2"
return 1
}
fi
chown -R oracle:oinstall /home/oracle/software/
log_blue "切换到oracle用户解压并准备安装"
su - oracle -c "
cd /home/oracle/software || { echo '切换目录失败'; exit 1; }
rm -rf database
unzip -q Linux-x86-64_database_1of7.zip || { echo '解压包1失败'; exit 1; }
unzip -q Linux-x86-64_database_2of7.zip || { echo '解压包2失败'; exit 1; }
if [ ! -d 'database' ]; then
echo '解压失败,未找到database目录'; exit 1;
fi
cp /usr/bin/unzip database/install/ || { echo '复制unzip工具失败'; exit 1; }
cd database || { echo '进入database目录失败'; exit 1; }
cp response/db_install.rsp response/db_install.rsp_$(date +"%Y%m%d%H%M%S").bak
cp response/dbca.rsp response/dbca.rsp_$(date +"%Y%m%d%H%M%S").bak
sed -i 's/^oracle.install.option=.*/oracle.install.option=$ORACLE_INSTALL_OPTION/g' response/db_install.rsp
sed -i 's/^ORACLE_HOSTNAME=.*/ORACLE_HOSTNAME=$HOSTNAME/' response/db_install.rsp
sed -i 's/^UNIX_GROUP_NAME=.*/UNIX_GROUP_NAME=$UNIX_GROUP_NAME/' response/db_install.rsp
sed -i 's|^INVENTORY_LOCATION=.*|INVENTORY_LOCATION=$INVENTORY_LOCATION|' response/db_install.rsp
sed -i 's/^SELECTED_LANGUAGES=.*/SELECTED_LANGUAGES=$SELECTED_LANGUAGES/' response/db_install.rsp
sed -i 's|^ORACLE_HOME=.*|ORACLE_HOME=$ORACLE_HOME|' response/db_install.rsp
sed -i 's|^ORACLE_BASE=.*|ORACLE_BASE=$ORACLE_BASE|' response/db_install.rsp
sed -i 's/^oracle.install.db.InstallEdition=.*/oracle.install.db.InstallEdition=$ORACLE_INSTALL_DB_INSTALL_EDITION/' response/db_install.rsp
sed -i 's/^oracle.install.db.DBA_GROUP=.*/oracle.install.db.DBA_GROUP=$ORACLE_INSTALL_DB_DBA_GROUP/' response/db_install.rsp
sed -i 's/^oracle.install.db.OPER_GROUP=.*/oracle.install.db.OPER_GROUP=$ORACLE_INSTALL_DB_OPER_GROUP/' response/db_install.rsp
sed -i 's/^DECLINE_SECURITY_UPDATES=.*/DECLINE_SECURITY_UPDATES=$DECLINE_SECURITY_UPDATES/' response/db_install.rsp
sed -i 's/^SECURITY_UPDATES_VIA_MYORACLESUPPORT=.*/SECURITY_UPDATES_VIA_MYORACLESUPPORT=$SECURITY_UPDATES_VIA_MY_ORACLE_SUPPORT/' response/db_install.rsp
ls -l response/
" || {
log_red "[ERROR] oracle用户处理安装包失败"
return 1
}
log_green "[SUCCESS] 静默安装数据库软件步骤1成功"
}
exec_install_oracle_database_2() {
log_blue "切换到oracle用户静默安装数据库"
if [ ! -d "/home/oracle/software/database" ]; then
log_red "[ERROR] 未找到database目录,安装包解压失败"
return 1
fi
su - oracle -c "
cd /home/oracle/software/database || { echo '进入database目录失败'; exit 1; }
./runInstaller -silent -ignorePrereq -responseFile /home/oracle/software/database/response/db_install.rsp > install.log 2>&1 &
" || {
log_red "[ERROR] 启动安装程序失败"
return 1
}
max_attempts=60
attempt=0
sleep_interval=60
log_file_oracle="/home/oracle/software/database/install.log"
success_flag="Successfully Setup Software"
log_blue "等待Oracle安装完成,这可能需要较长时间..."
while [ $attempt -lt $max_attempts ]; do
if [ -f "$log_file_oracle" ] && grep -q "$success_flag" "$log_file_oracle"; then
log_green "Oracle软件安装成功!"
break
fi
sleep $sleep_interval
attempt=$((attempt + 1))
log_blue "已等待 $(($attempt * $sleep_interval)) 秒,继续等待..."
done
if [ $attempt -eq $max_attempts ]; then
log_red "达到最大尝试次数,退出。请检查日志文件: $log_file_oracle"
return 1
fi
sh /u01/app/oraInventory/orainstRoot.sh >> $LOG_FILE 2>&1 && log_blue "oraInventory root脚本执行成功"
sh /u01/app/oracle/product/11.2.0/db_1/root.sh >> $LOG_FILE 2>&1 && log_blue "Oracle数据库root脚本执行成功"
}
# 执行所有步骤
proc pre_check
proc set_hostname
proc set_users_and_groups
proc set_oracle_password
proc create_data_directories
proc install_dependencies
proc adjust_kernel_parameters
proc modify_system_resource_limits
proc disable_transparent_hugepage
proc set_timezone
proc disable_selinux
proc disable_firewall
proc switch_to_oracle_user
proc install_oracle_database_1
proc install_oracle_database_2
proc start_lns
proc install_oracle_database_3
proc start_database
proc check_oracle
# 结束提示
echo "=================================================="
purple_echo " Oracle 11g 安装成功完成! "
echo "=================================================="
log_purple "****** Oracle 11g 安装成功完成! ******"
# 数据库信息输出
blue_echo "数据库信息:"
blue_echo " - 实例名: $ORACLE_SID"
blue_echo " - 全局数据库名: $GLOBAL_DATABASE_NAME"
blue_echo " - SYS密码: $SYS_PASSWORD"
blue_echo " - SYSTEM密码: $SYSTEM_PASSWORD"
blue_echo " - 监听状态: 使用 'lsnrctl status' 查看"
blue_echo " - 连接命令: sqlplus sys/$SYS_PASSWORD@$ORACLE_SID as sysdba"
green_echo "请记录以上信息以备后续使用!"
# 数据库信息写入日志
log_blue "数据库信息:" >> $LOG_FILE
log_blue " - 实例名: $ORACLE_SID" >> $LOG_FILE
log_blue " - 全局数据库名: $GLOBAL_DATABASE_NAME" >> $LOG_FILE
log_blue " - SYS密码: $SYS_PASSWORD" >> $LOG_FILE
log_blue " - SYSTEM密码: $SYSTEM_PASSWORD" >> $LOG_FILE
log_blue " - 监听状态: 使用 'lsnrctl status' 查看" >> $LOG_FILE
log_blue " - 连接命令: sqlplus sys/$SYS_PASSWORD@$ORACLE_SID as sysdba" >> $LOG_FILE
log_green "请记录以上信息以备后续使用!" >> $LOG_FILE
bash
[root@oracleServer install_oracle11g]#./1.sh
