Instruction

Installing Oracle AI Database 26ai on Oracle Linux 9 (Silent Mode)

Assumptions

This instruction assumes:

  • Oracle Linux 9.2 or later (x86_64) is installed with a minimal or server profile
  • The kernel is UEK7 (5.15.0-201.135.6 or later) or RHCK (5.14.0-284.30.1 or later)
  • Root access is available
  • The server has internet access to Oracle Linux YUM repositories
  • At least 8 GB of free disk space in /u01 for the Oracle home
  • At least 10 GB of free disk space in /u02 for database files
  • At least 1 GB of free space in /tmp
  • At least 4 GB of RAM (Oracle minimum is 1 GB, recommended 2 GB, but 4 GB is the practical minimum for a CDB with one PDB)
  • The LINUX.X64_2326100_db_home.zip file has been downloaded from oracle.com and transferred to the server
  • No prior Oracle Database installation exists on this host
  • Filesystem storage is used (not ASM -- ASM requires Grid Infrastructure, covered in a separate instruction)
  • The installation creates a Container Database (CDB) with one Pluggable Database (PDB)
  • This is a single-instance installation (not RAC)

Prerequisites

Automatic setup

The oracle-ai-database-preinstall-26ai RPM configures the OS for Oracle AI Database installation.

As root:

dnf install -y oracle-ai-database-preinstall-26ai

This package creates:

  • The oracle user (UID 54321) and groups: oinstall (54321), dba (54322), oper (54323), backupdba (54324), dgdba (54325), kmdba (54326), racdba (54327)
  • Kernel parameters in /etc/sysctl.d/99-oracle-ai-database-server-26ai-preinstall-sysctl.conf including fs.file-max=6815744, kernel.sem=250 32000 100 128, kernel.shmmax=4398046511104, kernel.shmall=1073741824, fs.aio-max-nr=1048576, net.ipv4.ip_local_port_range=9000 65535
  • Resource limits in /etc/security/limits.d/oracle-ai-database-preinstall-26ai.conf: nofile (1024/65536), nproc (16384/16384), stack (10240/32768), memlock (134217728/134217728)
  • Required OS packages: bc, binutils, elfutils-libelf, gcc, gcc-c++, glibc, glibc-devel, ksh, libaio, libaio-devel, libgcc, libstdc++, libstdc++-devel, libxcb, libX11, libXau, libXi, libXrender, libXtst, make, policycoreutils, policycoreutils-python-utils, smartmontools, sysstat
  • Transparent HugePages set to madvise on UEK7

Verify the RPM configuration:

cat /var/log/oracle-ai-database-preinstall-26ai/results/orakernel.log

Manual setup

For environments where the preinstall RPM is unavailable (RHEL 9, policy restrictions), perform these steps as root.

  1. Create OS groups
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
groupadd -g 54324 backupdba
groupadd -g 54325 dgdba
groupadd -g 54326 kmdba
groupadd -g 54327 racdba
  1. Create the oracle user
useradd -u 54321 -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba oracle
  1. Install required packages
dnf -y install bc binutils elfutils-libelf elfutils-libelf-devel \
  gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel \
  libgcc libgfortran libibverbs libnsl libnsl2 libstdc++ \
  libstdc++-devel libxcb libX11 libXau libXi libXrender libXtst \
  make policycoreutils policycoreutils-python-utils \
  smartmontools sysstat compat-openssl11 net-tools nfs-utils unixODBC
  1. Set kernel parameters
cat > /etc/sysctl.d/97-oracle-database-sysctl.conf <<'EOF'
fs.file-max = 6815744
fs.aio-max-nr = 1048576
kernel.shmmax = 4398046511104
kernel.shmall = 1073741824
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
net.ipv4.ip_local_port_range = 9000 65535
EOF
sysctl --system

Expected output:

* Applying /etc/sysctl.d/97-oracle-database-sysctl.conf ...
fs.file-max = 6815744
fs.aio-max-nr = 1048576
...
  1. Configure resource limits
cat > /etc/security/limits.d/97-oracle-database-limits.conf <<'EOF'
oracle soft nofile  1024
oracle hard nofile  65536
oracle soft nproc   16384
oracle hard nproc   16384
oracle soft stack   10240
oracle hard stack   32768
oracle hard memlock 134217728
oracle soft memlock 134217728
oracle soft data    unlimited
oracle hard data    unlimited
EOF
  1. Set Transparent HugePages to madvise
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled

To persist across reboots, add transparent_hugepage=madvise to the GRUB_CMDLINE_LINUX line in /etc/default/grub and run grub2-mkconfig -o /boot/grub2/grub.cfg.

Additional setup

These steps are required regardless of whether you used the automatic or manual setup above. Perform all steps as root unless noted otherwise.

  1. Set the oracle user password
