Oracle Corp. has released some time ago an installation kit of Oracle 19c (version 19.19) that supports ARM-based devices. This package can be successfully used to install the database on a Raspberry Pi 5.
Currently, Oracle Linux (both version 8 and 9) is not installable on the Raspberry Pi 5. However, future releases of Oracle Linux are expected to address this limitation.
I tried on RPI4 couple of years ago and failed to find a solution then after some long investigations I gave up once I found that it is a problem of CPU — not yet prepared for Oracle Db code.
The idea of running a functional database on the Raspberry Pi has always stayed with me. Therefore, after reading on several blogs that the Raspberry Pi 5 features an improved processor, I decided it was worth attempting the setup once again. I bought an RPI5 - 16GB version, although even the smaller version (8GB) should be fine.
Since Oracle Linux 8 and 9 cannot be reliably installed on ARM — failing with an error on first reboot — I opted for AlmaLinux 8.10, which is fully compatible with the Raspberry Pi 5’s CPU architecture.
NOTE: This tutorial is intended for test environments only, as the complete stack is not officially certified. It should be treated as experimental, though it provides a solid foundation. In the future, once Oracle releases a fully compatible version of Oracle Linux (OL) for the Raspberry Pi 5, you may consider transitioning to a production setup. However, be aware that Oracle does not certify its database for use on Raspberry Pi hardware.
You can check if yours RPI5 hardware is capable to run an Oracle database executing lscpu command. A complete output on my RPI5 SoC is listed below.
#############
### RPI5 ###
#############
[root@rpi5 ~]# lscpu
Architecture: aarch64
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per cluster: 4
Socket(s): -
Cluster(s): 1
NUMA node(s): 8
Vendor ID: ARM
Model: 1
Model name: Cortex-A76
Stepping: r4p1
CPU max MHz: 2400.0000
CPU min MHz: 1500.0000
BogoMIPS: 108.00
L1d cache: 64K
L1i cache: 64K
L2 cache: 512K
L3 cache: 2048K
NUMA node0 CPU(s): 0-3
NUMA node1 CPU(s):
NUMA node2 CPU(s):
NUMA node3 CPU(s):
NUMA node4 CPU(s):
NUMA node5 CPU(s):
NUMA node6 CPU(s):
NUMA node7 CPU(s):
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
Same command executed on an RPI4:
#############
### RPI4 ###
#############
root@rpi:~# lscpu
Architecture: aarch64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Vendor ID: ARM
Model name: Cortex-A72
Model: 3
Thread(s) per core: 1
Core(s) per cluster: 4
Socket(s): -
Cluster(s): 1
Stepping: r0p3
CPU(s) scaling MHz: 40%
CPU max MHz: 1500.0000
CPU min MHz: 600.0000
BogoMIPS: 108.00
Flags: fp asimd evtstrm crc32 cpuid
Caches (sum of all):
L1d: 128 KiB (4 instances)
L1i: 192 KiB (4 instances)
L2: 1 MiB (1 instance)
NUMA:
NUMA node(s): 2
NUMA node0 CPU(s): 0-3
NUMA node1 CPU(s): 0-3
Vulnerabilities:
Gather data sampling: Not affected
Itlb multihit: Not affected
L1tf: Not affected
Mds: Not affected
Meltdown: Not affected
Mmio stale data: Not affected
Reg file data sampling: Not affected
Retbleed: Not affected
Spec rstack overflow: Not affected
Spec store bypass: Vulnerable
Spectre v1: Mitigation; __user pointer sanitization
Spectre v2: Vulnerable
Srbds: Not affected
Tsx async abort: Not affected
NOTE: Due to architectural limitations, the ARM CPU used in earlier Raspberry Pi models (such as the Raspberry Pi 4) does not support database creation, even though the Oracle 19.19 version can still be installed as an ORACLE_HOME. Such a setup is suitable if you need an Oracle client on a Raspberry Pi 4, but database creation and listener startup will result in errors.
1. Prolegomena
As already mentioned, there is no available version of Oracle Linux 8 or 9 for Raspberry Pi 5. As a consequence, I used a closely related distribution — AlmaLinux, which is derived from Red Hat.
Oracle Corp. mentions within installation manuals the prerequisites required for an 19c database. Complete details are to be found here: https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/operating-system-checklist-for-oracle-database-installation-on-linux.html
However, since we cant use yet an Oracle Linux, AlmaLinux is a viable (though not “certified”) alternative.
Bear in mind that Oracle Database requires space for two kinds of “storage”:
- ORACLE_HOME — approx. 6 GB of free space at minimum
- Database files — depends on user data to populate the database, minimum is about 4 GB.
For OS we also need space to install it along with swapfile. As Oracle DB requires (imposes in fact) a minimum swapfile of 16GB it is obvious that OS ISO cannot be burned on a 16 GB SD card. Even 32 GB is small (at limit), hence I recommend you get an 64 GB SD card at least.
For my tests, I used for Oracle files (ORACLE HOME files and DB file) an external SSD connected on USB.
Complete hardware list as per my testing case is:
- Raspberry Pi 5
- An 256 GB SD card
- An 128 GB SSD device mounted and made available once OS was installed, to store Oracle related files
- A Raspberry Pi 5 aluminum heatsink case with dual fans (https://www.waveshare.com/pi5-case-c.htm)
My hardware looks as below:
2. Download AlmaLinux 8.10 ISO for ARM
Navigate to version 8.10 (latest available for now) version of AlmaLinux certified with RPI5: https://repo.almalinux.org/rpi/images/
Chose latest ISO available. I used GNOME version, aka https://repo.almalinux.org/rpi/images/AlmaLinux-8-RaspberryPi-GNOME-latest.aarch64.raw.xz
Download it locally on your desktop/laptop.
3. Burn AlmaLinux OS on a SD card
For burning the ISO on SR card I used Raspberry Pi Imager (for macOS, isntall the version for your OS (https://downloads.raspberrypi.org/imager/imager_latest.dmg)
For Raspberry Pi Device chose RPI5, chose also storage (SD card). For operating system, select ALmaLinux ISO file downloaded previously.
The main advantage of the Raspberry Pi Imager is that it allows you to customize the operating system installation right from the start — including settings such as username, password, hostname, SSH keys, and more. If you’ve previously noted the MAC address of your Raspberry Pi 5, you can assign a static IP address to it through your router’s interface. In this case, you won’t even need a monitor for the initial setup of AlmaLinux on the Raspberry Pi 5.
Alternatively, you can use BalenaEtcher — slightly less polished in appearance, but still fully functional (https://etcher.balena.io/#download-etcher).
4. Insert the SD card into the RPI5 and wake up the beast
It will take a while since RPI5 power on until you can connect with ssh. I usually open a ssh terminal and pinged until I got response from RPI5 (I also know IP address which wil be allocated by router).
Once RPI5 starts to reply, connect with ssh client (tabby in my case) to RPI5 using either password or the SSH key entered while OS was burned from ISO.
6. Initial configuration
NOTE: during this tutorial, hash (#) sign means the command is executed as root, while dollar sign ($) means a regular indicated user (oracle in most cases).
6.1 Enable RPI fans (if exists)
Since I have a heatsink case with dual fans, I want to activate them since AlmaLinux does not do this automatically.
Connect as your OS defined user then sudo to root. Edit (create if does not exist) file /boot/config.txt adding below content:
dtparam=fan_temp0=35000
dtparam=fan_temp0_hyst=5000
dtparam=fan_temp0_speed=175
6.2 Reboot RPI5
Once rebooted, check if fans are spinning !
- 6.3 Set hostname
# hostnamectl set-hostname rpi5
6.4 Adjust (if the case) hosts file
My RPI5 /etc/hosts contains the following (automatically configured):
# The following lines are desirable for IPv4 capable hosts
127.0.0.1 192.168.5.5 rpi5
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
# The following lines are desirable for IPv6 capable hosts
::1 192.168.5.5 rpi5
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
Pay attention to message in /etc/hosts:
# Your system has configured 'manage_etc_hosts' as True.
# As a result, if you wish for changes to this file to
# persist then you will need to either
# a.) make changes to the master file in
# /etc/cloud/templates/hosts.redhat.tmpl
# b.) change or remove the value of 'manage_etc_hosts' in
# /etc/cloud/cloud.cfg or cloud-config from user-data
#
In case you intend to change the file, do it as recommended!
6.5 Disable SELinux
Edit /etc/selinux/config file, changing:
SELINUX=enforcing
to
SELINUX=disabled
6.6 Secure RPI5
Edit ssh daemon config file adding/changind values of below parameters as indicated:
# vi /etc/ssh/sshd_config
PermitRootLogin no
PermitEmptyPasswords no
PasswordAuthentication no
UsePAM no
UseDNS no
Optional, you can disable ssh connections as oracle user (avoid hacking attempts is RPI5 will be visible in internet), adding to same file the lines:
DenyUsers oracle
AllowUsers <your_os_user>
Restart SSH daemon:
# systemctl restart sshd
6.7 Update AlmaLinux OS on RPI5
As root:
# dnf update -y
# dnf upgrade -y
# dnf group install -y "Server with GUI"
6.8 Configure TigerVNC for RPI5
This step is optional. If you don’t need/want a GUI then you can pass over. However, if you want to perform Oracle software installation in graphical mode you either need a keyboard, a mouse and a monitor or TigerVNC (or other VNC solution).
As root:
# dnf install -y tigervnc-server tigervnc-server-module
As your OS user:
$ vncpasswd
Add entries for your OS user and oracle user (will create oracle OS user a bit later):
# vi /etc/tigervnc/vncserver.users
:1=oracle
:2=<your_os_user>
As root, validate if vncserver for your_os_user works:
# systemctl enable -now vncserver@:2
# systemctl start vncserver@:2
# systemctl status vncserver@:2
NOTE: VNC for oracle user cannot be started yet as the user does not exist. You can enable and start it once oracle user was created.
6.9 Disable firewall or add rules for TigerVNC in firewall
I chose to disable firewall completely.
# systemctl stop firewalld
# systemctl disable firewalld
6.10 Adjust sudoers
Add oracle user in sudoers:
# visudo
oracle ALL=(ALL) NOPASSWD: ALL
7. Configure oracle user (owner of database)
First, let's configure oracle repository.
# dnf install dnf-utils -y
# wget https://yum.oracle.com/RPM-GPG-KEY-oracle-ol8 -O /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
# gpg - import - import-options show-only /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
Create a repository file with below content:
# cd /etc/yum.repos.d/
# vi ol8.repo
[ol8_baseos_latest]
name=Oracle Linux 8 BaseOS Latest ($basearch)
baseurl=https://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1
Install new repository:
# dnf install oraclelinux-release-el8 -y
# dnf install oracle-database-preinstall-19c -y
NOTE: last command above creates the oracle OS user and installs the required packages plus adjusts the kernel paraemters required by oracle database.
Change oracle OS user’s password and VNC password:
# passwd oracle
# su - oracle
$ vncpasswd
Validate oracle OS user, you should get an output similar to the below one:
# id oracle
[root@rpi5 yum.repos.d]# id oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54330(racdba)
Enable and start TigerVNC for oracle user:
# systemctl enable - now vncserver@:1
# systemctl start vncserver@:1
# systemctl status vncserver@:1
8. Create mandatory file /etc/oracle-release
Create oracle-release file with below content. This step is crucial, without this file installation will fail.
# vi /etc/oracle-release
Oracle Linux Server release 8.10
Create directory on which will mount later additional storage:
# sudo mkdir /oracle
# chown -R oracle.oinstall /oracle
9. Install EPEL and additional packages
This step is optional. However, very helpful to have option to rerun command from history very handy, using rlwrap. Install also nmon (performance monitoring) and other packages useful for troubleshooting.
# dnf install epel-release -y
# dnf install screen telnet rlwrap nmon mc -y
10. Create a larger swap file
Oracle Database installation requires a swap space of at least 16 GB. In the example below, I’ll create a swap file, but a dedicated swap partition is also acceptable — as long as it is 16 GB or larger.
I named this file swap (the name swapfile is already taken by default in AlmaLinux). If you want use same name like default swapfile then you execute below procedure twice and perform a reboot in between (create swap file, restart, create swapfile then restart again).
Be patient, this step will take a while …
# fallocate -l 16G /swap
# dd if=/dev/zero of=/swap bs=1G count=16
# chmod 600 /swap
# mkswap /swap
# swapon /swap
Edit /etc/fstab file adding (or changing) as below:
/swap none swap defaults 0 0
As root, reboot RPI5 then after restart, delete the old swapfile:
# reboot
...
# ls -al /swapfile
# rm -f swapfile
Validate new swapping settings:
# swapon -v
[root@rpi5 ~]# swapon -v
NAME TYPE SIZE USED PRIO
/swap file 16G 0B -2
11. Add additional space to RPI5 to store Oracle database and binaries
In my test I used an external SSD (128 GB size) which will be mounted on RPI5.
# fdisk -l
Output (truncated):
Disk /dev/sda: 119.2 GiB, 128035676160 bytes, 250069680 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 250069679 250067632 119.2G 83 Linux
Device sda1 was already formatted as ext4. Adjust /etc/fstab and mount the new filesystem. First, get the UUID of the storage:
# ls -al /dev/disk/by-uuid/
[root@rpi5 ~]# ls -al /dev/disk/by-uuid/
total 0
drwxr-xr-x. 2 root root 100 May 9 21:26 .
drwxr-xr-x. 7 root root 140 May 9 21:26 ..
lrwxrwxrwx. 1 root root 10 May 9 21:57 7b9561e8–772d-4d2d-8024-dbb75378c3ad -> ../../sda1
lrwxrwxrwx. 1 root root 15 May 9 21:57 8985f0c5–9d60–440d-97a3–7c8638ae2c69 -> ../../mmcblk0p2
lrwxrwxrwx. 1 root root 15 May 9 21:57 89B6–0C82 -> ../../mmcblk0p1
Edit once more /etc/fstab file. At the end will look like below:
UUID=8985f0c5-9d60-440d-97a3-7c8638ae2c69 / ext4 defaults,noatime 0 0
UUID=89B6-0C82 /boot vfat defaults,noatime 0 0
/swap none swap defaults 0 0
UUID=7b9561e8-772d-4d2d-8024-dbb75378c3ad /oracle ext4 defaults,noatime 0 0
Put RPI in text mode (once installed VNC there’s no need to consume resource with Gnome interface).
# systemctl set-default multi-user.target
Perform one more update of OS packages.
# dnf update -y
# dnf upgrade -y
12. Reboot RPI5. Once restarted, validate the mount point for Oracle DB
[root@rpi5 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 29G 22G 7.5G 75% /
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.9G 0 7.9G 0% /dev/shm
tmpfs 7.9G 9.2M 7.9G 1% /run
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
/dev/mmcblk0p1 477M 261M 217M 55% /boot
/dev/sda1 117G 8.0K 111G 1% /oracle
tmpfs 1.6G 16K 1.6G 1% /run/user/42
tmpfs 1.6G 0 1.6G 0% /run/user/0
Validate swap as well:
# swapon -v
[root@rpi5 ~]# swapon -v
NAME TYPE SIZE USED PRIO
/swap file 16G 0B -2
13. Create ORACLE_HOME directory
As root create directories:
# mkdir -p /oracle/u01/app/oracle/product/19.0.0/dbhome_1
# chown -R oracle.oinstall /oracle
14. Prepare ORACLE_HOME installation
Download Oracle 19c KIT for RPI.
Navigate to: https://www.oracle.com/database/technologies/oracle19c-linux-arm64-downloads.html and download file LINUX.ARM64_1919000_db_home.zip
Copy installation kit to RPI5.
Once copied, validate file consistency using sha256sum. Correct value (if download and transfer was ok) as per Oracle site, is:
sha256sum - 44e9fa1b5ca84781bb496fe200b9bd648438819f053b4227b74e5622d959f125
Unzip kit (once has been copied to /oracle) specifying destination directory (-d parameter):
# su - oracle
$ cd /oracle
$ unzip -d /oracle/u01/app/oracle/product/19.0.0/dbhome_1 LINUX.ARM64_1919000_db_home.zip
- Adjust oracle’s user .bash_profile file adding required variables
Add below lines into oracle’s user .bash_profile:
ORA_VERSION=19.0.0
ORACLE_BASE=/oracle/u01/app/oracle
ORACLE_HOME=${ORACLE_BASE}/product/${ORA_VERSION}/dbhome_1
ORACLE_SID=ora193c
TNS_ADMIN=${ORACLE_BASE}/product/${ORA_VERSION}/dbhome_1/network/admin
LD_LIBRARY_PATH=${ORACLE_HOME}/lib
echo "ORACLE_SID=$ORACLE_SID : RDBMS_19.3.0.0 LINUX"
db_name=$(/bin/cat \
${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora|
/bin/grep db_name|/bin/grep -v ^#\
|/bin/sed 's/=/ /g'|/bin/awk -F\' '{ printf("%s",tolower( $2)); }')
alias udump='cd /oracle/u01/app/oracle/diag/rdbms/$db_name/$ORACLE_SID/trace'
alias bdump='cd /oracle/u01/app/oracle/diag/rdbms/$db_name/$ORACLE_SID/trace'
alias cdump='cd /oracle/u01/app/oracle/diag/rdbms/$db_name/$ORACLE_SID/cdump'
alias alert='tail -100f /oracle/u01/app/oracle/diag/rdbms/$db_name/$ORACLE_SID/trace/alert_$ORACLE_SID.log'
export ORACLE_HOME LD_LIBRARY_PATH ORACLE_SID TMPDIR PATH TNS_ADMIN
export PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:.
alias sql='rlwrap ${ORACLE_HOME}/bin/sqlplus "/ as sysdba"'
alias rmn='rlwrap ${ORACLE_HOME}/bin/rman " target /"'
alias OH='cd $ORACLE_HOME'
alias tnsalias="cat $ORACLE_HOME/network/admin/tnsnames.ora |grep WORLD|awk '{ print \$1 }'"
cd $ORACLE_HOME
16. Install Software (ORACLE_HOME)
In this tutorial I chose installation using GUI, hence connect to RPI5 using Tiger VNC client and open a terminal session.
As oracle user (either reconnect or source environment in order to read the cahnged .bash_profile) and run installer script from ORACLE_HOME:
$ su - oracle
$ cd $ORACLE_HOME
$ ./runInstaller
Chose a software only installation at step 1, single instance installation at step 2, Enterrpise Edition at step 3, etc.
Be aware to execute as root, at final stage of installation the required scripts:
17. Create the database
As oracle user, run database configuration assistant to create the database. I named my database ora193c and set as data directory to /oracle/u02/oradata. Database will be of type CDB (container) with a pluggable database pdba193.
$ cd $ORACLE_HOME
$ dbca
See below captions of screens used during database creation:
18. Validate installation
Once installation is finished, check status of database and listener service.
Validate listener status:
# su - oracle
$ lsnrctl status
[oracle@rpi5 dbhome_1]$ lsnrctl status
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 10-MAY-2025 22:06:58
Copyright © 1991, 2023, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
- - - - - - - - - - - -
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 10-MAY-2025 21:40:20
Uptime 0 days 0 hr. 26 min. 38 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Log File /oracle/u01/app/oracle/diag/tnslsnr/rpi5/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.5.5)(PORT=1521)))
Services Summary…
Service "34cdbbcca80e1ba9e065000000000001" has 1 instance(s).
Instance "ora193c", status READY, has 1 handler(s) for this service…
Service "fda797ffd7307dfde053bc2a4664b2b0" has 1 instance(s).
Instance "ora193c", status READY, has 1 handler(s) for this service…
Service "ora193c" has 1 instance(s).
Instance "ora193c", status READY, has 1 handler(s) for this service…
Service "ora193cXDB" has 1 instance(s).
Instance "ora193c", status READY, has 1 handler(s) for this service…
Service "pdba193" has 1 instance(s).
Instance "ora193c", status READY, has 1 handler(s) for this service…
The command completed successfully
Validate database status using sqlplus (or sql alias created within .bash_profile):
# su - oracle
$ sqlplus / as sysdba
SQL> select open_mode, database_role from v$database;
[oracle@rpi5 dbhome_1]$ sql
SQL*Plus: Release 19.0.0.0.0 - Production on Sun May 11 09:55:24 2025
Version 19.19.0.0.0
Copyright © 1982, 2023, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.0.0
SQL> select open_mode, database_role from v$database;
OPEN_MODE DATABASE_ROLE
- - - - - - - - - - - - - - - - - -
READ WRITE PRIMARY
Validate /etc/oratab file. If you want the database to be started automatically (along with a properly configured script) on PRI start/reboot, change last parameter to value “Y”.
$ cat /etc/oratab
[oracle@rpi5 dbhome_1]$ cat /etc/oratab
#
# This file is used by ORACLE utilities. It is created by root.sh
# and updated by either Database Configuration Assistant while creating
# a database or ASM Configuration Assistant while creating ASM instance.
# A colon, ':', is used as the field terminator. A new line terminates
# the entry. Lines beginning with a pound sign, '#', are comments.
#
# Entries are of the form:
# $ORACLE_SID:$ORACLE_HOME:<N|Y>:
#
# The first and second fields are the system identifier and home
# directory of the database respectively. The third field indicates
# to the dbstart utility that the database should , "Y", or should not,
# "N", be brought up at system boot time.
#
# Multiple entries with the same $ORACLE_SID are not allowed.
#
#
ora193c:/oracle/u01/app/oracle/product/19.0.0/dbhome_1:N
Validate remote connection, in this case I’ll connect from my machine.
my-mac:~ myuser$ sqlcl/bin/sql /nolog
SQLcl: Release 23.1 Production on Sun May 11 10:03:47 2025
Copyright © 1982, 2025, Oracle. All rights reserved.
SQL> conn system/sys@rpi5:1521/ora193c
Connected.
SQL> exit
All validation are done, RPI5 and ora193c database are up and running, ready to be used.
Have fun !
Top comments (0)