oracle 高可用方案-主从搭建与切换

oracle 高可用方案-主从搭建与切换

一、主从搭建

1、环境要求

(1)主从数据库的 CPU,系统位数,版本必须一致:本文采用centos7.6
(2)数据库版本必须为企业版,且版本必须大于 10g:本文采用Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
(3)数据库必须开启归档模式 :安装脚本已做配置
(4)数据库的 dbname (physical standby 要求必须一致,logical standby 要求必须不一致) :安装脚本已做配置
(5)主从数据库的 db_unique_name 必须设置成不一样 :安装脚本已做配置
(6)需要开启 force logging 属性,logical standby 还要求开启附加日志
配置监听器静态注册(可选) :安装脚本已做配置

2、文件上传

文件下载地址见附件

(1)将脚本与安装包分别上传到主、从服务器上,如下
主:
在这里插入图片描述
从:
在这里插入图片描述

备注:如有公共yum源可用,则无需上传CentOS-7-x86_64-Everything-1810.iso,删除oracleInstall_Primary.sh和oracleInstall_standby.sh脚本的
“######################创建yum源######################”这一大步骤,使用公共yum源即可

3、开始部署

备注:严格按照以下顺序操作

(1)主节点执行:sh oracleInstall_Primary.sh
按提示输入相应信息:
在这里插入图片描述
回车等待安装下一步提示
(2)从节点执行:sh oracleInstall_standby.sh
按提示输入相应信息:
在这里插入图片描述
回车等待安装下一步提示
(3)主:出现“尝试登入数据库时”表示数据库安装完成,输入exit,继续下一步
在这里插入图片描述
(4)从:出现“尝试登入数据库时”表示数据库安装完成,输入exit,继续下一步
在这里插入图片描述
(5)主:输入y确认从数据库已安装完成,再输入从服务器root的密码将相应文件传送至从数据库
在这里插入图片描述
(6)从:输入y,确认已从主服务接收相应文件,开始自动重建spfile,并自动重启从数据库
在这里插入图片描述

在这里插入图片描述
(7)主:待第(6)步完成,输入y,自动将主库的数据同步到从库
在这里插入图片描述

在这里插入图片描述
(8)从:待第(7)步同步完,输入y,自动将从库置于 active dataguard 模式下
在这里插入图片描述

在这里插入图片描述
(9)主:备库dataguard配置完后,在主库输入y继续进行下一步进行主库DG_BROKER_START配置
在这里插入图片描述
(10)从:主库DG_BROKER_START配置完成,在备库输入y继续进行下一步进行备库DG_BROKER_START配置
在这里插入图片描述
(11)主:待备库DG_BROKER_START配置完成,在主库输入y确认进行dgmgrl配置
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、测试数据同步情况

在主库执行新建表空间操作,同步后,查看备库情况
(1)主:

sqlplus / as sysdba;
host mkdir -p /home/oracle/tablespacefile/ 
create tablespace ITM datafile '/home/oracle/tablespacefile/itm01.dbf' size 100M;

在这里插入图片描述

查看主库表空间和服务器上的数据文件:

select df.tablespace_name "表空间名", totalspace / 1024 "总空间 G", freespace / 1024 "剩余空间 G", round((1 - freespace / totalspace) * 100, 2) "使用率%" from (select tablespace_name, round(sum(bytes) / 1024 / 1024) totalspace from dba_data_files group by tablespace_name) df, (select tablespace_name, round(sum(bytes) / 1024 / 1024) freespace from dba_free_space group by tablespace_name) fs where df.tablespace_name = fs.tablespace_name;

在这里插入图片描述
(2)从:看从库表空间和服务器上的数据文件:
在这里插入图片描述
显然已自动同步成功
备注:同步日志 alert*.log 主:/home/oracle/app/oracle/diag/rdbms/primary/itsmdb/trace/alert_itsmdb.log 从:/home/oracle/app/oracle/diag/rdbms/standby/itsmdb/trace/alert_itsmdb.log

二、Data Guard Broker 自动切换

Data Guard Broker 切换方式很简单,通常 3 条命令即可搞定。

1、说明

可先在主从服务器上查看一下哪里是 primary 库,哪里是 standby 库:

 select db_unique_name,open_mode,database_role,switchover_status from v$database;

在这里插入图片描述
在这里插入图片描述
也可在 dgmgrl 里使用: show configuration 查看状态,最好是在 dgmgrl 里查看下状态, 再使用 connect sys/itm_i09d@primaryconnect sys/itm_i09d@standby 做相应 切换操作。
在这里插入图片描述
例如:
在这里插入图片描述

2、切换命令:根据实际情况使用

主切从:

dgmgrl
connect sys/itm_i09d@primary
switchover to standby

延伸:从切主(若执行完“主切从”,则无需再执行这一步,通常适用于主库所在的服务器宕机的情况下)

dgmgrl
connect sys/itm_i09d@standby
switchover to primary

备注:以上两个切换方式任选一个操作即可。通常执行“主切从”(从切主同理)步骤完,主库会自动降为备库,备库会自动升为主库。有时切换完成若报ORA-12514: TNS:listener does not currently know of service requested in connect descriptor手动重启(startup)一下被关掉的库,检查主从状态正常即可。

3、场景实验:

1、主服务器上跑的是逻辑主库、从服务器上跑的是逻辑备库,在主服务器上执行dgmgrl操作,将原主库切换为备库:
切换很简单,按以下三步操作即可完成。执行完以下三步操作,从库将自动升为主库。

dgmgrl
connect sys/itm_i09d@primary
switchover to standby

在这里插入图片描述
查看原主库状态,可以发现现在已将变为备库:
在这里插入图片描述
查看原备库状态,可以发现现在已经变为主库:
在这里插入图片描述
测试数据同步:
在这里插入图片描述
在这里插入图片描述
2、主服务器上跑的是逻辑主库、从服务器上跑的是逻辑备库,在从服务器上执行dgmgrl操作,将原主库切换为备库:
切换仍然很简单,按以下三步操作即可完成。执行完以下三步操作,需要重启一下原主库(即主服务器上的数据库)。

dgmgrl
connect sys/itm_i09d@primary
switchover to standby

说明:与1不同的是,这里切换完,主服务器上的数据库被停掉了,所以会断开连接,需要连接到主服务器,重启一下数据库。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
同理接下来进行数据同步验证。(此处省略,请自行继续验证)

三、主从手工切换

正常切换:数据同步完成之后需要相应的对换主从关系,以前的从库切换为主库,主库
切换为从库,以前从库可以保留也可以切换为备库使用

1、确认主库(primary)和备库日志应用状态

(1)主:正常情况下主库的 switchover_status 应当为 to_standby ,使用如下语句查看主库

select db_unique_name,open_mode,database_role,switchover_status from v$database;

在这里插入图片描述
(2)从:查看备库日志应用状态
在这里插入图片描述

2、主库执行切换 switchover

主:使用如下语句执行主库切换到物理备库:

alter database commit to switchover to physical standby;

在这里插入图片描述
注意:切换后,主数据库会自动 shutdown,需要手动重启到 mount 状态,并查看日志应用状态,此时 primary 已经变成 standby

startup mount;
select db_unique_name,open_mode,database_role,switchover_status from v$database;
alter database open;

在这里插入图片描述

3、备库执行切换 switchover

从:
(1)首先查看备库状态

select db_unique_name,open_mode,database_role,switchover_status from v$database;

在这里插入图片描述
(2)执行切换 : alter database commit to switchover to primary;
在这里插入图片描述
(3)查看备库日志应用状态

select db_unique_name,open_mode,database_role,switchover_status 
from v$database;

在这里插入图片描述
发现备库已经切换为主库存
(4)打开数据库
alter database open;
在这里插入图片描述
(5)再次查看日志应用状态,完成切换
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、将原主库(切换完现为从库)启动到 read only with apply

将备库 start 到 mount 状态,查看日志应用状态,为 read only 模式,完成切换
(1)查看当前应用日志状态

select db_unique_name,open_mode,database_role,switchover_status 
from v$database;

在这里插入图片描述
(2)切换为read only模式,重新建立同步

alter database recover managed standby database using current logfile disconnect from session; 

在这里插入图片描述
(3)再次查看当前应用日志状态

select db_unique_name,open_mode,database_role,switchover_status 
from v$database;

在这里插入图片描述

5、测试数据同步情况

