Oracle 19c of step by step install

介绍

脚本基于rockyOS 8.9操作系统上编写,基于自己对Oracle数据库安装流程的理解整理的自动安装脚本。

  • 脚本使用response自动响应模板文件进行安装,实例使用dbca的自动响应模板进行创建。
  • oracle安装为单机模式,未进行RAC配置
  • dbca是单实例模式创建。

自动安装脚本


SetEnvironment() {
    # 设置安装目录,指定Oracle home、inventory、数据存放路径和备份路径
	INSTALL_DIR=/opt
	ORACLE_BASE=$INSTALL_DIR/oracle
	INVENTORY_DIR=$ORACLE_BASE/oraInventory
	ORACLE_HOME=$ORACLE_BASE/app/19c
	ORADATA=$INSTALL_DIR/oradata
	ORABAK=$INSTALL_DIR/oradata_bak
	ORACLE_SID=PLASMA

    # 设置运行内存,默认设置512M,安装过程中需要
	# memory is Mbyte
	MEMORY=512 
    
    # 为操作系统DBA账户设置随机密码,默认长度为16位
	# oracle dba user password length
	PASSWORD_LENGTH=16

    # Oracle的Sys、System账户密码
	DBA_PASSWORD="PASSWORD"
	ORACLE_SYS_PASSWORD="PASSWORD"
	ORACLE_SYSTEM_PASSWORD="PASSWORD"

    # 生成oracle账户,并设置随机16位字符串的密码
	# generate dba user
	ORACLE_USER=oracle
	# generate random password
	ORACLE_PASSWORD="$(openssl rand -base64 $((PASSWORD_LENGTH * 3 / 4)))"
	
    # 生成随机服务器主机名
	ORACLE_HOSTNAME="oraSrv-$(head -c 32 /dev/urandom  | tr -dc 'A-Za-z0-9' | head -c 6)"
	
	hostnamectl set-hostname $ORACLE_HOSTNAME
	
    # 写入/etc/hosts
	for ip in $(hostname -I); 
	do 
		printf  "$ip\t$ORCL_HOSTNAME\n" >> /etc/hosts
	done
}

CreateUser() {
    # 创建操作系统账户,并使用随机16位密码
	if id $ORACLE_USER >& /dev/null; then
		groupadd oinstall
		groupadd dba
		useradd $ORACLE_USER -G oinstall -g dba -m
        # 列印账户密码
        echo "Create Oracle User: $ORACLE_USER:$ORACLE_PASSWORD"

		echo "$ORACLE_USER:$ORACLE_PASSWORD" | chpasswd
	fi;
}

CreateDirectory() {
	# create directory
	mkdir -p $ORACLE_HOME
	mkdir -p $INVENTORY_DIR
	mkdir -p $ORADATA
	mkdir -p $ORABAK

	# grant directory permissions
	chown oracle:oinstall -R $ORACLE_BASE
	chown oracle:dba -R $ORADATA
	chown oracle:dba -R $ORABAK

	cd $ORACLE_HOME
}

InstallDepends() {
	# install oracle depends
	dnf groupinstall "Development Tools" -y

	dnf install epel-release -y

	dnf install libnsl.x86_64 glibc.x86_64 glibc-gconv-extra.x86_64 rlwrap ksh -y
}

