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
/u01for the Oracle home - At least 10 GB of free disk space in
/u02for 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.zipfile 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
oracleuser (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.confincludingfs.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
madviseon 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.
- 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
- Create the oracle user
useradd -u 54321 -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba oracle
- 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
- 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
...
- 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
- 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.
- Set the oracle user password
passwd oracle
- Install unzip
The unzip utility is not included in the preinstall RPM and may not be present on minimal installations.
dnf install -y unzip
- Configure the hostname
hostnamectl set-hostname {HOSTNAME}.localdomain
{HOSTNAME} -- the short hostname for this server (e.g., ol9-26ai).
- 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
- Set SELinux to permissive
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
setenforce Permissive
Verify:
getenforce
Expected output:
Permissive
- 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
- 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
- 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
- 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.
- 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 AL32UTF8parameter 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
psoutput and shell history while the command runs. To suppress history recording, rununset HISTFILEbefore 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
- 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
- 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.
- Verify compatible parameter
sqlplus / as sysdba <<'EOF'
SHOW PARAMETER compatible;
EXIT;
EOF
Expected output:
NAME TYPE VALUE
----------- ------ ------
compatible string 23.6.0
- 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
- 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
- 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 |