在新主库(原从库)执行新建表空间操作,同步后,查看新备库(原主库)情况
(1)新主库(原从库):创建表空间并查看文件

alter tablespace ITM add datafile '/home/oracle/tablespacefile/itm02.dbf' size 100M;
select df.tablespace_name "表空间名",
       totalspace / 1024 "总空间G",
       freespace / 1024 "剩余空间G",
       round((1 - freespace / totalspace) * 100, 2) "使用率%"
from (select tablespace_name, round(sum(bytes) / 1024 / 1024) totalspace
          from dba_data_files
         group by tablespace_name) df,
       (select tablespace_name, round(sum(bytes) / 1024 / 1024) freespace
          from dba_free_space
         group by tablespace_name) fs
where df.tablespace_name = fs.tablespace_name;

在这里插入图片描述
(2)新从库(原主库):查看表空间和文件
在这里插入图片描述
备注:如果查询提示如下报错
在这里插入图片描述
则先将同步关掉,待数据库open完再开启同步

alter database recover managed standby database cancel;
alter database open;
alter database recover managed standby database using current logfile disconnect from session; 

四、应急切换

在这里插入图片描述
由于是 failover,所以理解主库这时候已经无法正常使用,只需备库切换至 primary db
1、从(备)库:
(1)停止应用恢复模式

alter database recover managed standby database finish;

在这里插入图片描述
(2)转换 standbydb 为 primary db

alter database commit to switchover to primary;

在这里插入图片描述
(3)重启数据库,恢复正常业务

shutdown immediate; 
Startup; 

在这里插入图片描述
(4)select open_mode,database_role from v$database;
在这里插入图片描述

(5)待主库所在的服务器开机完,重启一下上面的数据库,检查下主从状态

附件:1
oracleInstall_Primary.sh

#!/bin/bash
echo "初始化安装脚本"
<<COMMENT
  注:
   author:whj
   CREATED: 2021.07.13
   oracle版本:11.2.0.4.0
   CentOS Linux release 7.6.1810 (Core)  (已在centos7.6上完成测试,centos6尚未测试)
   使用方法:见操作手册
   注意:
   1、此脚本适用于无法联网的环境离线安装oracle,如服务器可联网,删掉脚本里的   #####创建yum源这一大步骤就可以####    ,这里就不做判别了,也无需上传完整版镜像包
   2、运行脚本后主机名将会修改,且在下一次登入终端时生效
COMMENT
#sed -i 's/\r//' oracleInstall.sh
theip_1=`ip addr|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"|head -1|awk -F '/' '{print $1}'`

######################定义变量######################
#setHostName=dbServer             #定义linux主机名
#SIDNAME=itsmdb                   #定义实例名
#passwordAll=itm_i09d             #设置数据库密码
#dbPort=1555                      #设置数据库连接端口号
#theip=192.168.2.120               #输入当前服务器IP

read -p "请输入预设主机名(默认hostname将设为dbServer):"  setHostName_0
setHostName=${setHostName_0:-dbServer}
read -p "请输入预设数据库实例ID名(默认将设为itsmdb):" SIDNAME_0
SIDNAME=${SIDNAME_0:-itsmdb}
read -p "请输入预设数据库密码(默认将设为itm_i09d):" passwordAll_0
passwordAll=${passwordAll_0:-itm_i09d}
#read -p "请输入预设数据库端口号(默认将设为1521):" dbPort_0
#dbPort=${dbPort_0:-1521}
read -p "请输入本机IP(默认为$theip_1):" theip_0
theip=${theip_0:-$theip_1}
read -p "请输入从数据库的IP(standby):" theip_standby
read -p "请输入从数据库实例ID名(默认将设为itsmdb):" SIDNAME_1
SIDNAME_STANDBY=${SIDNAME_1:-itsmdb}
#read -p "请输入从数据库密码(默认将设为itm_i09d):" passwordAll_1
#passwordAll_STANDBY=${passwordAll_1:-itm_i09d}




file1_1=p13390677_112040_Linux-x86-64_1of7.zip
file1_2=p13390677_112040_Linux-x86-64_2of7.zip


##以下变量默认,无需修改
osVersion=$(cat /etc/redhat-release | tr -cd "[0-9]")
osNum7=${osVersion:0-4:4}
osNum6=${osVersion:0:2}
osNum=${osVersion:0:1}
isoNum=0
realIsoNum=`cat /etc/redhat-release | tr -cd "[0-9]."|awk -F '.' '{print $1"."$2}'`
dir=$(pwd)
#theip=`ip addr|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"|head -1|awk -F '/' '{print $1}'`



#####################定义函数#######################
function exVar
{
     TMP=/tmp
	 TMPDIR=$TMP   
	 ORACLE_BASE=/home/oracle/app/oracle
	 ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
	 ORACLE_SID=$SIDNAME
	 ORACLE_UNQNAME=$SIDNAME
	 ORACLE_TERM=xterm
	 PATH=$ORACLE_HOME/bin:$PATH
	 LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
}
function filetobak
{
  cp -f /etc/sysctl.conf.bak`date +%Y%m%d`  /etc/sysctl.conf
  cp -f /etc/security/limits.conf.bak`date +%Y%m%d`  /etc/security/limits.conf
  cp -f /etc/selinux/config.bak.`date +%Y%m%d`      /etc/selinux/config
  cp -f /etc/pam.d/login.bak.`date +%Y%m%d`  /etc/pam.d/login
  userdel oracle
  groupdel dba   
  groupdel oinstall
  groupdel asmdba
  groupdel asmadmin
  rm -rf /home/oracle/
  rm -f /etc/sysctl.conf.bak`date +%Y%m%d`  /etc/security/limits.conf.bak`date +%Y%m%d` /etc/selinux/config.bak.`date +%Y%m%d`  /etc/pam.d/login.bak.`date +%Y%m%d`
}
function stopInstall
{
  ID=`ps -ef | grep db_install.rsp | grep -v "grep" | awk '{print $2}'`   
  echo "---------------"  
  for id in $ID  
  do  
  kill -9 $id  
  done
  rm -rf /home/oracle/app/oracle/
  rm -f /etc/oraInst.loc
  rm -f /usr/local/bin/dbhome
  rm -f /usr/local/bin/oraenv
  rm -f /usr/local/bin/coraenv
  rm -f /etc/oratab
}
#####################确认是root用户安装###########
if [ $(id -u) != "0" ];then
   echo "Error: You must be root to run this script!"
   exit 1
fi
  
echo "========================================================================="
echo " install Oracle 11.2.0.4.0 on CentOS  $realIsoNum"
echo "========================================================================="
#####################修改主机名###########
if [ "$osNum" == "6" ]
then 
cat>> /etc/sysconfig/network<<EOF
NETWORKING=yes
HOSTNAME=$setHostName
EOF

cat>> /etc/hosts<<EOF
$theip  $setHostName
EOF

 hostname $setHostName
# exec bash
fi
  
if [ "$osNum" == "7" ]
then 
hostnamectl set-hostname $setHostName

cat>> /etc/hosts<<EOF
$theip    $setHostName  
EOF

 hostname 
 #exec bash
fi
######################创建yum源######################
cd /mnt
if [ -d cdrom ];then
    echo "cdrom目录已创建"
    else
    mkdir -p /mnt/cdrom
fi
cd -
ls CentOS-*.iso >ls.txt 2>&1
if (( $?==0 ))
then
  isoVersion=$(cat ls.txt | tr -cd "[0-9]")
else
  echo "Error:当前目录下未找到镜像,请检查镜像格式"
  exit 1
fi

if (( $osNum==7 ))
then
  isoNum=${isoVersion:0-4:4}
else
  isoNum=${isoVersion:0:2}
fi
if [[ "$isoNum" == "$osNum7" || "$isoNum" == "$osNum6" ]]
  then
    echo "已检测到镜像"
else
    echo "Error:镜像与系统不匹配,请检上传的镜像版本"
    exit 1
fi

mount $(cat ls.txt) -o loop /mnt/cdrom
if [[ $?==32 || $?==0 ]]
then
  echo "镜像已挂载"
  continue
else
  echo "Error:挂载出错,请检查镜像完整性"
  exit 1
fi

rm -f ls.txt 
cd  /etc/yum.repos.d

# 判断备份目录是否创建
if [ -d repobak`date +%Y%m%d` ];then
    echo "yum备份目录已创建"
    else
    mkdir -p repobak`date +%Y%m%d`
