Oracle Database Instant Client 23ai on Oracle Linux 9
Overview
Oracle Database Instant Client 23ai (version 23.26.2.0.0) provides the tools and libraries you need to connect to and manage Oracle 23ai, 19c, 18c, 12.x and earlier database instances. It includes SQL*Plus, sqlldr, tnsping, expdp, impdp, the full Oracle Net client utility set, and OCI and JDBC drivers. It does not need a database server on the same VM. This guide covers deploying and configuring it on Oracle Linux 9 on Microsoft Azure from the SecureAnyCloud preconfigured virtual machine image on Azure Marketplace.
What you get:
- Oracle Database Instant Client 23ai 23.26.2.0.0 (Basic, SQL*Plus, Tools, SDK and ODBC) installed at /usr/lib/oracle/23/client64
- SQL*Plus, sqlldr, expdp, impdp, wrc, OCI shared libraries, JDBC OCI drivers, the ODBC driver and SDK headers
- A system-wide /etc/profile.d hook for PATH, LD_LIBRARY_PATH, ORACLE_HOME and TNS_ADMIN, so any future user picks up the client tools
- Preseeded tnsnames.ora and sqlnet.ora files, ready for your entries
- A libnsl shim and an OEL8 compatibility layer, so the 23ai binaries link cleanly on Oracle Linux 9
- The bundled Oracle JDK replaced with the system OpenJDK, so security patches arrive through dnf
- An OS package update script that keeps the system current
- Azure Linux Agent (waagent) for Azure integration
- cloud-init for automated provisioning
- Latest security patches applied at build time
- 24/7 SecureAnyCloud support with guaranteed 24 hour response SLA
- Platform: Microsoft Azure (Gen2 Hyper-V). Default user:
azureuser. Oracle Home:/usr/lib/oracle/23/client_1. TNS Admin:/usr/lib/oracle/23/client_1/network/admin.
Compatibility Note
Oracle originally certified Oracle Database Instant Client 23ai on Oracle Linux 5, 6 and 7. SecureAnyCloud packages 23ai on Oracle Linux 9 by installing the equivalent compatibility libraries (libnsl, libxcrypt-compat, libstdc++ 32-bit) and relinking the client binaries against the OL 8 system libraries.
The result is functionally equivalent to a certified install for the customer-facing tooling (SQL*Plus, Oracle Net, sqlldr, expdp, impdp). For Oracle support questions about this combination, refer to your Oracle account manager. SecureAnyCloud provides 24/7 support for the platform integration.
Prerequisites
Before you deploy the image, make sure you have:
- An active Microsoft Azure subscription
- Access to the Azure Portal or Azure CLI
- An SSH key pair for Linux VM access
- The hostname, port and service name (or SID) of the Oracle Database you want to connect to
- Network connectivity from the new VM to the target Oracle Database (typically TCP 1521 outbound)
Recommended VM size: Standard_B2s (2 vCPU, 4 GB RAM) or larger. The Oracle Client is a set of libraries and tools rather than a running service, so the minimum requirements are modest: 1 vCPU, 1 GB RAM and 20 GB of disk space.
Deploy the Virtual Machine
Option A: Azure Portal
- Go to Azure Marketplace and search for "Oracle Database Instant Client 23ai Oracle Linux 9 SecureAnyCloud".
- Select the image and click Create.
- Configure the basics:
- Subscription: Select your Azure subscription.
- Resource group: Create a new one or select an existing one.
- Virtual machine name: Enter a name for your VM.
- Region: Select your preferred Azure region.
- Size:
Standard_B2srecommended.
- Under Administrator Account, select SSH public key and enter your key.
- Under Inbound Port Rules, allow SSH (port 22) from your trusted IP only.
- Click Review + Create, then click Create.
Option B: Azure CLI
az vm image terms accept --urn sac1647283583153:oracle-instant-client-23ai-oel9:default:latest
az vm create \
--resource-group myResourceGroup \
--name my-oracle-instant-client-23ai-vm \
--image sac1647283583153:oracle-instant-client-23ai-oel9:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku StandardImportant: The Oracle Client makes outbound connections to remote databases on port 1521. You do not need to open port 1521 inbound on this VM. Review your Network Security Group and route table to confirm that the VM can reach your target Oracle Database server on the listener port.
Connect via SSH
When your VM is running, connect over SSH:
ssh azureuser@<public-ip-address>To find your VM's public IP, run:
az vm show --resource-group myResourceGroup --name my-oracle-instant-client-23ai-vm --show-details --query publicIps -o tsvTo switch to the root user:
sudo su -Important: Wait for the VM to reach a running state before you connect. If you connect too early, you may see permission denied errors while cloud-init completes the initial provisioning.
Switch to the Oracle User and Set Environment
The dedicated oracle OS user owns the Oracle Client software. Switch to this user and source the environment. Type the command rather than pasting it:
# Instant Client runs as your normal user; ORACLE_HOME is on the system PATH via /etc/profile.d cd $HOME . ./setEnv.sh sqlplus -VThe setEnv.sh script sets the Oracle environment variables that utilities such as sqlplus require:
ORACLE_BASE=/usr/lib/oracle ORACLE_HOME=/usr/lib/oracle/23/client_1 TNS_ADMIN=$ORACLE_HOME/network/admin PATH=$ORACLE_HOME/bin:$PATH LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH NLS_LANG=AMERICAN_AMERICA.AL32UTF8A system-wide hook is also installed at /etc/profile.d/oracle-client.sh, so any future Linux user on the VM picks up the same environment automatically on login.
Explore the Client Tooling
sqlplus -H prints a usage summary that covers every command-line option the SQL*Plus binary understands. It is the fastest way to confirm that the client is fully functional, and to look up an option without leaving the shell:
sqlplus -H | head -28To see the full set of binaries shipped with the Administrator install set, browse the install tree:
ls $ORACLE_HOME/
ls $ORACLE_HOME/bin/ | grep -E "sqlplus|sqlldr|tnsping|exp|imp|rman"Configure tnsnames.ora
Before you connect to a remote Oracle Database, add an entry for it to tnsnames.ora. As the oracle user, run these commands. Replace the example values with your target database details:
cd $HOME . ./setEnv.sh cat >> "$ORACLE_HOME/network/admin/tnsnames.ora" << 'TNS' MY_DATABASE = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = YOUR_DB_HOSTNAME)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = YOUR_SERVICE_NAME) ) ) TNSReplace these values:
- YOUR_DB_HOSTNAME with the IP address or DNS name of your Oracle Database server.
- 1521 with the port number, if it differs from the default.
- YOUR_SERVICE_NAME with the service name of the target database.
Verify that Oracle Net loads correctly and that your environment is set:
env | grep -E "^(ORACLE_|TNS_|LD_LIBRARY)" tnsping invalid_aliasThe TNS Ping Utility for Linux: Version 23.26.2.0.0 banner confirms that the Oracle Net layer loads. The TNS-03505: Failed to resolve name error against the dummy alias is expected. To test against your real database, use the entry you just added to tnsnames.ora:
tnsping MY_DATABASEYou get one of these results:
OK (n msec)ifYOUR_DB_HOSTNAMEresolves and the remote listener accepts the connection. This is the result you want.TNS-12545: Connect failed because target host or object does not existifYOUR_DB_HOSTNAMEis unresolvable. The TNS layer is loading correctly. Replace the example host.TNS-12541: TNS:no listenerif the hostname resolves but nothing is listening on port 1521. Check that the target listener is up and reachable from this VM.
Connect to a Remote Database via SQL*Plus
With the environment sourced and tnsnames.ora populated, connect to your remote database. The simplest form uses the TNS alias you created:
cd $HOME . ./setEnv.sh sqlplus system/your_password@MY_DATABASEYou can also use EZCONNECT syntax, which does not need any change to tnsnames.ora:
sqlplus 'system/your_password@//your-db-host:1521/your-service-name'The expected output looks like this:
SQL*Plus: Release 23.26.2.0.0 Production Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database ... SQL>Type EXIT to leave the SQL*Plus session.
Server Components
The image installs these components:
- Oracle Database Instant Client 23ai (Administrator) 23.26.2.0.0: /usr/lib/oracle/23/client_1
- Oracle Linux 8: /
Note: The automatic OS package update script may update component versions on first boot.
Filesystem Layout
The image uses LVM on a single OS disk. The root filesystem hosts the Oracle Client software under /u01. There is no separate /u01 mount point to manage or resize independently.
The image uses these mount points:
- / (37 GB): root filesystem (LVM logical volume), which hosts the Oracle Client software under /u01
- /boot (2 GB): operating system kernel files
- /boot/efi (100 MB): UEFI boot partition (Gen2 Hyper-V)
- /var/crash (10 GB): reserved for kernel crash dumps (LVM logical volume)
- /mnt (varies): Azure temporary resource disk, which is not persistent across stop or deallocate
Key Oracle directories:
- /usr/lib/oracle: Oracle base directory
- /usr/lib/oracle/23/client_1: Oracle Client home directory
- /usr/lib/oracle/23/client_1/bin: client binaries (sqlplus, sqlldr, tnsping, expdp, impdp, exp, imp, tkprof, rman, adrci)
- /usr/lib/oracle/23/client_1/lib: Oracle Net libraries (libclntsh.so)
- /usr/lib/oracle/23/client_1/network/admin: TNS configuration files (tnsnames.ora, sqlnet.ora)
- /u01/app/oraInventory: Oracle Universal Installer inventory
Managing the Oracle Client
The Oracle Instant Client is a set of libraries and command-line tools, not a running service, so there are no services to start or stop.
The system-wide profile hook at /etc/profile.d/oracle-instant-client.sh exports ORACLE_HOME, LD_LIBRARY_PATH and TNS_ADMIN, and adds ${ORACLE_HOME}/bin to your PATH automatically on every interactive login. You do not need su - or a manual setEnv.sh source step.
Verify that the environment is set:
echo $ORACLE_HOME
echo $TNS_ADMIN which sqlplus sqlplus -VScripts and Log Files
Scripts and logs, with their locations:
- initial_boot_update.sh (/stage/scripts): updates the OS with the latest packages on first boot
- initial_boot_update.log (/stage/scripts): output log for the boot update script
- setEnv.sh (/home/oracle): sets Oracle environment variables for sqlplus and other tools
- oracle-client.sh (/etc/profile.d): system-wide environment hook for any logged-in user
On Startup
An OS package update script runs on first boot to apply any updates released since the build. To disable it, remove the script and its crontab entry:
sudo rm -f /stage/scripts/initial_boot_update.sh
sudo crontab -e
# Delete the following line, save and exit: @reboot /stage/scripts/initial_boot_update.shTroubleshooting
You cannot connect over SSH
- Verify that the VM is in the Running state in the Azure Portal.
- Check that the Network Security Group allows port 22.
- Make sure you are using the correct username:
azureuser - Verify that your SSH key matches the one you configured during deployment.
sqlplus: command not found
- Confirm that you switched to the oracle user:
# Instant Client runs as your normal user; ORACLE_HOME is on the system PATH via /etc/profile.d - Source the environment script:
. ~/setEnv.sh - Verify that the install path exists:
ls /usr/lib/oracle/23/client_1/bin/sqlplus - Confirm that
$ORACLE_HOME/binis on your PATH:echo $PATH
ORA-12154: TNS:could not resolve the connect identifier specified
- Check that your alias is defined in tnsnames.ora:
cat $ORACLE_HOME/network/admin/tnsnames.ora - Confirm that
TNS_ADMINpoints at the network/admin directory:echo $TNS_ADMIN - Validate that the alias resolves:
tnsping MY_DATABASE - Watch for typos and case sensitivity in the alias name.
ORA-12170: TNS:Connect timeout occurred
- Confirm that the target database hostname and port are reachable from the VM:
nc -vz YOUR_DB_HOSTNAME 1521 - Check that the Network Security Group on the target database side allows inbound traffic from your VM.
- Verify route tables, peering or VPN from this Azure VM to the target database network.
- If the target is on premises, confirm Azure ExpressRoute or Site-to-Site VPN connectivity.
ORA-12541: TNS:no listener
- The remote database listener may be down. Check with the DBA who manages the target database.
- Confirm that you are using the correct port number in your tnsnames.ora entry.
- Run
tnsping MY_DATABASEto confirm that the listener responds at the protocol layer.
Security Recommendations
- Restrict outbound access. Allow outbound TCP 1521 from this VM only to the specific Oracle Database servers it needs to reach.
- Protect tnsnames.ora. The TNS configuration file may reveal hostnames and service names of your databases. Keep file permissions tight and avoid leaking the file.
- Use wallets for credentials. Configure Oracle Wallet so that passwords are not stored in plain text in scripts or shell history.
- Encrypt connections. Configure Oracle Net Services to use SSL/TLS encryption for client-to-database traffic.
- Limit OS access. Restrict SSH access to authorized administrators only.
- Enable auditing. Forward shell history and OS audit logs to a central log store.
- Keep the system updated. Apply Oracle Critical Patch Updates and OS security patches regularly.
Support
If you have any issues with this product, contact SecureAnyCloud support:
- Email: sales@secureanycloud.com
- Website: secureanycloud.com
- Product catalogue: secureanycloud.com/products
- User guides: secureanycloud.com/guides
- Support hours: 24/7 with guaranteed 24 hour response SLA
SecureAnyCloud provides Oracle expertise and platform engineering support across AWS, Microsoft Azure and Alibaba Cloud. For Oracle licensing questions, contact your Oracle account manager.
Oracle and Oracle Database are registered trademarks of Oracle Corporation. SecureAnyCloud is an independent provider and is not affiliated with or endorsed by Oracle Corporation.
Deploy on Azure
Launch Oracle Database Instant Client 23ai on Oracle Linux 9 on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com