passwd oracle
  1. Install unzip

The unzip utility is not included in the preinstall RPM and may not be present on minimal installations.

dnf install -y unzip
  1. Configure the hostname
hostnamectl set-hostname {HOSTNAME}.localdomain

{HOSTNAME} -- the short hostname for this server (e.g., ol9-26ai).

  1. Add the hostname to /etc/hosts
echo "{IP_ADDRESS}  {HOSTNAME}.localdomain  {HOSTNAME}" >> /etc/hosts

{IP_ADDRESS} -- the server's primary IP address (e.g., 192.168.1.100).

Verify:

hostname -f

Expected output:

ol9-26ai.localdomain
  1. Set SELinux to permissive
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
setenforce Permissive

Verify:

getenforce

Expected output:

Permissive
  1. Disable firewalld or open port 1521

To disable firewalld:

systemctl stop firewalld
systemctl disable firewalld

Alternatively, to keep firewalld enabled and open the listener port:

firewall-cmd --permanent --add-port=1521/tcp
firewall-cmd --reload
  1. Configure swap space

Oracle swap requirements are based on RAM size:

RAM Required Swap
1 GB -- 2 GB 1.5 times RAM
2 GB -- 16 GB Equal to RAM
More than 16 GB 16 GB

If HugePages are enabled, deduct HugePages memory from RAM before calculating swap.

Check current swap:

free -h

If swap is insufficient, add a swap file (example for 4 GB):

dd if=/dev/zero of=/swapfile bs=1M count=4096
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
  1. Create directory structure
mkdir -p /u01/app/oracle/product/26.0.0/dbhome_1
mkdir -p /u02/oradata
chown -R oracle:oinstall /u01 /u02
chmod -R 775 /u01 /u02
  1. Create the environment script

As the oracle user:

su - oracle
mkdir -p /home/oracle/scripts
cat > /home/oracle/scripts/setEnv.sh <<'EOF'
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/26.0.0/dbhome_1
export ORA_INVENTORY=/u01/app/oraInventory
export ORACLE_SID=cdb1
export PDB_NAME=pdb1
export DATA_DIR=/u02/oradata
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
EOF

Edit ORACLE_SID, PDB_NAME, and DATA_DIR if you want different names or paths.

  1. Source the environment script from .bash_profile

As the oracle user:

echo '. /home/oracle/scripts/setEnv.sh' >> /home/oracle/.bash_profile
source /home/oracle/.bash_profile

Verify:

echo $ORACLE_HOME

Expected output:

/u01/app/oracle/product/26.0.0/dbhome_1

Installation

Step 1: Extract the software

As the oracle user, extract the ZIP file directly into ORACLE_HOME. The archive extracts files into the current directory (no wrapper directory).

cd $ORACLE_HOME
unzip -oq /path/to/LINUX.X64_2326100_db_home.zip

Replace /path/to/LINUX.X64_2326100_db_home.zip with the actual path to the downloaded file.

Step 2: Run the silent installer

As the oracle user, run the software-only installation:

cd $ORACLE_HOME
./runInstaller -ignorePrereqFailure -waitforcompletion -silent \
  -responseFile ${ORACLE_HOME}/install/response/db_install.rsp \
  installOption=INSTALL_DB_SWONLY \
  UNIX_GROUP_NAME=oinstall \
  INVENTORY_LOCATION=${ORA_INVENTORY} \
  ORACLE_HOME=${ORACLE_HOME} \
  ORACLE_BASE=${ORACLE_BASE} \
  installEdition=EE \
  OSDBA=dba \
  OSOPER=oper \
  OSBACKUPDBA=dba \
  OSDGDBA=dba \
  OSKMDBA=dba \
  OSRACDBA=dba

# Note: This maps all specialized DBA groups to `dba` for simplicity.
# For production separation of duties, replace `dba` with the dedicated
# groups: OSBACKUPDBA=backupdba, OSDGDBA=dgdba, OSKMDBA=kmdba, OSRACDBA=racdba.

The installer runs prerequisite checks and then installs the software. This takes several minutes. On completion, the installer prompts you to run two root scripts.

Expected output:

Launching Oracle Database Setup Wizard...

[WARNING] [INS-13014] Target environment does not meet some optional requirements.
   CAUSE: Some of the optional prerequisites are not met.
   ACTION: Identify the list of failed prerequisite checks from the log.

The response file for this session can be found at:
 /u01/app/oracle/product/26.0.0/dbhome_1/install/response/db_2026-02-24_10-00-00AM.rsp

Successfully Setup Software with warning(s).
As a root user, execute the following script(s):
	1. /u01/app/oraInventory/orainstRoot.sh
	2. /u01/app/oracle/product/26.0.0/dbhome_1/root.sh

Step 3: Execute the root scripts

As root, run the two scripts in order:

/u01/app/oraInventory/orainstRoot.sh

Expected output:

Changing permissions of /u01/app/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.
Changing groupname of /u01/app/oraInventory to oinstall.
The execution of the script is complete.
/u01/app/oracle/product/26.0.0/dbhome_1/root.sh

Expected output:

Check /u01/app/oracle/product/26.0.0/dbhome_1/install/root_ol9-26ai_2026-02-24_10-15-00-123456.log for the output of root script

Step 4: Start the listener

As the oracle user:

lsnrctl start

Expected output:

LSNRCTL for Linux: Version 23.26.0.0.0 - Production on 24-FEB-2026 10:20:00

...

Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ol9-26ai.localdomain)(PORT=1521)))
The listener supports no services
The command completed successfully

The listener shows "no services" because no database has been created yet.

Step 5: Create the database

Warning: The -characterSet AL32UTF8 parameter sets the database character set. This choice is permanent and cannot be changed after database creation. AL32UTF8 supports all Unicode characters and is the recommended choice for new databases.

Warning: The passwords below will be visible in ps output and shell history while the command runs. To suppress history recording, run unset HISTFILE before executing the command.

As the oracle user:

dbca -silent -createDatabase \
  -templateName General_Purpose.dbc \
  -gdbname ${ORACLE_SID} \
  -sid ${ORACLE_SID} \
  -characterSet AL32UTF8 \
  -sysPassword {SYS_PASSWORD} \
  -systemPassword {SYSTEM_PASSWORD} \
  -createAsContainerDatabase true \
  -numberOfPDBs 1 \
  -pdbName ${PDB_NAME} \
  -pdbAdminPassword {PDB_ADMIN_PASSWORD} \
  -databaseType MULTIPURPOSE \
  -memoryMgmtType auto_sga \
  -totalMemory 2048 \
  -storageType FS \
  -datafileDestination "${DATA_DIR}" \
  -redoLogFileSize 50 \
  -emConfiguration NONE \
  -ignorePreReqs

{SYS_PASSWORD} -- password for the SYS account (minimum 8 characters, must include uppercase, lowercase, and digit).

{SYSTEM_PASSWORD} -- password for the SYSTEM account (same requirements).

{PDB_ADMIN_PASSWORD} -- password for the PDB admin account (same requirements).

The -totalMemory 2048 parameter allocates 2048 MB to the database instance. On systems with more RAM, increase this value. A reasonable guideline is 40-70% of total system RAM for a dedicated database server.

Database creation takes 10-30 minutes depending on hardware.

Expected output:

Prepare for db operation
10% complete
Registering database with Oracle Restart
...
50% complete
Creating and starting Oracle instance
...
85% complete
Completing Database Creation
100% complete

Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/cdb1/cdb1.log" for further details.

Step 6: Edit /etc/oratab

As root, edit /etc/oratab and change the restart flag from N to Y. If you changed ORACLE_SID from cdb1, replace cdb1 in this command with your chosen SID.

sed -i 's|^cdb1:/u01/app/oracle/product/26.0.0/dbhome_1:N|cdb1:/u01/app/oracle/product/26.0.0/dbhome_1:Y|' /etc/oratab

Verify:

grep -v "^#" /etc/oratab | grep -v "^$"

Expected output:

cdb1:/u01/app/oracle/product/26.0.0/dbhome_1:Y

Step 7: Save PDB state and set Oracle Managed Files destination

As the oracle user:

If you changed PDB_NAME from pdb1, replace pdb1 in the ALTER PLUGGABLE DATABASE command below.

sqlplus / as sysdba <<'EOF'
ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;
ALTER SYSTEM SET db_create_file_dest='/u02/oradata' SCOPE=BOTH;
EXIT;
EOF

The SAVE STATE command ensures the PDB opens automatically when the CDB starts. Without this, the PDB remains in MOUNTED state after a restart and must be opened manually.

Expected output:

Pluggable database altered.

System altered.

Post-installation

Step 1: Create startup and shutdown scripts

As the oracle user:

cat > /home/oracle/scripts/start_all.sh <<'EOF'
#!/bin/bash
. /home/oracle/scripts/setEnv.sh

export ORAENV_ASK=NO
. oraenv
export ORAENV_ASK=YES

dbstart $ORACLE_HOME
EOF
cat > /home/oracle/scripts/stop_all.sh <<'EOF'
#!/bin/bash
. /home/oracle/scripts/setEnv.sh

export ORAENV_ASK=NO
. oraenv
export ORAENV_ASK=YES

dbshut $ORACLE_HOME
EOF
chmod u+x /home/oracle/scripts/start_all.sh /home/oracle/scripts/stop_all.sh

These scripts use dbstart and dbshut, which read /etc/oratab to determine which instances to start and stop. The Y flag set in Step 6 enables this.