fi
mv *.repo repobak`date +%Y%m%d`/ >/dev/null  2>&1
cat >>local.repo<<EOF
[local_server]
name=This is a local repo
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=1
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-$osNum

EOF
echo "正在创建yum源"
yum  clean all;yum makecache

######################安装环境依赖###########################
yum install -y binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel expat gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers libaio libaio-devel libgcc libstdc++ libstdc++-devel make unixODBC unixODBC-devel zip unzip lm_sensors-libs sysstat libtool-ltdl
rpm -q binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel expat gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers libaio libaio-devel libgcc libstdc++ libstdc++-devel make unixODBC unixODBC-devel zip unzip lm_sensors-libs sysstat libtool-ltdl
if (( $?==0 ))
then
  echo "相关依赖包已安装完毕"
else
  echo "Error:当前镜像缺少相关依赖,请检查镜像是否为全量版(Everything iso)"
  exit 1
fi

######################修改linux参数######################
cd /etc
cp sysctl.conf sysctl.conf.bak`date +%Y%m%d`
cat>>sysctl.conf<<EOF
kernel.shmall = 2097152
kernel.shmmax = 536870912
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
cd /sbin/;sysctl -p

cd /etc/security/
cp limits.conf limits.conf.bak`date +%Y%m%d`
cat>>limits.conf<<EOF
oracle soft nproc 10240
oracle hard nproc 10240
oracle soft nofile 65536
oracle hard nofile 65536
EOF

cd /etc/pam.d/
cp login login.bak.`date +%Y%m%d`
cat>>login<<EOF
session    required     pam_limits.so
EOF


###关闭防火墙##
cd /etc/selinux
cp config config.bak.`date +%Y%m%d`
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

if (( $osNum==6 ))
then
  service iptables stop
  chkconfig iptables off
else
  systemctl stop firewalld.service && systemctl disable firewalld.service
fi



######################创建用户和用户组######################

for GROUP_NAME in dba oinstall asmdba asmadmin
do
if [ -z $(cat /etc/group|awk -F: '{print $1}'| grep -w "$GROUP_NAME") ]
then
  groupadd  $GROUP_NAME
    if(($? == 0 ))
         then
         echo "group $GROUP_NAME add sucessfully!"
    fi
else
  echo "$GROUP_NAME is exsits"
fi
done
useradd -g oinstall -G dba,asmdba,asmadmin oracle
if(($? == 0 ))
then
  echo " oracle 用户创建成功!"
fi


######################设置oracle用户环境变量######################
su - oracle<<"EOF"
if [ -d app ];then
    echo "app目录已创建"
    else
    mkdir -p app
fi
chmod 777 -R app
EOF

cat>>/home/oracle/.bash_profile<<profile
export TMP=/tmp
export TMPDIR=\$TMP   
export ORACLE_BASE=\$HOME/app/oracle
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db_1
export ORACLE_SID=$SIDNAME
export ORACLE_UNQNAME=$SIDNAME
export ORACLE_TERM=xterm
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:\$LD_LIBRARY_PATH
profile
 
source /home/oracle/.bash_profile



######################解压安装包######################
cd $dir
for oraFile in $file1_1 $file1_2
do
if [ -f $oraFile ]
then
  chown -R oracle:oinstall $oraFile
  sysctl -w kernel.watchdog_thresh=30
  echo "正在复制安装包......"
  cp $oraFile /home/oracle
else
  filetobak
  echo "ERROR:未在当前目录下找到安装包"
  exit 1
fi
done

cd /home/oracle
unzip $file1_1
if(( $? != 0 ))
then
  echo " 解压失败,请检查文件完整性"
  filetobak
  exit 1
fi
unzip $file1_2
if(( $? != 0 ))
then
  echo " 解压失败,请检查文件完整性"
  filetobak
  exit 1
else
  echo "解压安装文件成功"
fi
rm -f $file1_1 $file1_2
chown -R oracle:oinstall /home/oracle




######################安装数据库######################
####修改安装响应文件####
echo "正在修改安装文件......"
sed -i '29s#oracle.install.option=#oracle.install.option=INSTALL_DB_SWONLY#'  /home/oracle/database/response/db_install.rsp
sed -i '42s#UNIX_GROUP_NAME=#UNIX_GROUP_NAME=oinstall#'  /home/oracle/database/response/db_install.rsp
sed -i '49s#INVENTORY_LOCATION=#INVENTORY_LOCATION=/home/oracle/app/oracle/oraInventory#'  /home/oracle/database/response/db_install.rsp
sed -i '86s#SELECTED_LANGUAGES=en#SELECTED_LANGUAGES=en,zh_CN#'  /home/oracle/database/response/db_install.rsp
sed -i '91s#ORACLE_HOME=#ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/db_1#'  /home/oracle/database/response/db_install.rsp
sed -i '96s#ORACLE_BASE=#ORACLE_BASE=/home/oracle/app/oracle#'  /home/oracle/database/response/db_install.rsp
sed -i '107s#oracle.install.db.InstallEdition=#oracle.install.db.InstallEdition=EE#'  /home/oracle/database/response/db_install.rsp
sed -i '117s#oracle.install.db.EEOptionsSelection=false#oracle.install.db.EEOptionsSelection=true#'  /home/oracle/database/response/db_install.rsp
sed -i '154s#oracle.install.db.DBA_GROUP=#oracle.install.db.DBA_GROUP=dba#'  /home/oracle/database/response/db_install.rsp
sed -i '160s#oracle.install.db.OPER_GROUP=#oracle.install.db.OPER_GROUP=oinstall#'  /home/oracle/database/response/db_install.rsp
sed -i '176s#oracle.install.db.isRACOneInstall=#oracle.install.db.isRACOneInstall=false#'  /home/oracle/database/response/db_install.rsp
sed -i '189s#oracle.install.db.config.starterdb.type=#oracle.install.db.config.starterdb.type=GENERAL_PURPOSE#'  /home/oracle/database/response/db_install.rsp
sed -i '194s#oracle.install.db.config.starterdb.globalDBName=#oracle.install.db.config.starterdb.globalDBName='"$SIDNAME"'#'  /home/oracle/database/response/db_install.rsp
sed -i '199s#oracle.install.db.config.starterdb.SID=#oracle.install.db.config.starterdb.SID='"$SIDNAME"'#'  /home/oracle/database/response/db_install.rsp
sed -i '229s#oracle.install.db.config.starterdb.memoryLimit=#oracle.install.db.config.starterdb.memoryLimit=1024#'  /home/oracle/database/response/db_install.rsp
sed -i '262s#oracle.install.db.config.starterdb.password.ALL=#oracle.install.db.config.starterdb.password.ALL='"$passwordAll"'#'  /home/oracle/database/response/db_install.rsp
sed -i '400s#DECLINE_SECURITY_UPDATES=#DECLINE_SECURITY_UPDATES=true#'  /home/oracle/database/response/db_install.rsp
echo "修改安装文文件完毕......"

####开始安装oracle####
exVar
su - oracle<<EOF
cd  /home/oracle/database
if [ -f nohup.out ]
then
    rm nohup.out
fi
nohup ./runInstaller -silent -noconfig -ignorePrereq -responseFile /home/oracle/database/response/db_install.rsp  &
EOF
sleep 10
echo "正在安装中,请不要退出"
cd /home/oracle/database
while true 
do
grep "FATAL" /home/oracle/database/nohup.out
grp0=$?
grep "Failed" /home/oracle/database/nohup.out
grp3=$?
if [[ "$grp0" == "0" || "$grp3" == "0" ]]
then
  cp  /home/oracle/database/nohup.out  $dir/oraInstall.log
  echo "安装失败,请查看$dir下的oraInstall.log日志"
  stopInstall
  filetobak
  exit 1 
fi
grep "/home/oracle/app/oracle/oraInventory/orainstRoot.sh" nohup.out
grp1=$?
grep "/home/oracle/app/oracle/product/11.2.0/db_1/root.sh" nohup.out
grp2=$?
if [[ "$grp1" == "0" && "$grp2" == "0" ]]
then 
  echo "检查到相关配置脚本,请稍等" 
  sleep 10 
  break
else
sleep 10
fi
done

