Install Oracle 23ai

This post shows how to install Oracle 23ai on a RedHat Enterprise 8.10 virtual machine. Grid Infrastructure and Database will be installed.

Preparation

We will install the software on a Oracle VirtualBox Virtual Machine. So we need a VM as described in this post. Next we need the Oracle 23ai software from edelivery.oracle.com. Search for Oracle Database and download the software (Current Version: Oracle Database Grid Infrastructure 23.5 – for Engineered Systems) to a place accessible from the VM (e.g. /sw/oracle/gi/23ai_linux and /sw/oracle/db/23ai_linux). To be able to use ASM we need some additional disk devices for the VM. Run this in a command prompt on the VirtualBox host:

set "VHOST="
(set /p VHOST=Enter VM name ^(e.g. lin1^): 
rem add and attach 2 50g disks for diskgroup +DATA
call vboxmanage createmedium disk --filename c:\vms\%VHOST%\%VHOST%_2.vdi --sizebyte=53687091200 --variant Standard
call vboxmanage createmedium disk --filename c:\vms\%VHOST%\%VHOST%_3.vdi --sizebyte=53687091200 --variant Standard
call vboxmanage storageattach %VHOST% --storagectl "SATA" --port 1 --device 0 --type hdd --medium c:\vms\%VHOST%\%VHOST%_2.vdi
call vboxmanage storageattach %VHOST% --storagectl "SATA" --port 2 --device 0 --type hdd --medium c:\vms\%VHOST%\%VHOST%_3.vdi
rem add and attach 3 14g disks for diskgroup +FRA
call vboxmanage createmedium disk --filename c:\vms\%VHOST%\%VHOST%_4.vdi --sizebyte=15032385536 --variant Standard
call vboxmanage createmedium disk --filename c:\vms\%VHOST%\%VHOST%_5.vdi --sizebyte=15032385536 --variant Standard
call vboxmanage createmedium disk --filename c:\vms\%VHOST%\%VHOST%_6.vdi --sizebyte=15032385536 --variant Standard
call vboxmanage storageattach %VHOST% --storagectl "SATA" --port 3 --device 0 --type hdd --medium c:\vms\%VHOST%\%VHOST%_4.vdi
call vboxmanage storageattach %VHOST% --storagectl "SATA" --port 4 --device 0 --type hdd --medium c:\vms\%VHOST%\%VHOST%_5.vdi
call vboxmanage storageattach %VHOST% --storagectl "SATA" --port 5 --device 0 --type hdd --medium c:\vms\%VHOST%\%VHOST%_6.vdi)

Now we create the users oracle and grid on the linux VM, unzip the software and set some kernel parameters:

bash -c "# add groups and users
groupadd -g 2000 oinstall ; groupadd -g 2001 dba ; groupadd -g 2002 asmdba ; groupadd -g 2003 asmadmin
useradd -u 2000 -g 2000 -G disk,dba,asmdba,vboxsf oracle && echo 'oracle:changeme'|chpasswd
useradd -u 2001 -g 2000 -G disk,dba,asmdba,asmadmin,vboxsf grid && echo 'grid:changeme'|chpasswd
# create environment files
echo 'export ORACLE_HOME=/u01/app/23.0.0/grid' > ~grid/grid.env
echo 'export PATH=\$ORACLE_HOME/bin:\$ORACLE_HOME/jdk/bin:\$ORACLE_HOME/OPatch:\$PATH' >> ~grid/grid.env
echo 'export ORACLE_SID=+ASM' >> ~grid/grid.env
chown grid:oinstall ~grid/grid.env
echo 'source ~/grid.env' >> ~grid/.bash_profile
echo 'export ORACLE_HOME=/u01/app/oracle/product/23.0.0/dbhome_1' > ~oracle/ora23.env
echo 'export PATH=\$ORACLE_HOME/bin:\$ORACLE_HOME/jdk/bin:\$ORACLE_HOME/OPatch:\$PATH' >> ~oracle/ora23.env
echo 'export ORACLE_SID=orcl' >> ~oracle/ora23.env
chown oracle:oinstall ~oracle/ora23.env
echo 'source ~/ora23.env' >> ~oracle/.bash_profile
# create directories
mkdir -p /u01 && chmod 775 /u01 && chown grid:oinstall /u01
mkdir -p /u01/app/23.0.0/grid # GRID_HOME
mkdir -p /u01/app/grid # GRID_BASE
mkdir -p /u01/app/oracle/product/23.0.0/dbhome_1 # ORACLE_HOME
chown grid:oinstall /u01/app && chown -R grid:oinstall /u01/app/23.0.0 && chown grid:oinstall /u01/app/grid
chown -R oracle:oinstall /u01/app/oracle # ORACLE_BASE
chmod 775 /u01/app && chmod -R 775 /u01/app/23.0.0 && chmod 775 /u01/app/grid
chmod -R 775 /u01/app/oracle

