Oracle 19c on ARM processors

Oracle has announced Oracle Database for Arm Architectures and it is now available. Let's test it.

A VM in the Cloud (Ampere processor)

On the Oracle Cloud you can create a free ARM instance:

I Choose the following image and shape:

which was configured as:

I've added my public key for SSH:

And just hit create.

When done, I ssh to it and I'm ready to install Oracle 19c

Install Oracle 19c for aarch64

Preinstall

sudo dnf update -y
sudo dnf -y install -y oracle-database-preinstall-19c git

Add oracle in sudoers and connect as oracle

sudo su 

grep "oracle" /etc/sudoers || echo "oracle  ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers

sudo su - oracle

Create the directories for software and database

sudo mkdir -p mkdir -p /u01/oradata /u01/fast_recovery_area /u01/app/oracle/product
sudo chown -R oracle:dba /u01/app/oracle /u01/fast_recovery_area /u01/oradata

Get the software (you must go to https://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee in your browser, download Oracle Database 19c for LINUX ARM (aarch64), accept the license agreement and you will get the URL with a temporary AuthParam)


wget -O LINUX.ARM64_1919000_db_home.zip https://download.oracle.com/otn/linux/oracle19c/1919000/LINUX.ARM64_1919000_db_home.zip?AuthParam=1688078278_8ad5e9f7685ef0f3c89ab680fd709b53   

mkdir -p /u01/app/oracle/product/DB1919

unzip -d /u01/app/oracle/product/DB1919 LINUX.ARM64_1919000_db_home.zip

Setup the install:


cat > DB1919.rsp <<END
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/DB1919
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=backupdba
oracle.install.db.OSDGDBA_GROUP=dgdba
oracle.install.db.OSKMDBA_GROUP=kmdba
oracle.install.db.OSRACDBA_GROUP=dba
oracle.install.db.rootconfig.executeRootScript=false
oracle.install.db.rootconfig.configMethod=SUDO
oracle.install.db.rootconfig.sudoPath=/bin/sudo
oracle.install.db.rootconfig.sudoUserName=oracle
END

/u01/app/oracle/product/DB1919/runInstaller -silent -responseFile $PWD/DB1919.rsp

sudo /u01/app/oraInventory/orainstRoot.sh

sudo /u01/app/oracle/product/DB1919/root.sh

ORACLE_HOME=/u01/app/oracle/product/DB1919

Create a database

Create a Wallet to store the passwords:


$ORACLE_HOME/bin/mkstore -wrl dbc_wallet -create <<MKSTORE
oracle19
oracle19
MKSTORE

$ORACLE_HOME/bin/mkstore -wrl dbc_wallet -createEntry oracle.dbsecurity.sysPassword <<MKSTORE
oracle
oracle
oracle19
MKSTORE

Create a Database named CDB1 with standby logs in case it is part of a Data Guard configuration:


cat > add_standby_log.sql <<'SQL'
exec for i in (select t,g+rownum g,s from (select thread# t,max(bytes) s,count(*)+1 c from v$log group by thread#),(select rownum n from xmltable('1 to 100')),(select max(group#) g from v$log) where n<=c) loop execute immediate 'alter database add standby logfile thread '||i.t||' group '||i.g||' size '||i.s; end loop;
exit
SQL

$ORACLE_HOME/bin/dbca -silent \
 -createDatabase -gdbName CDB1 -sid CDB1A \
 -createAsContainerDatabase true -numberOfPdbs 1 -pdbName PDB1 \
 -useWalletForDBCredentials true -dbCredentialsWalletLocation $PWD/dbc_wallet \
 -sysPassword oracle -systemPassword oracle \
 -pdbAdminPassword oracle \
 -datafileDestination /u01/oradata -useOMF true -storageType FS \
 -recoveryAreaDestination /u01/fast_recovery_area \
 -recoveryAreaSize 3072 -enableArchive true \
 -memoryMgmtType AUTO_SGA -totalMemory 2048 \
 -createListener LISTENER1A:1521 \
 -emConfiguration EMEXPRESS -emExpressPort 5501 \
 -templateName General_Purpose.dbc \
 -databaseType OLTP -sampleSchema true -redoLogFileSize 100 \
 -customScripts $PWD/add_standby_log.sql \
 -initParams \
db_unique_name=CDB1A,dg_broker_start=true,shared_pool_size=600M

grep oraenv ~/.bash_profile || echo '. oraenv <<<CDB1A' >> ~/.bash_profile

I've added oraenv to my bash profile to get the right environment (ORACLE_SID and ORACLE_HOME) and can connect with sqlplus

Image description

That's all.

Geek stuff

I also wanted to check which ARM instructions are used:

objdump -d $ORACLE_HOME/bin/oracle | awk '/\t(ldxr|ldaxr|stxr|stlxr)/{print $3"\t(load and store exclusives)"}/\t(cas|casp|swp|ldadd|stadd|ldclr|stclr|ldeor|steor|ldset|stset|ldsmax|stsmax|ldsmin|stsmin|ldumax|stumax|ldumin|stumin)/{print $3"\t(large-system extensions)"}' | sort -k2 | uniq -c

If you test the performance and compare between aarch64 and x86_64 please let me know the result. I'll probably test that on AWS Graviton 3 - follow on Twitter if you want to be notified on new blog posts.