echo "让我休息15秒吧......"
sleep 15
grep "Successfully Setup Software."   nohup.out
grp4=$?
if [ "$grp4" == '0' ]
  then
	echo "install success,进行下一步配置"
else 
   echo "还未检测到成功信息,去看日志叭"
   echo "------退出本次安装------" 
   stopInstall
   filetobak
   exit 1   
fi

####执行脚本####
sh /home/oracle/app/oracle/oraInventory/orainstRoot.sh
sh /home/oracle/app/oracle/product/11.2.0/db_1/root.sh

######################创建itsm数据库实例######################
####修改建库响应文件####
echo "正在修改建库文件......"
 sed -i '78s#GDBNAME = "orcl11g.us.oracle.com"#GDBNAME ="'"$SIDNAME"'"#'        /home/oracle/database/response/dbca.rsp
 sed -i '170s#SID = "orcl11g"#SID ="'"$SIDNAME"'"#'        /home/oracle/database/response/dbca.rsp
 sed -i '418s#\#CHARACTERSET = "US7ASCII"#CHARACTERSET = "ZHS16GBK"#'        /home/oracle/database/response/dbca.rsp
 sed -i '428s#\#NATIONALCHARACTERSET= "UTF8"#NATIONALCHARACTERSET= "AL16UTF16"#'        /home/oracle/database/response/dbca.rsp
 sed -i '523s#\#MEMORYPERCENTAGE = "40"#MEMORYPERCENTAGE = "50"#'        /home/oracle/database/response/dbca.rsp
 sed -i '533s#\#DATABASETYPE = "MULTIPURPOSE"#DATABASETYPE = "MULTIPURPOSE"#'        /home/oracle/database/response/dbca.rsp
 sed -i '543s#\#AUTOMATICMEMORYMANAGEMENT = "TRUE"#AUTOMATICMEMORYMANAGEMENT = "TRUE"#'        /home/oracle/database/response/dbca.rsp
 sed -i '553s#\#TOTALMEMORY = "800"#TOTALMEMORY = "1024"#'        /home/oracle/database/response/dbca.rsp
 sed -i '475s#\#LISTENERS = "listener1 listener2"#LISTENERS = "LISTENER"#'        /home/oracle/database/response/dbca.rsp
 sed -i '211s#\#SYSPASSWORD = "password"#SYSPASSWORD = "'"$passwordAll"'"#'        /home/oracle/database/response/dbca.rsp
 sed -i '221s#\#SYSTEMPASSWORD = "password"#SYSTEMPASSWORD = "'"$passwordAll"'"#'        /home/oracle/database/response/dbca.rsp
echo "修改建库响应文件完毕......"


####创建数据库、配置oracle监听####
su - oracle<<EOF
cd $ORACLE_HOME/bin
echo "正在创建数据库中,请不要退出......"
dbca -silent -responsefile  /home/oracle/database/response/dbca.rsp
netca -silent -responsefile /home/oracle/database/response/netca.rsp

EOF


######################配置开机自启动######################
####修改oracle启停脚本####
echo "正在修改oracle启停脚本"
   sed -i '80s#ORACLE_HOME_LISTNER=\$1#ORACLE_HOME_LISTNER=\$ORACLE_HOME#' $ORACLE_HOME/bin/dbstart
   sed -i '50s#ORACLE_HOME_LISTNER=\$1#ORACLE_HOME_LISTNER=\$ORACLE_HOME#' $ORACLE_HOME/bin/dbshut
   sed -i '23s#itsmdb:/home/oracle/app/oracle/product/11.2.0/db_1:N#itsmdb:/home/oracle/app/oracle/product/11.2.0/db_1:Y#'    /etc/oratab
echo "修改oracle启停脚本成功"

####创建自动执行文件####
echo "正在创建自动执行文件......"
cat >>/etc/rc.d/init.d/oracle<<EOF
#!/bin/bash
# whoami # root 
# chkconfig: 345 51 49  
# description: starts the oracle dabasedeamons 
# 
ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/db_1
ORACLE_OWNER=oracle 
ORACLE_DESC="Oracle 11g" 
case "\$1" in 
'start') 
echo -n \"Starting \${ORACLE_DESC}:\" 
runuser - \$ORACLE_OWNER -c '\$ORACLE_HOME/bin/lsnrctl start' 
runuser - \$ORACLE_OWNER -c '\$ORACLE_HOME/bin/dbstart' 
runuser - \$ORACLE_OWNER -c '\$ORACLE_HOME/bin/emctl start dbconsole' 
touch \${ORACLE_LOCK} 
echo 
;; 
'stop') 
echo -n "shutting down \${ORACLE_DESC}: " 
runuser - \$ORACLE_OWNER -c '\$ORACLE_HOME/bin/lsnrctl stop' 
runuser - \$ORACLE_OWNER -c '\$ORACLE_HOME/bin/dbshut' 
rm -f \${ORACLE_LOCK} 
echo  
;; 
'restart') 
echo -n "restarting \${ORACLE_DESC}:" 
\$0 stop 
\$0 start 
echo 
;; 
*)  
echo "usage: \$0 { start | stop | restart }" 
exit 1 
esac 
exit 0

EOF
echo "创建自动执行文件成功......"
cd /etc/rc.d/init.d
chmod 755 oracle
chkconfig --add oracle
chk1=$?
chkconfig --level 345 oracle on
chk2=$?
if [[ "$chk1" == "0" && "$chk2" == "0" ]]
then
  echo  "配置开机自启动成功"
else
  echo "配置开机自启动失败,请检查......"
  exit 1
fi
service oracle restart
if [ "$?" == "0" ]
then 
  echo "oracle服务重启成功"
else
  echo "oracle服务重启失败,请检查......"
  exit1
fi



######################修改数据库连接端口号######################
#su - oracle<<EOF
#  lsnrctl stop
#  sed -i 's/1521/$dbPort/g'  $ORACLE_HOME/network/admin/listener.ora
#  
#  sqlplus / as sysdba <<sqlcom
#  show parameter local_listener;
#  alter system set local_listener="(address = (protocol = tcp)(host = $theip)(port = $dbPort))";
#  show parameter local_listener;
#  quit
#  sqlcom
#EOF
echo "至此,安装完成"


######################尝试验证登入oracle######################
echo "--------------------查看oracle监听--------------------"
su - oracle -c "lsnrctl start"
su - oracle -c "lsnrctl status"
echo "--------------------尝试登入数据库--------------------"
su - oracle -c "sqlplus / as sysdba" 




######################在主库上修改 dataguard 配置相关参数######################
echo "正在修改listener.ora"
cat >>/home/oracle/app/oracle/product/11.2.0/db_1/network/admin/listener.ora<<EOF
PRIMARY =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $theip)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVER = primary_DGMGRL)
 (SERVICE_NAME = $SIDNAME)
 )
 )

LOCAL`echo $SIDNAME|tr [a-z] [A-Z]` =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $theip)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVICE_NAME = local$SIDNAME)
 )
 )

LISTENER_`echo $SIDNAME|tr [a-z] [A-Z]` =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $setHostName)(PORT = 1521))

STANDBY =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $theip_standby)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVER = standby_DGMGRL)
 (SERVICE_NAME = $SIDNAME_STANDBY)
 )
 )


SID_LIST_LISTENER =
 (SID_LIST =
 (SID_DESC =
 (GLOBAL_DBNAME = $SIDNAME)
 (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/db_1)
 (SID_NAME = $SIDNAME)
 )
 (SID_DESC =
 (GLOBAL_DBNAME = primary_DGMGRL)
 (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/db_1)
 (SID_NAME = $SIDNAME)
 )
 )



EOF


echo "正在修改tnsnames.ora"
cat >>/home/oracle/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora<<EOF

STANDBY =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $theip_standby)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVER = standby_DGMGRL)
 (SERVICE_NAME = $SIDNAME_STANDBY)
 )
 )

PRIMARY =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $theip)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVER = primary_DGMGRL)
 (SERVICE_NAME = $SIDNAME)
 )
 )

LOCAL`echo $SIDNAME|tr [a-z] [A-Z]` =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $theip)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVICE_NAME = local$SIDNAME)
 )
 )

LISTENER_`echo $SIDNAME|tr [a-z] [A-Z]` =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $setHostName)(PORT = 1521))


