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@primary
或 connect 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/