Step 2: Enable Read-Only Oracle Home (optional)

Read-Only Oracle Home (ROOH) stores configuration files under $ORACLE_BASE/homes/ instead of $ORACLE_HOME, making the Oracle home immutable for easier patching. ROOH is disabled by default.

If you want ROOH, you must enable it before creating any additional databases. For the database already created above, ROOH cannot be retroactively enabled.

cd $ORACLE_HOME/bin
./roohctl -enable

Expected output:

Enabling Read-Only Oracle Home...
Read-Only Oracle Home has been successfully enabled.

Validation

Quick check

As the oracle user:

sqlplus / as sysdba <<'EOF'
SELECT banner_full FROM v$version;
EXIT;
EOF

Expected output:

BANNER_FULL
--------------------------------------------------------------------------------
Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0

The version shows 23.26.x because Oracle AI Database 26ai uses internal major version 23. The "26ai" branding is reflected in the "Oracle AI Database 26ai" portion of the banner.

Full validation

  1. Verify PDB status
sqlplus / as sysdba <<'EOF'
SELECT name, open_mode, restricted FROM v$pdbs;
EXIT;
EOF

Expected output:

NAME       OPEN_MODE  RESTRICTED
---------- ---------- ----------
PDB$SEED   READ ONLY  NO
PDB1       READ WRITE NO
  1. Verify data file locations
sqlplus / as sysdba <<'EOF'
SELECT name FROM v$datafile;
EXIT;
EOF

Expected output:

NAME
----------------------------------------------------------------------
/u02/oradata/CDB1/system01.dbf
/u02/oradata/CDB1/sysaux01.dbf
/u02/oradata/CDB1/undotbs01.dbf
/u02/oradata/CDB1/users01.dbf
/u02/oradata/CDB1/pdb1/system01.dbf
/u02/oradata/CDB1/pdb1/sysaux01.dbf
/u02/oradata/CDB1/pdb1/undotbs01.dbf

All data files should be under /u02/oradata.

  1. Verify compatible parameter
sqlplus / as sysdba <<'EOF'
SHOW PARAMETER compatible;
EXIT;
EOF

Expected output:

NAME        TYPE   VALUE
----------- ------ ------
compatible  string 23.6.0
  1. Verify listener status
lsnrctl status

Expected output:

...
Services Summary...
Service "cdb1" has 1 instance(s).
  Instance "cdb1", status READY, has 1 handler(s) for this service...
Service "cdb1XDB" has 1 instance(s).
  Instance "cdb1", status READY, has 1 handler(s) for this service...
Service "pdb1" has 1 instance(s).
  Instance "cdb1", status READY, has 1 handler(s) for this service...
The command completed successfully
  1. Verify PDB connectivity through the listener
sqlplus /nolog

At the SQL*Plus prompt, run:

CONNECT sys@//localhost:1521/pdb1 AS SYSDBA

Enter the SYS password when prompted. Then run:

SELECT 'PDB connection successful' AS status FROM dual;
EXIT;

Expected output:

STATUS
-------------------------
PDB connection successful
  1. Verify oratab entry
grep -v "^#" /etc/oratab | grep -v "^$"

Expected output:

cdb1:/u01/app/oracle/product/26.0.0/dbhome_1:Y

Troubleshooting

Problem Cause Solution
[INS-13001] Environment does not meet minimum requirements Kernel parameters or package dependencies are missing Install the preinstall RPM: dnf install -y oracle-ai-database-preinstall-26ai and re-run
[INS-30131] Initial setup required for the execution of installer validations ORACLE_HOME directory is not owned by the oracle user Run chown -R oracle:oinstall /u01 as root
ORA-01034: ORACLE not available Database instance is not started Run sqlplus / as sysdba then STARTUP;
ORA-12162: TNS:net service name is incorrectly specified ORACLE_SID environment variable is not set Run source /home/oracle/scripts/setEnv.sh
TNS-12541: TNS:no listener Listener is not running Start with lsnrctl start
DBCA fails: Insufficient memory -totalMemory exceeds available RAM Reduce the -totalMemory value or add more RAM/swap
unzip: command not found The unzip package is not installed Install with dnf install -y unzip
[WARNING] [INS-32055] The installer has detected that the Oracle home is not empty Previous failed extraction or install left files in ORACLE_HOME Verify echo $ORACLE_HOME shows the correct path, then remove contents with rm -rf $ORACLE_HOME/* and re-extract the ZIP
Listener running but no services registered Database was created before listener was started, or dynamic registration has not occurred Restart the listener: lsnrctl stop && lsnrctl start, or run ALTER SYSTEM REGISTER; in sqlplus
PDB is in MOUNTED state after CDB restart PDB state was not saved Run ALTER PLUGGABLE DATABASE pdb1 SAVE STATE; in sqlplus connected to the CDB

References