SID_LIST_LISTENER =
 (SID_LIST =
 (SID_DESC =
 (GLOBAL_DBNAME = $SIDNAME)
 (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/db_1)
 (SID_NAME = $SIDNAME)
 )
 (SID_DESC =
 (GLOBAL_DBNAME = primary_DGMGRL)
 (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/db_1)
 (SID_NAME = $SIDNAME)
 )
 )

EOF


echo "-------------正在修改主库dataguard配置相关参数--------------------------"
su - oracle<<EOF
sqlplus / as sysdba <<sqlcom
alter database force logging;
alter system set db_unique_name='primary' scope=spfile;
alter system set log_archive_config='DG_CONFIG=(primary,standby)';
alter system set log_archive_dest_1='location=use_db_recovery_file_dest valid_for=(online_logfile,all_roles) db_unique_name=primary' scope=spfile;
alter system set log_archive_dest_2='service=standby lgwr sync valid_for=(online_logfile,primary_role) db_unique_name=standby' scope=spfile;
host mkdir -p /home/oracle/standbylog;
host mkdir -p /home/oracle/app/oracle/fast_recovery_area;
host mkdir -p /home/oracle/app/oracle/admin/itsmdb/adump;
alter system set log_archive_dest_3='location=/home/oracle/standbylog valid_for=(standby_logfile,standby_role) db_unique_name=primary' scope=spfile;
alter system set fal_client='primary';
alter system set fal_server='standby';
alter system set standby_file_management=auto;
alter database add standby logfile group 4 size 50M,group 5 size 50M,group 6 size 50M,group 7 size 50M;
alter system set local_listener='LISTENER_ITSMDB';
shutdown immediate;
startup;
create pfile='/home/oracle/primary.ora' from spfile;

quit
sqlcom

#####重启监听####
echo “开始重启监听”
lsnrctl stop
lsnrctl start


cp /home/oracle/primary.ora  /home/oracle/standby.ora
sed -i 's/DG_CONFIG=(primary,standby)/zanshitidai_1/g'  /home/oracle/standby.ora
sed -i 's/(online_logfile,primary_role)/zanshitidai_2/g'   /home/oracle/standby.ora
sed -i 's/standbylog/zanshitidai_3/g'  /home/oracle/standby.ora
sed -i 's/standby_/zanshitidai_4_/g'  /home/oracle/standby.ora
sed -i 's/primary/zanshitidai_5/g'  /home/oracle/standby.ora
sed -i 's/standby/primary/g'   /home/oracle/standby.ora
sed -i 's/zanshitidai_5/standby/g' /home/oracle/standby.ora
sed -i 's/zanshitidai_1/DG_CONFIG=(primary,standby)/g'  /home/oracle/standby.ora
sed -i 's/zanshitidai_2/(online_logfile,primary_role)/g'   /home/oracle/standby.ora
sed -i 's/zanshitidai_3/standbylog/g'  /home/oracle/standby.ora
sed -i 's/zanshitidai_4_/standby_/g'  /home/oracle/standby.ora




EOF


####检查安装是否正常####
filename='/home/oracle/primary.ora'

if [ -f $filename ]
then
  echo "开始进行下一步配置......"
else
  echo "ERROR:安装异常,即将退出,请稍后重试"
  exit 1
fi


#################################传送主库的对应文件到从数据库#############################################

#####传送pfile####
read -p "确认从数据库是否安装完成,安装完成请输入y:" standby_result
if [ $standby_result = 'y' ]
then
  echo "请输入$theip_standby root用户的密码......"
  scp /home/oracle/standby.ora root@$theip_standby:/home/oracle/
  echo "pfile传输完成......"
else
  echo "ERROR:从数据库未正确安装,退出安装......"
  exit 1
fi


####传送密码文件####
echo "请输入$theip_standby root用户的密码......"
scp /home/oracle/app/oracle/product/11.2.0/db_1/dbs/orapw$SIDNAME  root@$theip_standby:/home/oracle/app/oracle/product/11.2.0/db_1/dbs/
echo "密码文件传输完成......"



#################################使用 rman 从主库(primary)传输主库数据到备库(standby)#############################################
read -p "确认从数据库spfile是否重建和startup nomount完成,完成请输入y:" standby_result_1
if [ $standby_result_1 = 'y' ]
then
  continue
else
  echo "ERROR:从数据库未准备就绪,退出安装......"
  exit 1
fi




su - oracle<<EOF
sqlplus / as sysdba <<sqlcom
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
archive log list;
quit;
sqlcom

rman target sys/$passwordAll@primary auxiliary sys/$passwordAll@standby<<EOFrman
duplicate target database for standby nofilenamecheck from active database;

EOFrman


####同步完将主库打开####
#sqlplus / as sysdba <<sqlcom
#alter database open;
#sqlcom



EOF

echo "rman同步完成..."

read -p "确认已将备库置于 active dataguard 模式,完成请输入y:" standby_result_2
if [ $standby_result_2 = 'y' ]
then
  continue
else
  echo "ERROR:备库配置失败,退出安装......"
  exit 1
fi


echo "开始设置主库DG_BROKER_START 参数......"
su - oracle<<EOF
sqlplus / as sysdba <<sqlcom
show parameter dg_broker_start;
alter system set dg_broker_start=TRUE;
show parameter dg_broker_start;
quit;
sqlcom
EOF

echo "主库DG_BROKER_START参数设置完成..."

read -p "确认备库DG_BROKER_START 参数配置完成,完成请输入y:" standby_result_3
if [ $standby_result_3 = 'y' ]
then
  continue
else
  echo "ERROR:备库DG_BROKER_START 参数配置失败,退出安装......"
  exit 1
fi

echo "开始创建并启用dmmgrl配置文件......"

cat>>/home/oracle/dgmgrl.sh<<EOFDG

su - oracle<<EOF
dgmgrl<<dgcom1
connect sys/$passwordAll@primary;
quit;
dgcom1
EOF
EOFDG




cat>>/home/oracle/dgmgrl_1.sh<<EOFDG
su - oracle<<EOF
dgmgrl<<dgcom2
connect sys/$passwordAll@primary;
create configuration dg as primary database is primary connect identifier is primary;
enable configuration;
add database standby as connect identifier is standby;
enable configuration;
show configuration;
show database verbose primary;
show database verbose standby;
show configuration;
dgcom2
EOF
EOFDG


sh /home/oracle/dgmgrl.sh
sleep 10 
sh /home/oracle/dgmgrl_1.sh
rm -f /home/oracle/dgmgrl.sh
rm -f /home/oracle/dgmgrl_1.sh
echo "全部完成了噢......"


附件2
oracleInstall_standby.sh

#!/bin/bash
echo "初始化安装脚本"
<<COMMENT
  注:
   author:whj
   CREATED: 2021.07.13
   oracle版本:11.2.0.4.0
   CentOS Linux release 7.6.1810 (Core)  (已在centos7.6上完成测试,centos6尚未测试)
   使用方法:见操作手册
   注意:
   1、此脚本适用于无法联网的环境离线安装oracle,如服务器可联网,删掉脚本里的   #####创建yum源这一大步骤就可以####    ,这里就不做判别了,也无需上传完整版镜像包
   2、运行脚本后主机名将会修改,且在下一次登入终端时生效
COMMENT
#sed -i 's/\r//' oracleInstall.sh
theip_1=`ip addr|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"|head -1|awk -F '/' '{print $1}'`

######################定义变量######################
#setHostName=dbServer             #定义linux主机名
#SIDNAME=itsmdb                   #定义实例名
#passwordAll=itm_i09d             #设置数据库密码
#dbPort=1555                      #设置数据库连接端口号
#theip=192.168.2.130               #输入当前服务器IP

read -p "请输入预设主机名(默认hostname将设为dbServer):"  setHostName_0
setHostName=${setHostName_0:-dbServer}
read -p "请输入预设数据库实例ID名(默认将设为itsmdb):" SIDNAME_0
SIDNAME=${SIDNAME_0:-itsmdb}
read -p "请输入预设数据库密码(默认将设为itm_i09d):" passwordAll_0
passwordAll=${passwordAll_0:-itm_i09d}
#read -p "请输入预设数据库端口号(默认将设为1521):" dbPort_0
#dbPort=${dbPort_0:-1521}
read -p "请输入本机IP(默认为$theip_1):" theip_0
theip=${theip_0:-$theip_1}
read -p "请输入主数据库的IP(primary):" theip_primary
read -p "请输入主数据库实例ID名(默认将设为itsmdb):" SIDNAME_1
SIDNAME_PRIMARY=${SIDNAME_1:-itsmdb}