CreateResponse() {
	# generate oracle response.
	sed -i.bak ./install/response/db_install.rsp \
	-e '/^oracle\.install\.option=/s/$/INSTALL_DB_SWONLY/' \
	-e '/^UNIX_GROUP_NAME=/s/$/oinstall/' \
	-e '/^INVENTORY_LOCATION=/s/$/'"${INVENTORY_DIR}"'/' \
	-e '/^ORACLE_HOME=/s/$/'"${ORACLE_HOME}"'/' \
	-e '/^ORACLE_BASE=/s/$/'"${ORACLE_BASE}"'/' \
	-e '/^oracle\.install\.db\.InstallEdition=/s/$/EE/' \
	-e '/^oracle\.install\.db\.OSDBA_GROUP=/s/$/dba/' \
	-e '/^oracle\.install\.db\.OSOPER_GROUP=/s/$/dba/' \
	-e '/^oracle\.install\.db\.OSBACKUPDBA_GROUP=/s/$/dba/' \
	-e '/^oracle\.install\.db\.OSDGDBA_GROUP=/s/$/dba/' \
	-e '/^oracle\.install\.db\.OSKMDBA_GROUP=/s/$/dba/' \
	-e '/^oracle\.install\.db\.OSRACDBA_GROUP=/s/$/dba/' \
	-e '/^oracle\.install\.db\.ConfigureAsContainerDB=/s/$/false/' \
	-e '/^oracle\.install\.db\.config\.starterdb\.characterSet=/s/$/AL32UTF8/' \
	-e '/^oracle\.install\.db\.config\.starterdb\.memoryLimit=/s/$/'"${MEMORY}"'/' \
	-e '/^oracle\.install\.db\.config\.starterdb\.password\.ALL=/s/$/'"${DBA_PASSWORD}"'/' \
	-e '/^oracle\.install\.db\.config\.asm\.diskGroup=/s/^/#/' \
	-e '/^oracle\.install\.db\.config\.asm\.ASMSNMPPassword=/s/^/#/'

	# generate oracle instance response.
	sed -i.bak ./assistants/dbca/dbca.rsp \
	-e '/^gdbName=/s/$/PLASMA/' \
	-e '/^sid=/s/$/PLASMA/' \
	-e '/^createAsContainerDatabase=/s/$/false/' \
	-e '/^templateName=/s/$/'"${ORACLE_HOME}"'\/assistants\/dbca\/templates\/New_Database.dbt/' \
	-e '/^sysPassword=/s/$/'"${ORACLE_SYS_PASSWORD}"'/' \
	-e '/^systemPassword=/s/$/'${ORACLE_SYSTEM_PASSWORD}'/'
	-e '/^datafileDestination=/s/$/'"${ORADATA}"'/'

	# generate profile.
	cat > /etc/profile.d/oracle.sh <<EOF
export ORACLE_SID=PLASMA
export ORACLE_BASE=$ORACLE_BASE
export ORACLE_HOME=$ORACLE_HOME
export PATH=\$PATH:\$ORACLE_HOME/bin
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:\$LD_LIBRARY_PATH
export LANG=en_US.UTF-8
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"
export NLS_DATE_FORMAT="YYYY:MM:DDHH24:MI:SS"
export ORACLE_TERM=xterm

alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
alias lsnrctl='rlwrap lsnrctl'
EOF

	# generate systemd service
	cat > /etc/systemd/system/oracle.service << EOF
[Unit]
Description=Oracle Database 19c Startup/Shutdown Service
After=syslog.target network.target

[Service]
LimitMEMLOCK=infinity
TimeoutStopSec=5min
LimitNOFILE=65535
LimitMEMLOCK=16G
Type=forking
User=oracle
SyslogIdentifier=oracle-service
RemainAfterExit=yes

Environment="ORACLE_HOME=$ORACLE_HOME"

ExecStart=$ORACLE_HOME/bin/dbstart \$ORACLE_HOME
ExecStop=$ORACLE_HOME/bin/dbshut \$ORACLE_HOME

[Install]
WantedBy=multi-user.target
EOF
	
    # Create listener.ora
	cat > $ORACLE_HOME/network/admin/listener.ora <<EOF
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS =
             (PROTOCOL = TCP)
             (HOST = $HOSTNAME)
             (PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
      (SID_DESC =
         (SERVICE_NAME = $ORAINSTALL_SID)
         (SID_NAME = $ORAINSTALL_SID)
         (ORACLE_HOME = $ORACLE_HOME)
       )
   )
EOF
}

InstallDatabase() {
	# execute oracle silent install
	su oracle -c 'CV_ASSUME_DISTID=RHEL8 ./runInstaller -silent -responseFile ./install/response/db_install.rsp'

	bash -c $INVENTORY_DIR/orainstRoot.sh
	bash -c $ORACLE_HOME/root.sh
}

InitInstance() {
	# Create database instance
	su oracle -c 'dbca -silent -createDatabase -responseFile ./assistants/dbca/dbca.rsp'
}

RemoveInstance() {
    su oracle -c 'dbca -silent -deleteDatabase $ORACLE_SID'
}

initInstall(){
	SetEnvironment
	CreateUser
	
	if [ -d $ORACLE_HOME ]; then
		CreateDirectory
	fi;
	
	InstallDepends
	CreateResponse
	InstallDatabase
	InitInstance
}

case $@ in
	install)
	    # 完整安装oracle数据库
		initInstall
		;;
	reinstall)
	    # 重新安装(删除文件后重新安装,操作会删除数据库文件)

		;;
	uninstall)
	# 卸载(删除所有与oracle相关的安装和配置)
		;;
	add_instalce)
	# 安装实例
		;;
	remove_instance)
	# 卸载实例
		;;
esac