# unpack sw
echo 'Unpacking Grid Infrastructure sw. Please wait...'
if [ \`ls /u01/app/23.0.0/grid|wc -l\` -eq 0 ] ; then
 su - grid -c 'cd /u01/app/23.0.0/grid ; cp /sw/oracle/gi/23ai_linux/V1043786-01_grid.zip . ; unzip -q ./V1043786-01_grid.zip ; rm -f ./V1043786-01_grid.zip'
fi 
echo 'Unpacking Database sw. Please wait...'
if [ \`ls /u01/app/oracle/product/23.0.0/dbhome_1|wc -l\` -eq 0 ] ; then
 su - oracle -c 'cd /u01/app/oracle/product/23.0.0/dbhome_1 ; cp /sw/oracle/db/23ai_linux/V1043785-01_db.zip . ; unzip -q ./V1043785-01_db.zip ; rm -f V1043785-01_db.zip'
fi
if ! rpm -q cvuqdisk ; then rpm -i /u01/app/23.0.0/grid/cv/rpm/cvuqdisk-1.0.10-1.rpm ; fi
# adjust parameters
echo 'fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 4294967295
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
kernel.panic = 1' > /etc/sysctl.d/97-oracle-database-sysctl.conf
/sbin/sysctl --system
# create swap space
if [ \`cat /etc/fstab|grep swapfile|wc -l\` == 0 ] ; then
 echo 'creating swap space...' 
 dd if=/dev/zero of=/swapfile bs=1024 count=8388608 # create a 8 GB swapfile
 mkswap /swapfile && chmod 0600 /swapfile && swapon /swapfile
 echo '/swapfile       swap       swap       defaults       0 0' >> /etc/fstab
 swapon
fi"

Grid Infrastructure Installation

The following will perform a silent installation of the GI. If you prefer the GUI installation take a look here:

cat > /u01/app/23.0.0/grid/dbs/init+ASM.ora << EOF
memory_target=1G
processes = 150
diagnostic_dest='/u01/app/grid'
remote_login_passwordfile='EXCLUSIVE'
_exadata_feature_on=true
EOF
chown grid:oinstall /u01/app/23.0.0/grid/dbs/init+ASM.ora
cat > ~grid/rsp_grid.rsp << EOF
oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v23.0.0
INVENTORY_LOCATION=/u01/app/oraInventory
installOption=HA_CONFIG
ORACLE_BASE=/u01/app/grid
clusterUsage=RAC
zeroDowntimeGIPatching=false
skipDriverUpdate=false
OSDBA=asmdba
OSASM=asmadmin
scanType=LOCAL_SCAN
configureAsExtendedCluster=false
configureGNS=false
configureDHCPAssignedVIPs=false
storageOption=FLEX_ASM_STORAGE
useIPMI=false
diskGroupName=DATA
redundancy=NORMAL
auSize=4
disksWithFailureGroupNames=/dev/sdb,,/dev/sdc,
diskList=/dev/sdb,/dev/sdc
diskString=/dev/sd*
configureAFD=false
ignoreDownNodes=false
configureBackupDG=false
backupDGName=RECO
backupDGRedundancy=NORMAL
backupDGAUSize=1
managementOption=NONE
omsPort=0
executeRootScript=true
configMethod=ROOT
sudoPath=/usr/local/bin/sudo
sudoUserName=grid
enableAutoFixup=false
oracle.install.asm.monitorPassword=changeme
oracle.install.asm.SYSASMPassword=changeme
EOF
chown grid:oinstall ~grid/rsp_grid.rsp
su - grid -c "echo changeme|/u01/app/23.0.0/grid/gridSetup.sh -silent -responseFile /home/grid/rsp_grid.rsp"

We can now check if the GI services are running:

su - grid -c "source ~/grid.env ; crsctl stat res -t"
[root@lin1 ~]# su - grid -c "source ~/grid.env ; crsctl stat res -t"
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       lin1                     STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       lin1                     STABLE
ora.asm
               ONLINE  ONLINE       lin1                     Started,STABLE
ora.ons
               OFFLINE OFFLINE      lin1                     STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
      1        ONLINE  ONLINE       lin1                     STABLE
ora.diskmon
      1        OFFLINE OFFLINE                               STABLE
ora.evmd
      1        ONLINE  ONLINE       lin1                     STABLE
--------------------------------------------------------------------------------
[root@lin1 ~]#

If there were errors and for example the asm Resource is missing you can uninstall the Grid Infrastructure software as described here and continue the installation from here.

Next we create a Fast Recovery Area (FRA) diskgroup:

su - grid -c "
sqlplus / as sysasm << EOF
create diskgroup fra normal redundancy 
disk '/dev/sdd'
disk '/dev/sde'
disk '/dev/sdf';
EOF"

Database Installation

The following will perform a silent installation of the DB. If you prefer the GUI installation take a look here:

sed -i "/<\/InitParams>/s/<\/InitParams>/   <initParam name=\"_exadata_feature_on\" value=\"true\"\/> \n      <\/InitParams>/" /u01/app/oracle/product/23.0.0/dbhome_1/assistants/dbca/templates/General_Purpose.dbc
cat > ~oracle/rsp_db.rsp << EOF
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v23.0.0
installOption=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
ORACLE_BASE=/u01/app/oracle
installEdition=EE
OSDBA=dba
OSBACKUPDBA=dba
OSDGDBA=dba
OSKMDBA=dba
OSRACDBA=dba
dbType=GENERAL_PURPOSE
enableAutoMemoryManagement=false
omsPort=0
enableRecovery=false
EOF
chown oracle:oinstall ~oracle/rsp_db.rsp
su - oracle -c "echo changeme|/u01/app/oracle/product/23.0.0/dbhome_1/runInstaller -silent -responseFile /home/oracle/rsp_db.rsp"
/u01/app/oracle/product/23.0.0/dbhome_1/root.sh

Now we create the orcl database:

su - oracle -c "dbca -silent -createDatabase                                  \
   -gdbName orcl.fritz.box -sid orcl -templateName  General_Purpose.dbc       \
   -memoryPercentage 40 -databaseType MULTIPURPOSE                            \
   -sysPassword changeme -systemPassword changeme -pdbAdminPassword changeme  \
   -storageType ASM -datafileDestination +DATA                                \
   -recoveryAreaDestination +FRA -recoveryAreaSize 14000                      \
   -createAsContainerDatabase true -pdbName pdb1"

The database is now ready to use and we can login with:

# type exit to logout
su - oracle -c "sqlplus / as sysdba"
Output:
[root@lin1 ~]# su - oracle -c "sqlplus / as sysdba"

SQL*Plus: Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems on Fri Jan 31 18:08:01 2025
Version 23.5.0.24.07

Copyright (c) 1982, 2024, Oracle.  All rights reserved.


Connected to:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.5.0.24.07

SQL>

Useful commands

If you would like to install Oracle Grid Infrastructure with a GUI (Oracle Universal Installer) you can do that with:

# as the grid user start a X terminal and run
/u01/app/23.0.0/grid/gridSetup.sh

If you would like to install Oracle Database with a GUI (Oracle Universal Installer) you can do that with:

# as the oracle user start a X terminal and run
/u01/app/oracle/product/23.0.0/dbhome_1/runInstaller

To delete the orcl database:

# as oracle:
dbca -silent -deleteDatabase -sourceDB orcl -sysDBAUserName sys -forceArchiveLogDeletion -sysDBAPassword changeme -sid orcl

To delete the orcl database:

# as oracle:
dbca -silent -deleteDatabase -sourceDB orcl -sysDBAUserName sys -forceArchiveLogDeletion -sysDBAPassword changeme -sid orcl

If you need to delete the 5 additional disk devices for ASM:

set "VHOST="
(set /p VHOST=Enter VM name ^(e.g. lin1^): 
call vboxmanage storageattach %VHOST% --storagectl "SATA" --port 1 --device 0 --type hdd --medium none
call vboxmanage storageattach %VHOST% --storagectl "SATA" --port 2 --device 0 --type hdd --medium none
call vboxmanage storageattach %VHOST% --storagectl "SATA" --port 3 --device 0 --type hdd --medium none
call vboxmanage storageattach %VHOST% --storagectl "SATA" --port 4 --device 0 --type hdd --medium none
call vboxmanage storageattach %VHOST% --storagectl "SATA" --port 5 --device 0 --type hdd --medium none
call vboxmanage closemedium disk c:\vms\%VHOST%\%VHOST%_2.vdi --delete
call vboxmanage closemedium disk c:\vms\%VHOST%\%VHOST%_3.vdi --delete
call vboxmanage closemedium disk c:\vms\%VHOST%\%VHOST%_4.vdi --delete
call vboxmanage closemedium disk c:\vms\%VHOST%\%VHOST%_5.vdi --delete
call vboxmanage closemedium disk c:\vms\%VHOST%\%VHOST%_6.vdi --delete)

To uninstall the Grid Infrastructure software in silent mode you can do the following. If you want to recreate the installation afterwards continue here. The script takes some time so be patient.

su - grid -c '/u01/app/23.0.0/grid/deinstall/deinstall -silent -checkonly -local -o /tmp && \
/u01/app/23.0.0/grid/deinstall/deinstall -silent -paramfile=/tmp/deinstall_OraGI23Home1.rsp'
# run the rootdeinstall.sh script as root
/tmp/`ls -atr /tmp|grep deinstall|tail -1`/rootdeinstall.sh
rm -rf /etc/oraInst.loc ; rm -rf /opt/ORCLfmap ; rm -rf /etc/oratab