file1_1=p13390677_112040_Linux-x86-64_1of7.zip
file1_2=p13390677_112040_Linux-x86-64_2of7.zip


##以下变量默认,无需修改
osVersion=$(cat /etc/redhat-release | tr -cd "[0-9]")
osNum7=${osVersion:0-4:4}
osNum6=${osVersion:0:2}
osNum=${osVersion:0:1}
isoNum=0
realIsoNum=`cat /etc/redhat-release | tr -cd "[0-9]."|awk -F '.' '{print $1"."$2}'`
dir=$(pwd)
#theip=`ip addr|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"|head -1|awk -F '/' '{print $1}'`



#####################定义函数#######################
function exVar
{
     TMP=/tmp
	 TMPDIR=$TMP   
	 ORACLE_BASE=/home/oracle/app/oracle
	 ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
	 ORACLE_SID=$SIDNAME
	 ORACLE_UNQNAME=$SIDNAME
	 ORACLE_TERM=xterm
	 PATH=$ORACLE_HOME/bin:$PATH
	 LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
}
function filetobak
{
  cp -f /etc/sysctl.conf.bak`date +%Y%m%d`  /etc/sysctl.conf
  cp -f /etc/security/limits.conf.bak`date +%Y%m%d`  /etc/security/limits.conf
  cp -f /etc/selinux/config.bak.`date +%Y%m%d`      /etc/selinux/config
  cp -f /etc/pam.d/login.bak.`date +%Y%m%d`  /etc/pam.d/login
  userdel oracle
  groupdel dba   
  groupdel oinstall
  groupdel asmdba
  groupdel asmadmin
  rm -rf /home/oracle/
  rm -f /etc/sysctl.conf.bak`date +%Y%m%d`  /etc/security/limits.conf.bak`date +%Y%m%d` /etc/selinux/config.bak.`date +%Y%m%d`  /etc/pam.d/login.bak.`date +%Y%m%d`
}
function stopInstall
{
  ID=`ps -ef | grep db_install.rsp | grep -v "grep" | awk '{print $2}'`   
  echo "---------------"  
  for id in $ID  
  do  
  kill -9 $id  
  done
  rm -rf /home/oracle/app/oracle/
  rm -f /etc/oraInst.loc
  rm -f /usr/local/bin/dbhome
  rm -f /usr/local/bin/oraenv
  rm -f /usr/local/bin/coraenv
  rm -f /etc/oratab
}
#####################确认是root用户安装###########
if [ $(id -u) != "0" ];then
   echo "Error: You must be root to run this script!"
   exit 1
fi
  
echo "========================================================================="
echo " install Oracle 11.2.0.4.0 on CentOS  $realIsoNum"
echo "========================================================================="
#####################修改主机名###########
if [ "$osNum" == "6" ]
then 
cat>> /etc/sysconfig/network<<EOF
NETWORKING=yes
HOSTNAME=$setHostName
EOF

cat>> /etc/hosts<<EOF
$theip  $setHostName
EOF

 hostname $setHostName
# exec bash
fi
  
if [ "$osNum" == "7" ]
then 
hostnamectl set-hostname $setHostName

cat>> /etc/hosts<<EOF
$theip    $setHostName  
EOF

 hostname 
 #exec bash
fi
######################创建yum源######################
cd /mnt
if [ -d cdrom ];then
    echo "cdrom目录已创建"
    else
    mkdir -p /mnt/cdrom
fi
cd -
ls CentOS-*.iso >ls.txt 2>&1
if (( $?==0 ))
then
  isoVersion=$(cat ls.txt | tr -cd "[0-9]")
else
  echo "Error:当前目录下未找到镜像,请检查镜像格式"
  exit 1
fi

if (( $osNum==7 ))
then
  isoNum=${isoVersion:0-4:4}
else
  isoNum=${isoVersion:0:2}
fi
if [[ "$isoNum" == "$osNum7" || "$isoNum" == "$osNum6" ]]
  then
    echo "已检测到镜像"
else
    echo "Error:镜像与系统不匹配,请检上传的镜像版本"
    exit 1
fi

mount $(cat ls.txt) -o loop /mnt/cdrom
if [[ $?==32 || $?==0 ]]
then
  echo "镜像已挂载"
  continue
else
  echo "Error:挂载出错,请检查镜像完整性"
  exit 1
fi

rm -f ls.txt 
cd  /etc/yum.repos.d

# 判断备份目录是否创建
if [ -d repobak`date +%Y%m%d` ];then
    echo "yum备份目录已创建"
    else
    mkdir -p repobak`date +%Y%m%d`
fi
mv *.repo repobak`date +%Y%m%d`/ >/dev/null  2>&1
cat >>local.repo<<EOF
[local_server]
name=This is a local repo
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=1
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-$osNum

EOF
echo "正在创建yum源"
yum  clean all;yum makecache

######################安装环境依赖###########################
yum install -y binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel expat gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers libaio libaio-devel libgcc libstdc++ libstdc++-devel make unixODBC unixODBC-devel zip unzip lm_sensors-libs sysstat libtool-ltdl
rpm -q binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel expat gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers libaio libaio-devel libgcc libstdc++ libstdc++-devel make unixODBC unixODBC-devel zip unzip lm_sensors-libs sysstat libtool-ltdl
if (( $?==0 ))
then
  echo "相关依赖包已安装完毕"
else
  echo "Error:当前镜像缺少相关依赖,请检查镜像是否为全量版(Everything iso)"
  exit 1
fi

######################修改linux参数######################
cd /etc
cp sysctl.conf sysctl.conf.bak`date +%Y%m%d`
cat>>sysctl.conf<<EOF
kernel.shmall = 2097152
kernel.shmmax = 536870912
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
cd /sbin/;sysctl -p

cd /etc/security/
cp limits.conf limits.conf.bak`date +%Y%m%d`
cat>>limits.conf<<EOF
oracle soft nproc 10240
oracle hard nproc 10240
oracle soft nofile 65536
oracle hard nofile 65536
EOF

cd /etc/pam.d/
cp login login.bak.`date +%Y%m%d`
cat>>login<<EOF
session    required     pam_limits.so
EOF


###关闭防火墙##
cd /etc/selinux
cp config config.bak.`date +%Y%m%d`
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

if (( $osNum==6 ))
then
  service iptables stop
  chkconfig iptables off
else
  systemctl stop firewalld.service && systemctl disable firewalld.service
fi



######################创建用户和用户组######################

for GROUP_NAME in dba oinstall asmdba asmadmin
do
if [ -z $(cat /etc/group|awk -F: '{print $1}'| grep -w "$GROUP_NAME") ]
then
  groupadd  $GROUP_NAME
    if(($? == 0 ))
         then
         echo "group $GROUP_NAME add sucessfully!"
    fi
else
  echo "$GROUP_NAME is exsits"
fi
done
useradd -g oinstall -G dba,asmdba,asmadmin oracle
if(($? == 0 ))
then
  echo " oracle 用户创建成功!"
fi


######################设置oracle用户环境变量######################
su - oracle<<"EOF"
if [ -d app ];then
    echo "app目录已创建"
    else
    mkdir -p app
fi
chmod 777 -R app
EOF

cat>>/home/oracle/.bash_profile<<profile
export TMP=/tmp
export TMPDIR=\$TMP   
export ORACLE_BASE=\$HOME/app/oracle
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db_1
export ORACLE_SID=$SIDNAME
export ORACLE_UNQNAME=$SIDNAME
export ORACLE_TERM=xterm
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:\$LD_LIBRARY_PATH
profile
 
source /home/oracle/.bash_profile



######################解压安装包######################
cd $dir
for oraFile in $file1_1 $file1_2
do
if [ -f $oraFile ]
then
  chown -R oracle:oinstall $oraFile
  sysctl -w kernel.watchdog_thresh=30
  echo "正在复制安装包......"
  cp $oraFile /home/oracle
else
  filetobak
  echo "ERROR:未在当前目录下找到安装包"
  exit 1
fi
done

cd /home/oracle
unzip $file1_1
if(( $? != 0 ))
then
  echo " 解压失败,请检查文件完整性"
  filetobak
  exit 1
fi
unzip $file1_2
if(( $? != 0 ))
then
  echo " 解压失败,请检查文件完整性"
  filetobak
  exit 1
else
  echo "解压安装文件成功"
fi
rm -f $file1_1 $file1_2
chown -R oracle:oinstall /home/oracle




######################安装数据库######################
####修改安装响应文件####
echo "正在修改安装文件......"
sed -i '29s#oracle.install.option=#oracle.install.option=INSTALL_DB_SWONLY#'  /home/oracle/database/response/db_install.rsp
sed -i '42s#UNIX_GROUP_NAME=#UNIX_GROUP_NAME=oinstall#'  /home/oracle/database/response/db_install.rsp
sed -i '49s#INVENTORY_LOCATION=#INVENTORY_LOCATION=/home/oracle/app/oracle/oraInventory#'  /home/oracle/database/response/db_install.rsp
sed -i '86s#SELECTED_LANGUAGES=en#SELECTED_LANGUAGES=en,zh_CN#'  /home/oracle/database/response/db_install.rsp
sed -i '91s#ORACLE_HOME=#ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/db_1#'  /home/oracle/database/response/db_install.rsp
sed -i '96s#ORACLE_BASE=#ORACLE_BASE=/home/oracle/app/oracle#'  /home/oracle/database/response/db_install.rsp
sed -i '107s#oracle.install.db.InstallEdition=#oracle.install.db.InstallEdition=EE#'  /home/oracle/database/response/db_install.rsp
sed -i '117s#oracle.install.db.EEOptionsSelection=false#oracle.install.db.EEOptionsSelection=true#'  /home/oracle/database/response/db_install.rsp
sed -i '154s#oracle.install.db.DBA_GROUP=#oracle.install.db.DBA_GROUP=dba#'  /home/oracle/database/response/db_install.rsp
sed -i '160s#oracle.install.db.OPER_GROUP=#oracle.install.db.OPER_GROUP=oinstall#'  /home/oracle/database/response/db_install.rsp
sed -i '176s#oracle.install.db.isRACOneInstall=#oracle.install.db.isRACOneInstall=false#'  /home/oracle/database/response/db_install.rsp
sed -i '189s#oracle.install.db.config.starterdb.type=#oracle.install.db.config.starterdb.type=GENERAL_PURPOSE#'  /home/oracle/database/response/db_install.rsp
sed -i '194s#oracle.install.db.config.starterdb.globalDBName=#oracle.install.db.config.starterdb.globalDBName='"$SIDNAME"'#'  /home/oracle/database/response/db_install.rsp
sed -i '199s#oracle.install.db.config.starterdb.SID=#oracle.install.db.config.starterdb.SID='"$SIDNAME"'#'  /home/oracle/database/response/db_install.rsp
sed -i '229s#oracle.install.db.config.starterdb.memoryLimit=#oracle.install.db.config.starterdb.memoryLimit=1024#'  /home/oracle/database/response/db_install.rsp
sed -i '262s#oracle.install.db.config.starterdb.password.ALL=#oracle.install.db.config.starterdb.password.ALL='"$passwordAll"'#'  /home/oracle/database/response/db_install.rsp
sed -i '400s#DECLINE_SECURITY_UPDATES=#DECLINE_SECURITY_UPDATES=true#'  /home/oracle/database/response/db_install.rsp
echo "修改安装文文件完毕......"

####开始安装oracle####
exVar
su - oracle<<EOF
cd  /home/oracle/database
if [ -f nohup.out ]
then
    rm nohup.out
fi
nohup ./runInstaller -silent -noconfig -ignorePrereq -responseFile /home/oracle/database/response/db_install.rsp  &
EOF
sleep 10
echo "正在安装中,请不要退出"
cd /home/oracle/database
while true 
do
grep "FATAL" /home/oracle/database/nohup.out
grp0=$?
grep "Failed" /home/oracle/database/nohup.out
grp3=$?
if [[ "$grp0" == "0" || "$grp3" == "0" ]]
then
  cp  /home/oracle/database/nohup.out  $dir/oraInstall.log
  echo "安装失败,请查看$dir下的oraInstall.log日志"
  stopInstall
  filetobak
  exit 1 
fi
grep "/home/oracle/app/oracle/oraInventory/orainstRoot.sh" nohup.out
grp1=$?
grep "/home/oracle/app/oracle/product/11.2.0/db_1/root.sh" nohup.out
grp2=$?
if [[ "$grp1" == "0" && "$grp2" == "0" ]]
then 
  echo "检查到相关配置脚本,请稍等" 
  sleep 10 
  break
else
sleep 10
fi
done

echo "让我休息15秒吧......"
sleep 15
grep "Successfully Setup Software."   nohup.out
grp4=$?
if [ "$grp4" == '0' ]
  then
	echo "install success,进行下一步配置"
else 
   echo "还未检测到成功信息,去看日志叭"
   echo "------退出本次安装------" 
   stopInstall
   filetobak
   exit 1   
fi

####执行脚本####
sh /home/oracle/app/oracle/oraInventory/orainstRoot.sh
sh /home/oracle/app/oracle/product/11.2.0/db_1/root.sh

######################创建itsm数据库实例######################
####修改建库响应文件####
echo "正在修改建库文件......"
 sed -i '78s#GDBNAME = "orcl11g.us.oracle.com"#GDBNAME ="'"$SIDNAME"'"#'        /home/oracle/database/response/dbca.rsp
 sed -i '170s#SID = "orcl11g"#SID ="'"$SIDNAME"'"#'        /home/oracle/database/response/dbca.rsp
 sed -i '418s#\#CHARACTERSET = "US7ASCII"#CHARACTERSET = "ZHS16GBK"#'        /home/oracle/database/response/dbca.rsp
 sed -i '428s#\#NATIONALCHARACTERSET= "UTF8"#NATIONALCHARACTERSET= "AL16UTF16"#'        /home/oracle/database/response/dbca.rsp
 sed -i '523s#\#MEMORYPERCENTAGE = "40"#MEMORYPERCENTAGE = "50"#'        /home/oracle/database/response/dbca.rsp
 sed -i '533s#\#DATABASETYPE = "MULTIPURPOSE"#DATABASETYPE = "MULTIPURPOSE"#'        /home/oracle/database/response/dbca.rsp
 sed -i '543s#\#AUTOMATICMEMORYMANAGEMENT = "TRUE"#AUTOMATICMEMORYMANAGEMENT = "TRUE"#'        /home/oracle/database/response/dbca.rsp
 sed -i '553s#\#TOTALMEMORY = "800"#TOTALMEMORY = "1024"#'        /home/oracle/database/response/dbca.rsp
 sed -i '475s#\#LISTENERS = "listener1 listener2"#LISTENERS = "LISTENER"#'        /home/oracle/database/response/dbca.rsp
 sed -i '211s#\#SYSPASSWORD = "password"#SYSPASSWORD = "'"$passwordAll"'"#'        /home/oracle/database/response/dbca.rsp
 sed -i '221s#\#SYSTEMPASSWORD = "password"#SYSTEMPASSWORD = "'"$passwordAll"'"#'        /home/oracle/database/response/dbca.rsp
echo "修改建库响应文件完毕......"


####创建数据库、配置oracle监听####
su - oracle<<EOF
cd $ORACLE_HOME/bin
echo "正在创建数据库中,请不要退出......"
#dbca -silent -responsefile  /home/oracle/database/response/dbca.rsp
netca -silent -responsefile /home/oracle/database/response/netca.rsp

EOF


######################配置开机自启动######################
####修改oracle启停脚本####
echo "正在修改oracle启停脚本"
   sed -i '80s#ORACLE_HOME_LISTNER=\$1#ORACLE_HOME_LISTNER=\$ORACLE_HOME#' $ORACLE_HOME/bin/dbstart
   sed -i '50s#ORACLE_HOME_LISTNER=\$1#ORACLE_HOME_LISTNER=\$ORACLE_HOME#' $ORACLE_HOME/bin/dbshut
   sed -i '23s#itsmdb:/home/oracle/app/oracle/product/11.2.0/db_1:N#itsmdb:/home/oracle/app/oracle/product/11.2.0/db_1:Y#'    /etc/oratab
echo "修改oracle启停脚本成功"

####创建自动执行文件####
echo "正在创建自动执行文件......"
cat >>/etc/rc.d/init.d/oracle<<EOF
#!/bin/bash
# whoami # root 
# chkconfig: 345 51 49  
# description: starts the oracle dabasedeamons 
# 
ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/db_1
ORACLE_OWNER=oracle 
ORACLE_DESC="Oracle 11g" 
case "\$1" in 
'start') 
echo -n \"Starting \${ORACLE_DESC}:\" 
runuser - \$ORACLE_OWNER -c '\$ORACLE_HOME/bin/lsnrctl start' 
runuser - \$ORACLE_OWNER -c '\$ORACLE_HOME/bin/dbstart' 
runuser - \$ORACLE_OWNER -c '\$ORACLE_HOME/bin/emctl start dbconsole' 
touch \${ORACLE_LOCK} 
echo 
;; 
'stop') 
echo -n "shutting down \${ORACLE_DESC}: " 
runuser - \$ORACLE_OWNER -c '\$ORACLE_HOME/bin/lsnrctl stop' 
runuser - \$ORACLE_OWNER -c '\$ORACLE_HOME/bin/dbshut' 
rm -f \${ORACLE_LOCK} 
echo  
;; 
'restart') 
echo -n "restarting \${ORACLE_DESC}:" 
\$0 stop 
\$0 start 
echo 
;; 
*)  
echo "usage: \$0 { start | stop | restart }" 
exit 1 
esac 
exit 0

EOF
echo "创建自动执行文件成功......"
cd /etc/rc.d/init.d
chmod 755 oracle
chkconfig --add oracle
chk1=$?
chkconfig --level 345 oracle on
chk2=$?
if [[ "$chk1" == "0" && "$chk2" == "0" ]]
then
  echo  "配置开机自启动成功"
else
  echo "配置开机自启动失败,请检查......"
  exit 1
fi
service oracle restart
if [ "$?" == "0" ]
then 
  echo "oracle服务重启成功"
else
  echo "oracle服务重启失败,请检查......"
  exit1
fi



######################修改数据库连接端口号######################
#su - oracle<<EOF
#  lsnrctl stop
#  sed -i 's/1521/$dbPort/g'  $ORACLE_HOME/network/admin/listener.ora
#  
#  sqlplus / as sysdba <<sqlcom
#  show parameter local_listener;
#  alter system set local_listener="(address = (protocol = tcp)(host = $theip)(port = $dbPort))";
#  show parameter local_listener;
#  quit
#  sqlcom
#EOF
echo "至此,安装完成"


######################尝试验证登入oracle######################
echo "--------------------查看oracle监听--------------------"
su - oracle -c "lsnrctl start"
su - oracle -c "lsnrctl status"
echo "--------------------尝试登入数据库--------------------"
su - oracle -c "sqlplus / as sysdba" 





######################在主库上修改 dataguard 配置相关参数######################
echo "正在修改listener.ora"
cat >>/home/oracle/app/oracle/product/11.2.0/db_1/network/admin/listener.ora<<EOF

LISTENER_`echo $SIDNAME|tr [a-z] [A-Z]` =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $setHostName)(PORT = 1521))


  
SID_LIST_LISTENER =
 (SID_LIST =
 (SID_DESC =
 (GLOBAL_DBNAME = $SIDNAME)
 (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/db_1)
 (SID_NAME = $SIDNAME)
 )
 (SID_DESC =
 (GLOBAL_DBNAME = standby_DGMGRL)
 (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/db_1)
 (SID_NAME = $SIDNAME)
 ) )




PRIMARY =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $theip_primary)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVER = primary_DGMGRL)
 (SERVICE_NAME = $SIDNAME_PRIMARY)
 )
 )

STANDBY =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $theip)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVER = standby_DGMGRL)
 (SERVICE_NAME = $SIDNAME)
 )
 )


EOF



echo "正在修改tnsnames.ora"
cat >>/home/oracle/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora<<EOF
LISTENER_`echo $SIDNAME|tr [a-z] [A-Z]` =
 (ADDRESS = (PROTOCOL = TCP)(HOST = $setHostName)(PORT = 1521))

PRIMARY =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = $theip_primary)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = $SIDNAME_PRIMARY)
    )
  )

 
STANDBY =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = $theip)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = $SIDNAME)
    )
  )


`echo $SIDNAME|tr [a-z] [A-Z]` =
  (DESCRIPTION =
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = $SIDNAME)
    )
  )

SID_LIST_LISTENER =
 (SID_LIST =
 (SID_DESC =
 (GLOBAL_DBNAME = $SIDNAME)
 (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/db_1)
 (SID_NAME = $SIDNAME)
 )
 (SID_DESC =
 (GLOBAL_DBNAME = standby_DGMGRL)
 (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/db_1)
 (SID_NAME = $SIDNAME)
 ) )


EOF




echo "-------------正在修改dataguard配置相关参数--------------------------"
su - oracle<<EOF
sqlplus / as sysdba <<sqlcom
host mkdir -p /home/oracle/standbylog;
host mkdir -p /home/oracle/app/oracle/fast_recovery_area;
host mkdir -p /home/oracle/app/oracle/admin/itsmdb/adump;
host mkdir -p /home/oracle/app/oracle/oradata/itsmdb/;
host mkdir -p /home/oracle/app/oracle/fast_recovery_area/itsmdb/;


quit
sqlcom
EOF




####################将主库传送过来的相应文件赋权#############################
echo "从数据库安装完成!!!"
read -p "确认pfile和密码文件已从主数据库传送过来,传送完成请输入y:" transfer_result
if [ $transfer_result = 'y' ]
then
  chown -R oracle:oinstall /home/oracle/
else
  echo "ERROR:文件传输未完成,退出安装......"
  exit 1
fi



###################在备库使用 pfile 创建 spfile#############################
filename='/home/oracle/standby.ora'

if [ -f $filename ]
then
  echo "开始进行下一步配置......"
else
  echo "ERROR:未找到standby.ora,即将退出,请稍后重试"
  exit 1
fi


echo "开始创建spfile......"
su - oracle<<EOF
sqlplus / as sysdba <<sqlcom
create spfile from pfile='/home/oracle/standby.ora';
startup nomount;

quit
sqlcom

#####重启监听####
echo “开始重启监听”
lsnrctl stop
lsnrctl start


EOF

echo "从数据库spfile重建完成,startup nomount完成..."





#################将备库置于 active dataguard 模式下##########################
read -p "确认rman同步是否完成,完成请输入y:" primary_result_1
if [ $primary_result_1 = 'y' ]
then
  continue
else
  echo "ERROR:rman同步异常,退出安装......"
  exit 1
fi




echo "开始将备库置于 active dataguard 模式下......"
su - oracle<<EOF

sqlplus /nolog<<'sqlcom'
conn /as sysdba;
select open_mode,database_role,db_unique_name from v\$database;
alter database open;
alter database recover managed standby database using current logfile disconnect from session;
select open_mode,database_role,db_unique_name from v\$database;
select status from v\$standby_log;
select member from v\$logfile;
select db_unique_name,protection_mode,protection_level from v\$database;
alter database set standby database to maximize availability;
select db_unique_name,protection_mode,protection_level from v\$database;
quit
sqlcom

EOF

echo "已将备库置于 active dataguard 模式!!!"

read -p "确认主库DG_BROKER_START配置已完成,完成请输入y:" primary_result_2
if [ $primary_result_2 = 'y' ]
then
  continue
else
  echo "ERROR:主库DG_BROKER_START配置失败,退出安装......"
  exit 1
fi

echo "开始设置备库DG_BROKER_START 参数......"
su - oracle<<EOF
sqlplus / as sysdba <<sqlcom
show parameter dg_broker_start;
alter system set dg_broker_start=TRUE;
show parameter dg_broker_start;
quit;
sqlcom
EOF

echo "备库DG_BROKER_START参数设置完成..."

echo "全部完成了噢......"





附件3
uninstall.sh

  userdel oracle -f
  rm -rf /home/oracle
  rm -rf /home/oracle/app/oracle/
  rm -f /etc/oraInst.loc
  rm -f /usr/local/bin/dbhome
  rm -f /usr/local/bin/oraenv
  rm -f /usr/local/bin/coraenv
  rm -f /etc/oratab

附件4
oracle11g下载地址
链接:https://pan.baidu.com/s/1Z5e8FRggzLeFpKI4TN81wg
提取码:379y

附件5
centos7.6镜像下载地址
https://mirrors.aliyun.com/centos-vault/7.6.1810/isos/x86_64/
在这里插入图片描述

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值