{"id":5805,"date":"2026-07-19T22:10:32","date_gmt":"2026-07-19T16:40:32","guid":{"rendered":"https:\/\/w3buddy.com\/?p=5805"},"modified":"2026-07-19T22:10:34","modified_gmt":"2026-07-19T16:40:34","slug":"oracle-network-and-connectivity","status":"publish","type":"post","link":"https:\/\/w3buddy.com\/blog\/oracle-network-and-connectivity\/","title":{"rendered":"Oracle Network and Connectivity"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A complete production-ready SOP for Oracle Network and Connectivity administration on Linux. Covers tnsnames.ora, listener.ora, sqlnet.ora management, SCAN listener configuration in RAC, connection pooling with DRCP, Oracle Connection Manager (CMAN) setup, and SSL\/TLS for Oracle connections \u2014 with real commands, expected outputs, and consultant-level notes for both standard OFA and enterprise custom path conventions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1. Document Info<\/h3>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Item<\/th><th>Detail<\/th><\/tr><\/thead><tbody><tr><td>Oracle Version<\/td><td>19c (19.3+)<\/td><\/tr><tr><td>OS<\/td><td>Oracle Linux 7.x \/ RHEL 7.x or 8.x<\/td><\/tr><tr><td>Network Files<\/td><td>listener.ora, tnsnames.ora, sqlnet.ora<\/td><\/tr><tr><td>Tools<\/td><td>lsnrctl, tnsping, netca, netmgr<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 1386821.1 (Oracle Net Best Practices)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 2121366.1 (SCAN Listener Configuration)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 207303.1 (SSL\/TLS for Oracle Net)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 1539645.1 (DRCP Configuration)<\/td><\/tr><tr><td>Prepared By<\/td><td>Oracle DBA \/ Consultant<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. Oracle Network \u2014 Concepts You Must Know First<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>How does Oracle network connectivity work?<\/strong> When a client application connects to an Oracle database, the connection goes through Oracle Net (formerly SQL*Net). The client looks up the database address in <code>tnsnames.ora<\/code> (or LDAP\/Easy Connect), connects to the Oracle Listener on the specified port, and the Listener hands the connection off to the database server process. Understanding this flow is essential for troubleshooting connection failures.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Oracle Net Connection Flow<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>CLIENT APPLICATION\n       \u2502\n       \u2502  1. Resolves service name via tnsnames.ora \/ Easy Connect \/ LDAP\n       \u2502\n       \u25bc\nORACLE LISTENER (port 1521)\n       \u2502\n       \u2502  2. Listener accepts connection request\n       \u2502  3. Listener checks SID_LIST \/ service registry\n       \u2502  4. Spawns dedicated server process OR hands to shared server\n       \u2502\n       \u25bc\nDATABASE SERVER PROCESS\n       \u2502\n       \u2502  5. Server process authenticates user\n       \u2502  6. Session established\n       \u2502\n       \u25bc\nCLIENT RECEIVES CONNECTION<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Key Oracle Network Files<\/h4>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>File<\/th><th>Location<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>listener.ora<\/td><td>$ORACLE_HOME\/network\/admin\/<\/td><td>Defines the listener \u2014 port, protocol, static DB registration<\/td><\/tr><tr><td>tnsnames.ora<\/td><td>$ORACLE_HOME\/network\/admin\/<\/td><td>Maps service names to connection descriptors<\/td><\/tr><tr><td>sqlnet.ora<\/td><td>$ORACLE_HOME\/network\/admin\/<\/td><td>Client and server-side network behavior \u2014 encryption, tracing, naming methods<\/td><\/tr><tr><td>ldap.ora<\/td><td>$ORACLE_HOME\/network\/admin\/<\/td><td>LDAP\/OID directory server configuration (if using LDAP naming)<\/td><\/tr><tr><td>cman.ora<\/td><td>$ORACLE_HOME\/network\/admin\/<\/td><td>Oracle Connection Manager configuration<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Where to put these files?<\/strong> By default Oracle looks in <code>$ORACLE_HOME\/network\/admin\/<\/code>. In environments with multiple Oracle Homes on one server, you can also set <code>TNS_ADMIN<\/code> environment variable to point to a central location \u2014 all homes then use the same files.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Oracle Naming Methods (How Clients Resolve Service Names)<\/h4>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Method<\/th><th>How It Works<\/th><th>When to Use<\/th><\/tr><\/thead><tbody><tr><td>Local Naming (tnsnames.ora)<\/td><td>Client reads local tnsnames.ora file<\/td><td>Most common \u2014 simple, no dependencies<\/td><\/tr><tr><td>Easy Connect<\/td><td>Connection string in host:port\/service format<\/td><td>Quick connections, no tnsnames.ora needed<\/td><\/tr><tr><td>Directory Naming (LDAP)<\/td><td>Service names stored in LDAP\/OID<\/td><td>Large enterprises, central management<\/td><\/tr><tr><td>Easy Connect Plus<\/td><td>Extended Easy Connect with more options<\/td><td>19c feature \u2014 supports wallet, timeout, HA<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. Path Conventions and Environment Details<\/h3>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Item<\/th><th>Convention A<\/th><th>Convention B<\/th><\/tr><\/thead><tbody><tr><td>Oracle Home<\/td><td>\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1<\/td><td>\/oracle\/RDBMS\/19.31<\/td><\/tr><tr><td>Network Admin Dir<\/td><td>$ORACLE_HOME\/network\/admin<\/td><td>$ORACLE_HOME\/network\/admin<\/td><\/tr><tr><td>Listener Log<\/td><td>$ORACLE_HOME\/network\/log\/listener.log<\/td><td>$ORACLE_HOME\/network\/log\/listener.log<\/td><\/tr><tr><td>Listener Trace<\/td><td>$ORACLE_HOME\/network\/trace\/<\/td><td>$ORACLE_HOME\/network\/trace\/<\/td><\/tr><tr><td>Central TNS_ADMIN<\/td><td>\/u01\/app\/oracle\/network\/admin<\/td><td>\/oracle\/network\/admin<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. listener.ora \u2014 Complete Management<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is the listener?<\/strong> The Oracle Listener is a server-side process that accepts incoming client connection requests. It runs independently of the database \u2014 it can be up while the database is down (and vice versa). Without a running listener, clients cannot connect to the database remotely (local OS-authenticated connections still work).<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.1 \u2014 Basic listener.ora Structure and Configuration<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Two types of database registration with the listener:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dynamic registration<\/strong> \u2014 the database automatically registers itself with the listener when it starts. The PMON background process sends registration information. This is the default and recommended method.<\/li>\n\n\n\n<li><strong>Static registration<\/strong> \u2014 you manually define the database in listener.ora. Required for RMAN duplicate, Data Guard, and when the DB is in MOUNT state and needs to accept connections.<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Edit listener.ora\nsu - oracle\nvi $ORACLE_HOME\/network\/admin\/listener.ora<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Complete listener.ora example with all important configurations:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------\n# listener.ora \u2014 Oracle Listener Configuration\n# Server: dbserver01.company.com\n# Modified: &lt;date&gt; by &lt;DBA name&gt;\n# -------------------------------------------------------\n\n# Listener name -- default is LISTENER\n# You can have multiple listeners with different names and ports\nLISTENER =\n  (DESCRIPTION_LIST =\n    (DESCRIPTION =\n      # Primary protocol and port\n      (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver01.company.com)(PORT = 1521))\n      # IPC for local connections (faster than TCP for local)\n      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))\n    )\n  )\n\n# Static database registration\n# Required for: RMAN duplicate, Data Guard, DB in MOUNT state,\n#               when PMON registration is not working\n# If only using dynamic registration -- this section can be omitted\nSID_LIST_LISTENER =\n  (SID_LIST =\n    (SID_DESC =\n      # GLOBAL_DBNAME = service name clients use to connect\n      (GLOBAL_DBNAME = ORCL)\n      # ORACLE_HOME = home of the database being registered\n      (ORACLE_HOME   = \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1)\n      # SID_NAME = the actual Oracle SID\n      (SID_NAME      = ORCL)\n    )\n    # For Data Guard Broker -- needs separate entry with _DGMGRL suffix\n    (SID_DESC =\n      (GLOBAL_DBNAME = ORCL_DGMGRL)\n      (ORACLE_HOME   = \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1)\n      (SID_NAME      = ORCL)\n    )\n    # For pluggable database (CDB environment)\n    # (SID_DESC =\n    #   (GLOBAL_DBNAME = PDB1)\n    #   (ORACLE_HOME   = \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1)\n    #   (SID_NAME      = ORCL)\n    # )\n  )\n\n# Listener logging\n# LOGGING_LISTENER = ON   -- enable logging (default)\n# LOG_FILE_LISTENER = listener   -- log file name (listener.log)\n# LOG_DIRECTORY_LISTENER = \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/network\/log\n\n# Listener tracing (only enable for troubleshooting -- disable in production)\n# TRACE_LEVEL_LISTENER = OFF   -- OFF, USER, ADMIN, SUPPORT\n# TRACE_FILE_LISTENER = listener\n# TRACE_DIRECTORY_LISTENER = \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/network\/trace\n\n# Security -- restrict listener administration to local connections only\n# ADMIN_RESTRICTIONS_LISTENER = ON<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.2 \u2014 Configure Multiple Listeners on Same Server<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>When to use multiple listeners?<\/strong> When you have multiple databases on the same server and want each on a different port, or when a specific application requires its own dedicated listener.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>vi $ORACLE_HOME\/network\/admin\/listener.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Primary listener on 1521\nLISTENER =\n  (DESCRIPTION_LIST =\n    (DESCRIPTION =\n      (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver01.company.com)(PORT = 1521))\n    )\n  )\n\nSID_LIST_LISTENER =\n  (SID_LIST =\n    (SID_DESC =\n      (GLOBAL_DBNAME = ORCL)\n      (ORACLE_HOME   = \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1)\n      (SID_NAME      = ORCL)\n    )\n  )\n\n# Secondary listener on 1522 for TESTDB\nLISTENER_TEST =\n  (DESCRIPTION_LIST =\n    (DESCRIPTION =\n      (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver01.company.com)(PORT = 1522))\n    )\n  )\n\nSID_LIST_LISTENER_TEST =\n  (SID_LIST =\n    (SID_DESC =\n      (GLOBAL_DBNAME = TESTDB)\n      (ORACLE_HOME   = \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1)\n      (SID_NAME      = TESTDB)\n    )\n  )<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.3 \u2014 Listener Control Commands (lsnrctl)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Start the default listener (named LISTENER)\nlsnrctl start\n\n# Start a specific named listener\nlsnrctl start LISTENER_TEST\n\n# Stop the listener\nlsnrctl stop\n\n# Stop specific listener\nlsnrctl stop LISTENER_TEST\n\n# Check listener status -- shows registered services and endpoints\nlsnrctl status\n\n# Status of specific listener\nlsnrctl status LISTENER_TEST\n\n# Show services registered with listener\nlsnrctl services\n\n# Reload listener -- picks up listener.ora changes without restart\n# Does NOT drop existing connections\nlsnrctl reload\n\n# Show listener version\nlsnrctl version<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.4 \u2014 Verify Dynamic Registration is Working<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>How does dynamic registration work?<\/strong> When the database starts, the PMON background process sends a registration packet to the listener every 60 seconds containing the database&#8217;s service names, instance name, and dispatcher information. The listener adds these to its active service list.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Check which services are dynamically registered\nlsnrctl services<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output showing dynamically registered service:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Services Summary...\nService \"ORCL\" has 1 instance(s).\n  Instance \"ORCL\", status READY, has 1 handler(s) for this service...\n    Handler(s):\n      \"DEDICATED\" established:0 refused:0 state:ready\n         LOCAL SERVER<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Force PMON to re-register with listener immediately\n-- (instead of waiting up to 60 seconds)\nsqlplus \/ as sysdba\nALTER SYSTEM REGISTER;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.5 \u2014 Configure LOCAL_LISTENER Parameter<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why set LOCAL_LISTENER?<\/strong> By default PMON registers with listeners on port 1521. If your listener is on a non-standard port, or if you have multiple listeners, set this parameter to tell PMON which listener(s) to register with.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\n-- Check current LOCAL_LISTENER setting\nSHOW PARAMETER local_listener;\n\n-- Set LOCAL_LISTENER to register with specific listener\nALTER SYSTEM SET LOCAL_LISTENER=\n    '(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver01.company.com)(PORT=1521))'\n    SCOPE=BOTH;\n\n-- For multiple listeners\nALTER SYSTEM SET LOCAL_LISTENER=\n    '(ADDRESS_LIST=\n        (ADDRESS=(PROTOCOL=TCP)(HOST=dbserver01.company.com)(PORT=1521))\n        (ADDRESS=(PROTOCOL=TCP)(HOST=dbserver01.company.com)(PORT=1522))\n    )'\n    SCOPE=BOTH;\n\n-- Force re-registration\nALTER SYSTEM REGISTER;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.6 \u2014 Listener Log Analysis<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why check listener logs?<\/strong> The listener log records every connection attempt \u2014 successful and failed. When clients report connection failures, the listener log is the first place to check. It shows the exact error and the client address.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Listener log location\nls -lh $ORACLE_HOME\/network\/log\/listener.log\n\n# View last 100 lines of listener log\ntail -100 $ORACLE_HOME\/network\/log\/listener.log\n\n# Find connection errors\ngrep -E \"TNS-|error|refused\" $ORACLE_HOME\/network\/log\/listener.log | tail -50\n\n# Find connections from a specific client IP\ngrep \"192.168.1.100\" $ORACLE_HOME\/network\/log\/listener.log | tail -20\n\n# Count connection attempts per hour\ngrep \"CONNECT_DATA\" $ORACLE_HOME\/network\/log\/listener.log | \\\n    awk '{print $1,$2}' | cut -d: -f1 | sort | uniq -c\n\n# Rotate listener log (when it gets too large -- &gt; 500MB)\n# The log cannot be truncated while listener is running\n# Use lsnrctl to rotate:\nlsnrctl set log_status off\nmv $ORACLE_HOME\/network\/log\/listener.log \\\n   $ORACLE_HOME\/network\/log\/listener_$(date +%Y%m%d).log\nlsnrctl set log_status on<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. tnsnames.ora \u2014 Complete Management<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is tnsnames.ora?<\/strong> tnsnames.ora is a client-side name resolution file. It maps logical service names (aliases) to the actual connection details \u2014 hostname, port, and service name. When an application connects using a service name like <code>ORCL<\/code>, Oracle Net looks up <code>ORCL<\/code> in tnsnames.ora to find the actual connection string.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.1 \u2014 tnsnames.ora Structure and Syntax<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Edit tnsnames.ora\nvi $ORACLE_HOME\/network\/admin\/tnsnames.ora<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Complete tnsnames.ora with all common configurations:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------\n# tnsnames.ora\n# Location: $ORACLE_HOME\/network\/admin\/tnsnames.ora\n# Modified: &lt;date&gt; by &lt;DBA name&gt;\n# -------------------------------------------------------\n\n# Basic entry -- single database, dedicated server\nORCL =\n  (DESCRIPTION =\n    # ADDRESS_LIST defines where to connect\n    (ADDRESS_LIST =\n      (ADDRESS =\n        (PROTOCOL = TCP)\n        (HOST     = dbserver01.company.com)\n        (PORT     = 1521)\n      )\n    )\n    (CONNECT_DATA =\n      # SERVICE_NAME is the preferred way (not SID)\n      # Allows connection load balancing and failover\n      (SERVICE_NAME = ORCL)\n      # SERVER = DEDICATED forces dedicated server connection\n      # Remove this line if using shared server\n      (SERVER = DEDICATED)\n    )\n  )\n\n# Entry with failover -- tries PRIMARY first, then SECONDARY\nORCL_HA =\n  (DESCRIPTION =\n    # FAILOVER = ON -- if first address fails, try the next\n    (FAILOVER = ON)\n    # LOAD_BALANCE = OFF -- connect to addresses in order, not randomly\n    (LOAD_BALANCE = OFF)\n    (ADDRESS_LIST =\n      (ADDRESS =\n        (PROTOCOL = TCP)\n        (HOST     = dbserver01.company.com)\n        (PORT     = 1521)\n      )\n      (ADDRESS =\n        (PROTOCOL = TCP)\n        (HOST     = dbserver02.company.com)\n        (PORT     = 1521)\n      )\n    )\n    (CONNECT_DATA =\n      (SERVICE_NAME = ORCL)\n      (FAILOVER_MODE =\n        (TYPE   = SELECT)    -- session failover (SELECT only)\n        (METHOD = BASIC)     -- reconnect after failure\n        (RETRIES = 3)        -- retry 3 times\n        (DELAY   = 3)        -- wait 3 seconds between retries\n      )\n    )\n  )\n\n# Entry for RAC -- connects via SCAN listener\n# SCAN distributes connections across all RAC nodes automatically\nRACDB =\n  (DESCRIPTION =\n    (LOAD_BALANCE = ON)\n    (ADDRESS_LIST =\n      (ADDRESS =\n        (PROTOCOL = TCP)\n        (HOST     = rac-scan.company.com)   -- SCAN hostname\n        (PORT     = 1521)\n      )\n    )\n    (CONNECT_DATA =\n      (SERVICE_NAME = RACDB_APP)  -- RAC service name\n      (SERVER = DEDICATED)\n    )\n  )\n\n# Entry for Data Guard standby (read-only access)\nORCL_STBY =\n  (DESCRIPTION =\n    (ADDRESS_LIST =\n      (ADDRESS =\n        (PROTOCOL = TCP)\n        (HOST     = dbserver02.company.com)\n        (PORT     = 1521)\n      )\n    )\n    (CONNECT_DATA =\n      (SERVICE_NAME = ORCL_STBY)\n      (UR = A)   -- UR=A allows connection even in restricted\/mount mode\n    )\n  )\n\n# Entry with wallet\/SSL (for encrypted connections)\nORCL_SSL =\n  (DESCRIPTION =\n    (ADDRESS =\n      (PROTOCOL = TCPS)\n      (HOST     = dbserver01.company.com)\n      (PORT     = 2484)     -- TCPS default port\n    )\n    (CONNECT_DATA =\n      (SERVICE_NAME = ORCL)\n    )\n    (SECURITY =\n      (MY_WALLET_DIRECTORY = \/u01\/app\/oracle\/wallet\/client)\n      (SSL_SERVER_CERT_DN  = \"CN=dbserver01,OU=DBTeam,O=Company,C=US\")\n    )\n  )\n\n# Entry for CDB with PDB\nPDB1 =\n  (DESCRIPTION =\n    (ADDRESS =\n      (PROTOCOL = TCP)\n      (HOST     = dbserver01.company.com)\n      (PORT     = 1521)\n    )\n    (CONNECT_DATA =\n      (SERVICE_NAME = PDB1)   -- PDB service name\n    )\n  )<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.2 \u2014 Verify tnsnames.ora Entries Work<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Test TNS resolution without actually connecting\ntnsping ORCL\n\n# Expected output:\n# Attempting to contact (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)\n# (HOST=dbserver01.company.com)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)))\n# OK (10 msec)\n\n# Test multiple entries\ntnsping ORCL_STBY\ntnsping RACDB\ntnsping PDB1\n\n# Show what tnsnames.ora tnsping is using\ntnsping ORCL | head -5<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Test actual connection (not just resolution)\nsqlplus system\/Oracle_123@ORCL\n\n# Test with SYSDBA\nsqlplus sys\/Oracle_123@ORCL as sysdba\n\n# Test from remote client (substitute client's connection string)\nsqlplus hr\/Hr_123@\"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver01.company.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.3 \u2014 TNS_ADMIN \u2014 Central tnsnames.ora Location<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is TNS_ADMIN?<\/strong> By default each Oracle Home has its own tnsnames.ora. When you have many Oracle Homes or many servers, maintaining separate tnsnames.ora files is error-prone. Setting TNS_ADMIN to a central network directory means all homes share a single tnsnames.ora.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Set TNS_ADMIN to central location\n# Add to oracle user's ~\/.bash_profile\nvi ~\/.bash_profile<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------\n# Central Oracle Net configuration\n# -------------------------------------------------------\n\n# TNS_ADMIN points all Oracle tools to central network config\n# All tnsnames.ora, sqlnet.ora, ldap.ora stored here\nexport TNS_ADMIN=\/u01\/app\/oracle\/network\/admin\n# Convention B: export TNS_ADMIN=\/oracle\/network\/admin<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Create central directory and copy files there\nmkdir -p \/u01\/app\/oracle\/network\/admin\ncp $ORACLE_HOME\/network\/admin\/tnsnames.ora \\\n   \/u01\/app\/oracle\/network\/admin\/\ncp $ORACLE_HOME\/network\/admin\/sqlnet.ora \\\n   \/u01\/app\/oracle\/network\/admin\/\ncp $ORACLE_HOME\/network\/admin\/listener.ora \\\n   \/u01\/app\/oracle\/network\/admin\/\n\n# Apply profile\n. ~\/.bash_profile\n\n# Verify tnsping uses the central file\ntnsping ORCL<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.4 \u2014 Easy Connect (No tnsnames.ora Required)<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is Easy Connect?<\/strong> Easy Connect allows connecting without a tnsnames.ora entry by specifying the connection details directly in the connection string. Very useful for quick connections, testing, and scripts.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Easy Connect format: user\/password@host:port\/service_name\nsqlplus hr\/Hr_123@dbserver01.company.com:1521\/ORCL\n\n# Short form (default port 1521)\nsqlplus hr\/Hr_123@dbserver01.company.com\/ORCL\n\n# With role\nsqlplus sys\/Oracle_123@dbserver01.company.com:1521\/ORCL as sysdba\n\n# Easy Connect Plus (19c) -- more options\n# Syntax: user@host:port\/service?option1=value1&amp;option2=value2\nsqlplus hr\/Hr_123@\"dbserver01.company.com:1521\/ORCL?connect_timeout=10&amp;retry_count=3\"<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Ensure Easy Connect is enabled in sqlnet.ora\n-- NAMES.DIRECTORY_PATH controls which naming methods are tried and in what order\n-- Add EZCONNECT to enable Easy Connect<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">6. sqlnet.ora \u2014 Complete Management<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is sqlnet.ora?<\/strong> sqlnet.ora controls the behavior of Oracle Net at both client and server level. It configures naming methods, connection timeouts, dead connection detection, encryption, tracing, and more. Every Oracle environment should have a properly configured sqlnet.ora.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.1 \u2014 Complete sqlnet.ora Configuration<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>vi $ORACLE_HOME\/network\/admin\/sqlnet.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------\n# sqlnet.ora \u2014 Oracle Net Client\/Server Configuration\n# Location: $ORACLE_HOME\/network\/admin\/sqlnet.ora\n# Modified: &lt;date&gt; by &lt;DBA name&gt;\n# -------------------------------------------------------\n\n# -------------------------------------------------------\n# NAMING METHODS\n# Controls how Oracle resolves service names\n# Order matters: Oracle tries methods left to right\n# TNSNAMES = look in local tnsnames.ora\n# EZCONNECT = use Easy Connect string format\n# LDAP = use LDAP\/OID directory\n# -------------------------------------------------------\nNAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)\n\n# -------------------------------------------------------\n# CONNECTION TIMEOUTS\n# -------------------------------------------------------\n\n# SQLNET.OUTBOUND_CONNECT_TIMEOUT\n# How long to wait for a connection to be established (seconds)\n# Prevents hanging indefinitely when server is unreachable\n# Recommended: 10-30 seconds\nSQLNET.OUTBOUND_CONNECT_TIMEOUT = 15\n\n# SQLNET.INBOUND_CONNECT_TIMEOUT\n# How long the server waits for the client to complete authentication\n# after the initial TCP connection is established (seconds)\n# Protects against denial-of-service attacks\n# Recommended: 60 seconds\nSQLNET.INBOUND_CONNECT_TIMEOUT = 60\n\n# SQLNET.SEND_TIMEOUT\n# How long to wait for a send operation to complete (seconds)\nSQLNET.SEND_TIMEOUT = 60\n\n# SQLNET.RECV_TIMEOUT\n# How long to wait for a receive operation to complete (seconds)\nSQLNET.RECV_TIMEOUT = 60\n\n# -------------------------------------------------------\n# DEAD CONNECTION DETECTION (DCD)\n# Detects and cleans up dead client connections on the server\n# -------------------------------------------------------\n\n# SQLNET.EXPIRE_TIME (minutes)\n# Server sends a probe packet every N minutes to check if client is alive\n# If client does not respond -- server cleans up the connection\n# Recommended: 10 minutes for production\n# Prevents ghost sessions accumulating after client crashes\nSQLNET.EXPIRE_TIME = 10\n\n# -------------------------------------------------------\n# NATIVE NETWORK ENCRYPTION (NNE)\n# Encrypts data in transit between client and server\n# NOTE: This is different from TDE which encrypts data at rest\n# No license required for NNE in Oracle 19c\n# -------------------------------------------------------\n\n# SQLNET.ENCRYPTION_SERVER and SQLNET.ENCRYPTION_CLIENT\n# Values: REQUIRED, REQUESTED, ACCEPTED, REJECTED\n# REQUIRED = always encrypt (reject unencrypted connections)\n# REQUESTED = prefer encryption, accept unencrypted\n# ACCEPTED = accept either encrypted or unencrypted\n# REJECTED = never encrypt\nSQLNET.ENCRYPTION_SERVER = REQUESTED\nSQLNET.ENCRYPTION_CLIENT = REQUESTED\n\n# Encryption algorithms in preference order\n# AES256 and AES192 are the strongest currently available\nSQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)\nSQLNET.ENCRYPTION_TYPES_CLIENT = (AES256, AES192, AES128)\n\n# Data integrity (checksumming)\n# Ensures data is not tampered with in transit\nSQLNET.CRYPTO_CHECKSUM_SERVER = REQUESTED\nSQLNET.CRYPTO_CHECKSUM_CLIENT = REQUESTED\nSQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA384, SHA512)\nSQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA256, SHA384, SHA512)\n\n# -------------------------------------------------------\n# LOGGING AND TRACING\n# -------------------------------------------------------\n\n# Log location for sqlnet errors\nLOG_DIRECTORY_CLIENT  = \/tmp\nLOG_DIRECTORY_SERVER  = \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/network\/log\nLOG_FILE_CLIENT       = sqlnet_client\nLOG_FILE_SERVER       = sqlnet_server\n\n# Tracing (ONLY enable for troubleshooting -- disable in production)\n# Trace level: OFF, USER, ADMIN, SUPPORT\n# SUPPORT level generates massive files -- use carefully\nTRACE_LEVEL_CLIENT  = OFF\nTRACE_LEVEL_SERVER  = OFF\n# TRACE_DIRECTORY_CLIENT  = \/tmp\n# TRACE_DIRECTORY_SERVER  = \/tmp\n\n# -------------------------------------------------------\n# TDE WALLET LOCATION (if TDE is configured)\n# -------------------------------------------------------\n# ENCRYPTION_WALLET_LOCATION =\n#   (SOURCE =\n#     (METHOD = FILE)\n#     (METHOD_DATA =\n#       (DIRECTORY = \/u01\/app\/oracle\/admin\/ORCL\/wallet)\n#     )\n#   )\n\n# -------------------------------------------------------\n# ADDITIONAL SECURITY\n# -------------------------------------------------------\n\n# Prevent unauthorized database access by limiting remote OS authentication\n# SQLNET.AUTHENTICATION_SERVICES = (NONE)   -- disable OS auth\n# SQLNET.AUTHENTICATION_SERVICES = (NTS)    -- Windows only\n# SQLNET.AUTHENTICATION_SERVICES = (TCPS)   -- SSL\/TLS auth\n# Leave commented for standard OS authentication on Linux<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.2 \u2014 Dead Connection Detection \u2014 Why It Matters<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is Dead Connection Detection (DCD)?<\/strong> When a client process crashes or the network between client and server goes down, the server-side process (shadow process) does not immediately know. Without DCD, these orphaned server processes accumulate, consuming memory and connection slots. DCD sends a probe packet periodically to detect dead clients and clean them up.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Check current ghost\/dead sessions (connected but no activity for hours)\nset linesize 200\nset pagesize 100\ncol username      for a15\ncol machine       for a25\ncol program       for a30\ncol status        for a10\ncol last_call_et  for 9999999\ncol logon_time    for a25\n\nSELECT sid, username, machine, program, status,\n       last_call_et               seconds_idle,\n       TO_CHAR(logon_time,'YYYY-MM-DD HH24:MI:SS') logon_time\nFROM   v$session\nWHERE  type         = 'USER'\nAND    last_call_et &gt; 3600      -- idle for more than 1 hour\nAND    status       = 'INACTIVE'\nORDER BY last_call_et DESC;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.3 \u2014 Configure Trace for Troubleshooting<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>When to enable tracing?<\/strong> Only when you have a specific connection problem that you cannot diagnose from listener logs and error messages alone. Tracing generates large files quickly \u2014 always disable it after collecting the trace.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Enable trace for a specific client session (client-side)\n# Add to client's sqlnet.ora temporarily\n# TRACE_LEVEL_CLIENT = SUPPORT   -- most detailed\n# TRACE_DIRECTORY_CLIENT = \/tmp\n# TRACE_FILE_CLIENT = sqlnet_client\n# TRACE_UNIQUE_CLIENT = ON   -- separate file per connection\n\n# Enable server-side trace (SERVER sqlnet.ora)\nvi $ORACLE_HOME\/network\/admin\/sqlnet.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Add temporarily for troubleshooting -- remove after collecting trace\nTRACE_LEVEL_SERVER  = ADMIN\nTRACE_DIRECTORY_SERVER = \/tmp\/oracle_traces\nTRACE_FILE_SERVER   = sqlnet_server<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Reload listener to pick up trace settings\nlsnrctl reload\n\n# Reproduce the problem\n# Then collect the trace files\nls -lh \/tmp\/oracle_traces\/\n\n# IMPORTANT: Disable trace immediately after collecting\n# Revert sqlnet.ora and reload<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">7. SCAN Listener Configuration in RAC<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is SCAN?<\/strong> SCAN (Single Client Access Name) is the recommended connection method for Oracle RAC. Instead of clients needing to know the individual node addresses, they connect to a single SCAN hostname that resolves to 1-3 IPs. The SCAN listener distributes connections across all RAC nodes. If a node fails, the SCAN listener automatically redirects connections to surviving nodes.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why is SCAN better than node VIPs?<\/strong> Before SCAN, clients connected to node-specific VIPs. When nodes were added or removed from the cluster, all client tnsnames.ora files had to be updated. With SCAN, the connection string never changes \u2014 only the DNS record for the SCAN hostname changes, and that is managed by the DBA.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.1 \u2014 SCAN Architecture<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>CLIENT\n  \u2502\n  \u2502 connects to: rac-scan.company.com:1521\n  \u2502\n  \u25bc\nDNS SERVER\n  \u251c\u2500\u2500 rac-scan.company.com \u2192 192.168.1.15\n  \u251c\u2500\u2500 rac-scan.company.com \u2192 192.168.1.16\n  \u2514\u2500\u2500 rac-scan.company.com \u2192 192.168.1.17\n           (3 SCAN IPs -- DNS round-robin)\n  \u2502\n  \u25bc\nSCAN LISTENER (on all 3 SCAN IPs)\n  \u2502\n  \u251c\u2500\u2500 Routes to: racnode1:1521 (local listener)\n  \u2502              racnode2:1521 (local listener)\n  \u2502\n  \u25bc\nLOCAL LISTENER (on each node)\n  \u2502\n  \u25bc\nDATABASE INSTANCE (RACDB1 on node1, RACDB2 on node2)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.2 \u2014 Check SCAN Configuration<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># As grid user -- all SCAN management is done as grid\nsu - grid\n\n# Check SCAN name and IPs\n$ORACLE_HOME\/bin\/srvctl config scan\n\n# Expected output:\n# SCAN name: rac-scan.company.com, Network: 1\n# Subnet IPv4: 192.168.1.0\/255.255.255.0\/eth0, static\n# SCAN 1 IPv4 VIP: 192.168.1.15\n# SCAN 2 IPv4 VIP: 192.168.1.16\n# SCAN 3 IPv4 VIP: 192.168.1.17\n\n# Check SCAN listener status\n$ORACLE_HOME\/bin\/srvctl status scan_listener\n\n# Expected output:\n# SCAN Listener LISTENER_SCAN1 is enabled\n# SCAN listener LISTENER_SCAN1 is running on node racnode1\n# SCAN Listener LISTENER_SCAN2 is enabled\n# SCAN listener LISTENER_SCAN2 is running on node racnode2\n# SCAN Listener LISTENER_SCAN3 is enabled\n# SCAN listener LISTENER_SCAN3 is running on node racnode1\n\n# Detailed SCAN listener config\n$ORACLE_HOME\/bin\/srvctl config scan_listener<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.3 \u2014 Check Services Registered with SCAN Listener<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\n\n# Check what services are registered with each SCAN listener\n# Run on each SCAN listener\nlsnrctl status LISTENER_SCAN1\nlsnrctl status LISTENER_SCAN2\nlsnrctl status LISTENER_SCAN3\n\n# Check services registered\nlsnrctl services LISTENER_SCAN1<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.4 \u2014 Manage SCAN Listener<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\n\n# Start SCAN listener\n$ORACLE_HOME\/bin\/srvctl start scan_listener\n\n# Stop SCAN listener\n$ORACLE_HOME\/bin\/srvctl stop scan_listener\n\n# Start specific SCAN listener (by number 1, 2, or 3)\n$ORACLE_HOME\/bin\/srvctl start scan_listener -scannumber 1\n\n# Stop specific SCAN listener\n$ORACLE_HOME\/bin\/srvctl stop scan_listener -scannumber 2\n\n# Relocate SCAN listener to a different node\n# (for maintenance on current node)\n$ORACLE_HOME\/bin\/srvctl relocate scan_listener \\\n    -scannumber 1 \\\n    -n racnode2<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.5 \u2014 Configure Local Listeners in RAC<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>In RAC, each node has its own local listener<\/strong> on port 1521 that handles connections redirected from the SCAN listener. The SCAN listener accepts the initial connection and redirects it to the local listener on the appropriate node.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\n\n# Check local listener configuration on all nodes\n$ORACLE_HOME\/bin\/srvctl config listener\n\n# Check local listener status on all nodes\n$ORACLE_HOME\/bin\/srvctl status listener\n\n# Start local listener on all nodes\n$ORACLE_HOME\/bin\/srvctl start listener\n\n# Start listener on specific node only\n$ORACLE_HOME\/bin\/srvctl start listener -n racnode1\n\n# Stop listener on specific node\n$ORACLE_HOME\/bin\/srvctl stop listener -n racnode2<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.6 \u2014 RAC tnsnames.ora for Clients<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Clients connecting to RAC should use the SCAN hostname.<\/strong> This is simpler and more resilient than connecting directly to node VIPs.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Client tnsnames.ora entry for RAC (using SCAN -- preferred)\nvi $ORACLE_HOME\/network\/admin\/tnsnames.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># RAC connection using SCAN (preferred)\n# Clients just need to know the SCAN hostname\nRACDB =\n  (DESCRIPTION =\n    (ADDRESS =\n      (PROTOCOL = TCP)\n      (HOST     = rac-scan.company.com)\n      (PORT     = 1521)\n    )\n    (CONNECT_DATA =\n      (SERVICE_NAME = RACDB_APP)\n    )\n  )\n\n# RAC connection with explicit load balancing across multiple SCAN IPs\n# Use this if DNS round-robin is not configured for SCAN\nRACDB_LB =\n  (DESCRIPTION =\n    (LOAD_BALANCE = ON)\n    (FAILOVER = ON)\n    (ADDRESS_LIST =\n      (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.1.15)(PORT=1521))\n      (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.1.16)(PORT=1521))\n      (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.1.17)(PORT=1521))\n    )\n    (CONNECT_DATA =\n      (SERVICE_NAME = RACDB_APP)\n    )\n  )<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.7 \u2014 Verify SCAN DNS Resolution<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Verify SCAN resolves to 1-3 IPs from client\nnslookup rac-scan.company.com\n\n# Expected output (3 IPs for production):\n# Server:   192.168.1.1\n# Name:    rac-scan.company.com\n# Address: 192.168.1.15\n# Name:    rac-scan.company.com\n# Address: 192.168.1.16\n# Name:    rac-scan.company.com\n# Address: 192.168.1.17\n\n# Also check forward and reverse resolution\nhost rac-scan.company.com\nhost 192.168.1.15\n\n# Test actual connection through SCAN\nsqlplus system\/Oracle_123@rac-scan.company.com:1521\/RACDB_APP\n\n# Tnsping through SCAN\ntnsping RACDB<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">8. DRCP \u2014 Database Resident Connection Pooling<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is DRCP?<\/strong> DRCP (Database Resident Connection Pooling) is an Oracle connection pool that lives inside the database server. When many application connections share a small number of pooled server processes, DRCP dramatically reduces memory consumption. Each connection in the pool is a pooled server process that can be reused by different client connections.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>When to use DRCP?<\/strong> DRCP is ideal for web applications with many short-lived connections \u2014 PHP, Python, Node.js, web services. A web application with 1000 concurrent users needs 1000 database connections without DRCP. With DRCP, those 1000 users can share, say, 50 pooled server processes.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>When NOT to use DRCP?<\/strong> Long-running connections (batch jobs, ETL), applications that heavily use session-level state (DBMS_APPLICATION_INFO, temporary tables), or dedicated application servers that already implement their own connection pool (like Oracle UCP or application server pools).<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.1 \u2014 Configure and Start DRCP<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Connect as SYSDBA\nsqlplus \/ as sysdba\n\n-- Check if DRCP is already configured\nSELECT connection_pool, status, maxsize, minsize, incrsize,\n       session_cached_cursors, inactivity_timeout,\n       max_think_time\nFROM   dba_cpool_info;\n\n-- Start DRCP with configuration\n-- This configures and starts the pool in one command\nEXEC DBMS_CONNECTION_POOL.START_POOL(\n    pool_name              =&gt; 'SYS_DEFAULT_CONNECTION_POOL',\n    minsize                =&gt; 4,       -- minimum pooled server processes\n    maxsize                =&gt; 40,      -- maximum pooled server processes\n    incrsize               =&gt; 2,       -- grow by 2 when demand exceeds current\n    session_cached_cursors =&gt; 20,      -- cursors cached per pooled session\n    inactivity_timeout     =&gt; 300,     -- idle connection timeout (seconds)\n    max_think_time         =&gt; 120,     -- max time client holds a connection (seconds)\n    max_use_session        =&gt; 500000,  -- reuse a server process max N times\n    max_lifetime_session   =&gt; 86400    -- max lifetime of a server process (seconds)\n);\n\n-- Verify DRCP started\nSELECT connection_pool, status, minsize, maxsize, incrsize\nFROM   dba_cpool_info;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.2 \u2014 Modify DRCP Configuration<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Modify existing DRCP configuration\nEXEC DBMS_CONNECTION_POOL.ALTER_PARAM(\n    pool_name   =&gt; 'SYS_DEFAULT_CONNECTION_POOL',\n    minsize     =&gt; 5,\n    maxsize     =&gt; 50,\n    incrsize    =&gt; 5\n);\n\n-- Stop the pool gracefully\nEXEC DBMS_CONNECTION_POOL.STOP_POOL(\n    pool_name =&gt; 'SYS_DEFAULT_CONNECTION_POOL'\n);\n\n-- Stop immediately (drops all active connections)\nEXEC DBMS_CONNECTION_POOL.STOP_POOL(\n    pool_name =&gt; 'SYS_DEFAULT_CONNECTION_POOL',\n    immediate =&gt; TRUE\n);<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.3 \u2014 Connect Using DRCP<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>To use DRCP, clients must connect using a pooled server connection.<\/strong> The connection string must specify <code>SERVER=POOLED<\/code> in the CONNECT_DATA section.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Add DRCP entry to tnsnames.ora\nvi $ORACLE_HOME\/network\/admin\/tnsnames.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># DRCP connection entry\n# SERVER=POOLED tells Oracle to use DRCP pool\nORCL_POOLED =\n  (DESCRIPTION =\n    (ADDRESS =\n      (PROTOCOL = TCP)\n      (HOST     = dbserver01.company.com)\n      (PORT     = 1521)\n    )\n    (CONNECT_DATA =\n      (SERVICE_NAME = ORCL)\n      (SERVER       = POOLED)    -- This is what enables DRCP\n    )\n  )<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Test DRCP connection\nsqlplus hr\/Hr_123@ORCL_POOLED<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.4 \u2014 Monitor DRCP<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Monitor DRCP pool usage\nset linesize 200\nset pagesize 100\ncol connection_pool   for a35\ncol status            for a12\ncol num_open_servers  for 9999\ncol num_busy_servers  for 9999\ncol num_waiting_requests for 9999\n\nSELECT connection_pool,\n       status,\n       num_open_servers,\n       num_busy_servers,\n       num_waiting_requests\nFROM   v$cpool_stats;\n\n-- DRCP statistics per database\nset linesize 200\nset pagesize 100\n\nSELECT num_requests,\n       num_hits,         -- requests served from pool (reused connection)\n       num_misses,       -- new connection had to be created\n       num_waits,        -- requests that had to wait for a server\n       ROUND(num_hits*100\/NULLIF(num_requests,0),2) hit_pct\nFROM   v$cpool_stats;<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What to look for:<\/strong> <code>hit_pct<\/code> should be above 90%. High <code>num_misses<\/code> means pool is too small \u2014 increase MAXSIZE. High <code>num_waits<\/code> means all servers are busy \u2014 also increase MAXSIZE.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">9. Oracle Connection Manager (CMAN)<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is CMAN?<\/strong> Oracle Connection Manager is a proxy server that sits between clients and the database. It provides:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Connection multiplexing<\/strong> \u2014 many client connections share fewer network connections to the database (reduces database server overhead)<\/li>\n\n\n\n<li><strong>Access control<\/strong> \u2014 filter connections based on IP, username, or service name<\/li>\n\n\n\n<li><strong>Protocol conversion<\/strong> \u2014 connect clients using one protocol to databases using another<\/li>\n\n\n\n<li><strong>Firewall traversal<\/strong> \u2014 allows Oracle connections through firewalls with minimal port opening<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>When is CMAN used?<\/strong> In large enterprise environments where you have thousands of client connections and want to reduce the connection overhead on the database server. Also used in DMZ environments where a database is in a secure zone and clients are in a less secure zone \u2014 CMAN sits at the boundary and filters connections.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.1 \u2014 Install CMAN Software<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>CMAN comes with Oracle Database software but is typically installed on a separate dedicated server<\/strong> \u2014 not on the database server itself. It acts as a middle tier.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># CMAN is installed as part of Oracle Database software\n# Verify CMAN binary exists in Oracle Home\nls -lh $ORACLE_HOME\/bin\/cmctl\nls -lh $ORACLE_HOME\/bin\/cmadmin<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.2 \u2014 Create cman.ora Configuration File<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># cman.ora goes in ORACLE_HOME\/network\/admin\/ on the CMAN server\nvi $ORACLE_HOME\/network\/admin\/cman.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------\n# cman.ora \u2014 Oracle Connection Manager Configuration\n# CMAN Server: cmanserver01.company.com\n# Modified: &lt;date&gt; by &lt;DBA name&gt;\n# -------------------------------------------------------\n\n# Define the Connection Manager instance\nCMAN =\n  (CONFIGURATION =\n\n    # Address where CMAN listens for client connections\n    (ADDRESS =\n      (PROTOCOL = TCP)\n      (HOST     = cmanserver01.company.com)\n      (PORT     = 1521)\n    )\n\n    # Parameter section\n    (PARAMETER_LIST =\n\n      # Maximum number of simultaneous connections CMAN will handle\n      (MAX_CONNECTIONS  = 1024)\n\n      # Idle connection timeout in seconds\n      # Closes connections idle for more than this many seconds\n      (IDLE_TIMEOUT     = 0)\n\n      # Session timeout in seconds (0 = no timeout)\n      (SESSION_TIMEOUT  = 0)\n\n      # Number of CMAN gateway processes\n      # More gateways = more parallel connections\n      (MAX_GATEWAY_PROCESSES  = 16)\n      (MIN_GATEWAY_PROCESSES  = 2)\n\n      # Logging\n      (LOG_LEVEL        = USER)\n      (LOG_DIRECTORY    = \/u01\/app\/oracle\/cman\/log)\n\n      # Tracing (disable in production)\n      (TRACE_LEVEL      = OFF)\n      (TRACE_DIRECTORY  = \/u01\/app\/oracle\/cman\/trace)\n\n      # Connection pooling parameters\n      (MAXIMUM_RELAYS           = 512)\n      (CONNECTION_STATISTICS    = YES)\n      (SHOW_TNS_INFO            = YES)\n    )\n\n    # Access Control List -- defines which connections are allowed or denied\n    # Rules are evaluated top to bottom -- first match wins\n    (RULE_LIST =\n\n      # Allow all connections from internal network to ORCL database\n      (RULE =\n        (SRC_HOST    = 192.168.1.0\/24)       -- source IP range\n        (DST_HOST    = dbserver01.company.com) -- destination DB server\n        (SRV         = ORCL)                   -- service name\n        (ACT         = accept)                 -- allow\n      )\n\n      # Allow specific host to connect to any service\n      (RULE =\n        (SRC_HOST    = 10.10.1.50)\n        (DST_HOST    = dbserver01.company.com)\n        (SRV         = *)\n        (ACT         = accept)\n      )\n\n      # Deny all other connections\n      (RULE =\n        (SRC_HOST    = *)\n        (DST_HOST    = *)\n        (SRV         = *)\n        (ACT         = reject)\n      )\n    )\n  )<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.3 \u2014 Start and Manage CMAN<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Start CMAN\nsu - oracle\ncmctl start cman\n\n# Check CMAN status\ncmctl show status\n\n# Show connections currently being handled by CMAN\ncmctl show connections\n\n# Show gateway processes\ncmctl show gateways\n\n# Stop CMAN gracefully\ncmctl stop cman\n\n# Reload CMAN configuration without stopping\ncmctl reload cman<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.4 \u2014 Configure Clients to Connect Through CMAN<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Clients connect to CMAN exactly as they would connect to the database directly \u2014 they use tnsnames.ora with CMAN&#8217;s address.<\/strong> CMAN then forwards the connection to the actual database.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># On CLIENT machines -- update tnsnames.ora to point to CMAN\nvi $ORACLE_HOME\/network\/admin\/tnsnames.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Client connects to CMAN which forwards to actual database\nORCL_VIA_CMAN =\n  (DESCRIPTION =\n    (ADDRESS =\n      (PROTOCOL = TCP)\n      (HOST     = cmanserver01.company.com)  -- CMAN server, not DB server\n      (PORT     = 1521)                       -- CMAN listening port\n    )\n    (CONNECT_DATA =\n      (SERVICE_NAME = ORCL)                  -- actual database service name\n    )\n  )<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">9.5 \u2014 Monitor CMAN Statistics<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Show detailed connection statistics\ncmctl show status -con_name all\n\n# Show version\ncmctl show version\n\n# Show parameters\ncmctl show parameters<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">10. SSL\/TLS for Oracle Connections<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is SSL\/TLS for Oracle?<\/strong> Configuring SSL\/TLS (TCPS protocol) encrypts the network connection between Oracle client and server using certificates. It provides:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Encryption in transit<\/strong> \u2014 all data between client and server is encrypted<\/li>\n\n\n\n<li><strong>Server authentication<\/strong> \u2014 client verifies it is connecting to the correct server<\/li>\n\n\n\n<li><strong>Client authentication<\/strong> \u2014 server verifies the client&#8217;s identity (optional \u2014 mutual authentication)<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>SSL\/TLS vs Native Network Encryption (NNE):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>NNE (sqlnet.ora ENCRYPTION) \u2014 simpler to configure, no certificates needed, Oracle-proprietary<\/li>\n\n\n\n<li>SSL\/TLS (TCPS) \u2014 industry standard, uses certificates, required for compliance with some standards (PCI-DSS etc.)<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> SSL\/TLS configuration requires creating a wallet (Oracle Wallet or Java KeyStore) containing the certificate. The wallet must be present on BOTH the server and client.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.1 \u2014 Create Oracle Wallet for SSL<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Two types of certificates:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Self-signed certificate<\/strong> \u2014 created by yourself. Free, easy. Not trusted by external clients without manually importing it. Use for internal connections.<\/li>\n\n\n\n<li><strong>CA-signed certificate<\/strong> \u2014 issued by a Certificate Authority (VeriSign, DigiCert etc.). Trusted automatically by clients. Use for external-facing connections.<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Create wallet directory on SERVER\nsu - oracle\nmkdir -p \/u01\/app\/oracle\/wallet\/server\nchmod 700 \/u01\/app\/oracle\/wallet\/server\n\n# Create an Oracle Wallet using orapki\n# This creates an empty wallet with the wallet password\norapki wallet create \\\n    -wallet \/u01\/app\/oracle\/wallet\/server \\\n    -pwd WalletPwd_123 \\\n    -auto_login\n\n# Verify wallet was created\nls -lh \/u01\/app\/oracle\/wallet\/server\/\n# Expected files: cwallet.sso, ewallet.p12<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.2 \u2014 Generate Self-Signed Certificate<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Add a self-signed certificate to the server wallet\n# -keysize 2048 = RSA 2048-bit key (minimum recommended)\n# -validity 3650 = valid for 10 years (3650 days)\norapki wallet add \\\n    -wallet \/u01\/app\/oracle\/wallet\/server \\\n    -pwd WalletPwd_123 \\\n    -dn \"CN=dbserver01,OU=DBTeam,O=Company,C=US\" \\\n    -keysize 2048 \\\n    -self_signed \\\n    -validity 3650\n\n# View wallet contents -- confirm certificate was added\norapki wallet display \\\n    -wallet \/u01\/app\/oracle\/wallet\/server \\\n    -pwd WalletPwd_123<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.3 \u2014 Export Certificate for Client Import<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Export the server certificate so clients can trust it\norapki wallet export \\\n    -wallet \/u01\/app\/oracle\/wallet\/server \\\n    -pwd WalletPwd_123 \\\n    -dn \"CN=dbserver01,OU=DBTeam,O=Company,C=US\" \\\n    -cert \/tmp\/server_cert.crt\n\n# The server_cert.crt file must be copied to client machines\n# and imported into their wallets<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.4 \u2014 Configure Listener for SSL (TCPS)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Edit listener.ora to add TCPS address\nvi $ORACLE_HOME\/network\/admin\/listener.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Add SSL\/TLS listener configuration\nLISTENER =\n  (DESCRIPTION_LIST =\n    (DESCRIPTION =\n      # Regular TCP on 1521 (keep for backward compatibility)\n      (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver01.company.com)(PORT = 1521))\n    )\n    (DESCRIPTION =\n      # SSL\/TLS on 2484 (standard TCPS port)\n      (ADDRESS = (PROTOCOL = TCPS)(HOST = dbserver01.company.com)(PORT = 2484))\n    )\n  )\n\nSID_LIST_LISTENER =\n  (SID_LIST =\n    (SID_DESC =\n      (GLOBAL_DBNAME = ORCL)\n      (ORACLE_HOME   = \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1)\n      (SID_NAME      = ORCL)\n    )\n  )\n\n# SSL wallet location for LISTENER\nSSL_CLIENT_AUTHENTICATION = FALSE   -- TRUE for mutual (2-way) SSL\nWALLET_LOCATION =\n  (SOURCE =\n    (METHOD = FILE)\n    (METHOD_DATA =\n      (DIRECTORY = \/u01\/app\/oracle\/wallet\/server)\n    )\n  )<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.5 \u2014 Configure sqlnet.ora for SSL on Server<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>vi $ORACLE_HOME\/network\/admin\/sqlnet.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Add SSL configuration to server sqlnet.ora\n\n# SSL wallet location\nWALLET_LOCATION =\n  (SOURCE =\n    (METHOD = FILE)\n    (METHOD_DATA =\n      (DIRECTORY = \/u01\/app\/oracle\/wallet\/server)\n    )\n  )\n\n# SSL version to use\n# TLSv1.2 is current minimum. TLSv1.3 if all clients support it\nSSL_VERSION = 1.2\n\n# SSL cipher suites -- list in preference order\n# Use strong ciphers only\nSSL_CIPHER_SUITES =\n  (SSL_RSA_WITH_AES_256_CBC_SHA256,\n   SSL_RSA_WITH_AES_128_CBC_SHA256,\n   SSL_RSA_WITH_AES_256_CBC_SHA)\n\n# SSL_CLIENT_AUTHENTICATION controls 2-way (mutual) SSL\n# FALSE = server-only authentication (most common)\n# TRUE  = both client and server must present certificates\nSSL_CLIENT_AUTHENTICATION = FALSE\n\n# SQLNET authentication for TCPS connections\nSQLNET.AUTHENTICATION_SERVICES = (TCPS, NTS, BEQ)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.6 \u2014 Configure Client for SSL<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># On CLIENT machine -- create client wallet\nmkdir -p \/u01\/app\/oracle\/wallet\/client\nchmod 700 \/u01\/app\/oracle\/wallet\/client\n\n# Create client wallet\norapki wallet create \\\n    -wallet \/u01\/app\/oracle\/wallet\/client \\\n    -pwd ClientWallet_123 \\\n    -auto_login\n\n# Import the server certificate into client wallet\n# (server_cert.crt was copied from server in Section 10.3)\norapki wallet add \\\n    -wallet \/u01\/app\/oracle\/wallet\/client \\\n    -pwd ClientWallet_123 \\\n    -trusted_cert \\\n    -cert \/tmp\/server_cert.crt\n\n# Verify client wallet contains the trusted certificate\norapki wallet display \\\n    -wallet \/u01\/app\/oracle\/wallet\/client \\\n    -pwd ClientWallet_123<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.7 \u2014 Configure Client sqlnet.ora for SSL<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>vi $ORACLE_HOME\/network\/admin\/sqlnet.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Client sqlnet.ora SSL configuration\n\n# Client wallet location\nWALLET_LOCATION =\n  (SOURCE =\n    (METHOD = FILE)\n    (METHOD_DATA =\n      (DIRECTORY = \/u01\/app\/oracle\/wallet\/client)\n    )\n  )\n\nSSL_VERSION = 1.2\n\nSSL_CIPHER_SUITES =\n  (SSL_RSA_WITH_AES_256_CBC_SHA256,\n   SSL_RSA_WITH_AES_128_CBC_SHA256)\n\nSSL_CLIENT_AUTHENTICATION = FALSE\n\n# Enable TCPS in naming\nNAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)\n\nSQLNET.AUTHENTICATION_SERVICES = (TCPS, NTS, BEQ)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.8 \u2014 Configure tnsnames.ora for SSL Connection<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>vi $ORACLE_HOME\/network\/admin\/tnsnames.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># SSL\/TLS connection entry\n# PROTOCOL = TCPS (not TCP) for SSL\n# PORT = 2484 (standard TCPS port)\nORCL_SSL =\n  (DESCRIPTION =\n    (ADDRESS =\n      (PROTOCOL = TCPS)\n      (HOST     = dbserver01.company.com)\n      (PORT     = 2484)\n    )\n    (CONNECT_DATA =\n      (SERVICE_NAME = ORCL)\n    )\n    (SECURITY =\n      # Client wallet location\n      (MY_WALLET_DIRECTORY = \/u01\/app\/oracle\/wallet\/client)\n      # Server certificate DN -- client verifies server presents this DN\n      (SSL_SERVER_CERT_DN  = \"CN=dbserver01,OU=DBTeam,O=Company,C=US\")\n    )\n  )<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.9 \u2014 Restart Listener and Test SSL Connection<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Restart listener to pick up SSL configuration\nlsnrctl stop\nlsnrctl start\nlsnrctl status\n\n# Verify TCPS endpoint is listening\nlsnrctl status | grep -i \"tcps\\|2484\"\n\n# Test SSL connection\ntnsping ORCL_SSL\nsqlplus system\/Oracle_123@ORCL_SSL\n\n# Verify connection is using SSL\nsqlplus system\/Oracle_123@ORCL_SSL<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Inside the SQL*Plus session -- confirm SSL is being used\nSELECT sys_context('USERENV','NETWORK_PROTOCOL') network_protocol,\n       sys_context('USERENV','IDENTIFICATION_TYPE') id_type\nFROM   dual;\n-- network_protocol should show: tcps<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.10 \u2014 Verify SSL Certificate Details<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Check server certificate expiry\norapki wallet display \\\n    -wallet \/u01\/app\/oracle\/wallet\/server \\\n    -pwd WalletPwd_123\n\n# Using openssl to check certificate\nopenssl s_client \\\n    -connect dbserver01.company.com:2484 \\\n    -showcerts\n\n# Check certificate expiry date\nopenssl s_client -connect dbserver01.company.com:2484 <strong>2<\/strong>&gt;\/dev\/null | \\\n    openssl x509 -noout -dates<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Set a calendar reminder for SSL certificate expiry. An expired SSL certificate causes ALL SSL-based connections to fail immediately. For a self-signed certificate with 10-year validity this is less of a concern, but for CA-signed certificates that expire in 1-2 years it is critical.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">11. Network Troubleshooting Guide<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Use this section when you get a &#8220;cannot connect to database&#8221; call. Work through it in order.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">11.1 \u2014 Connection Troubleshooting Decision Tree<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>\"Cannot connect to Oracle database\"\n              \u2502\n    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n    \u2502 Can you ping the    \u2502\n    \u2502 DB server?          \u2502\n    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n         NO \u2500\u2500\u253c\u2500\u2500\u25ba Network issue -- contact network team\n              \u2502\n         YES \u2500\u2500\u25ba\n    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n    \u2502 Is the listener     \u2502\n    \u2502 running?            \u2502\n    \u2502 lsnrctl status      \u2502\n    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n         NO \u2500\u2500\u253c\u2500\u2500\u25ba Start listener: lsnrctl start\n              \u2502\n         YES \u2500\u2500\u25ba\n    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n    \u2502 Does tnsping work?  \u2502\n    \u2502 tnsping ORCL        \u2502\n    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n         NO \u2500\u2500\u253c\u2500\u2500\u25ba Check tnsnames.ora, TNS_ADMIN, NAMES.DIRECTORY_PATH\n              \u2502\n         YES \u2500\u2500\u25ba\n    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n    \u2502 Is DB open?         \u2502\n    \u2502 SELECT status FROM  \u2502\n    \u2502 v$instance          \u2502\n    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n         NO \u2500\u2500\u253c\u2500\u2500\u25ba Start database: STARTUP\n              \u2502\n         YES \u2500\u2500\u25ba\n    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n    \u2502 Is service          \u2502\n    \u2502 registered?         \u2502\n    \u2502 lsnrctl services    \u2502\n    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n         NO \u2500\u2500\u253c\u2500\u2500\u25ba ALTER SYSTEM REGISTER; or check LOCAL_LISTENER\n              \u2502\n         YES \u2500\u2500\u25ba\n    Check credentials, max sessions, firewall<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">11.2 \u2014 Common Connection Errors and Fixes<\/h4>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Error<\/th><th>Likely Cause<\/th><th>Fix<\/th><\/tr><\/thead><tbody><tr><td>ORA-12154: TNS could not resolve<\/td><td>tnsnames.ora entry missing or wrong name<\/td><td>Check tnsnames.ora, check TNS_ADMIN<\/td><\/tr><tr><td>ORA-12541: No listener<\/td><td>Listener not running or wrong port<\/td><td>lsnrctl start, check port<\/td><\/tr><tr><td>ORA-12514: Listener does not know service<\/td><td>Service not registered with listener<\/td><td>ALTER SYSTEM REGISTER, check SID_LIST<\/td><\/tr><tr><td>ORA-12505: Listener does not know SID<\/td><td>Wrong SID in connect string<\/td><td>Use SERVICE_NAME not SID in tnsnames<\/td><\/tr><tr><td>ORA-01017: Invalid username\/password<\/td><td>Wrong credentials<\/td><td>Check username\/password<\/td><\/tr><tr><td>ORA-12170: Connect timeout<\/td><td>Network slow or firewall<\/td><td>Check firewall, increase SQLNET.OUTBOUND_CONNECT_TIMEOUT<\/td><\/tr><tr><td>ORA-12535: Operation timed out<\/td><td>Server unreachable or firewall<\/td><td>Ping server, check firewall rules<\/td><\/tr><tr><td>ORA-28000: Account locked<\/td><td>Too many failed logins<\/td><td>ALTER USER username ACCOUNT UNLOCK<\/td><\/tr><tr><td>ORA-02391: Exceeded max sessions<\/td><td>Max sessions parameter hit<\/td><td>Check sessions parameter, kill idle sessions<\/td><\/tr><tr><td>ORA-12560: Protocol adapter error<\/td><td>ORACLE_SID not set or wrong<\/td><td>Set ORACLE_SID correctly<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">11.3 \u2014 Common Troubleshooting Commands<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Check if listener is running\nps -ef | grep tnslsnr | grep -v grep\n\n# Check which port listener is on\nss -tlnp | grep 1521\n\n# Test TCP connectivity to listener port\ntelnet dbserver01.company.com 1521\n# OR (if telnet not available)\nnc -zv dbserver01.company.com 1521\n\n# Test TNS resolution\ntnsping ORCL\n\n# Check TNS_ADMIN being used\necho $TNS_ADMIN\n\n# Find which tnsnames.ora is being used\ntnsping ORCL | head -3\n\n# Check listener log for specific error\ngrep \"TNS-12514\" $ORACLE_HOME\/network\/log\/listener.log | tail -20\n\n# Check firewall rules (as root)\niptables -L -n | grep 1521\nfirewall-cmd --list-ports\n\n# Check SELinux is not blocking Oracle\ngetenforce\n# If ENFORCING -- check audit log\ngrep oracle \/var\/log\/audit\/audit.log | tail -20<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">11.4 \u2014 Enable Network Tracing for Deep Troubleshooting<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Server-side tracing -- modify sqlnet.ora temporarily\nvi $ORACLE_HOME\/network\/admin\/sqlnet.ora<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Add these lines temporarily for troubleshooting\nTRACE_LEVEL_SERVER      = ADMIN\nTRACE_DIRECTORY_SERVER  = \/tmp\/oracle_traces\nTRACE_FILE_SERVER       = svr_trace<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Create trace directory\nmkdir -p \/tmp\/oracle_traces\nchmod 777 \/tmp\/oracle_traces\n\n# Reload listener\nlsnrctl reload\n\n# Reproduce the connection problem\n# Collect trace files\nls -lh \/tmp\/oracle_traces\/\n\n# Read the trace file\ncat \/tmp\/oracle_traces\/svr_trace*.trc | grep -E \"error|TNS|ORA-\" | head -50\n\n# IMPORTANT: Remove tracing after collecting\n# Revert sqlnet.ora and reload listener<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">12. Post-Configuration Checks<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Run all post-configuration checks after any network file change. A mistake in listener.ora or tnsnames.ora will break all connections.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">12.1 \u2014 Verify Listener Status<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>lsnrctl status\n\n# Check specific listener\nlsnrctl status LISTENER\n\n# Verify all expected services are registered\nlsnrctl services | grep -i \"service\\|instance\\|handler\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">12.2 \u2014 Verify All TNS Entries Resolve<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Test each entry in tnsnames.ora\ntnsping ORCL\ntnsping ORCL_STBY\ntnsping RACDB\ntnsping PDB1\n\n# All should return: OK (N msec)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">12.3 \u2014 Verify Actual Connections Work<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Test connection with each TNS entry\nsqlplus system\/Oracle_123@ORCL\nsqlplus system\/Oracle_123@ORCL_STBY\nsqlplus system\/Oracle_123@RACDB<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">12.4 \u2014 Verify sqlnet.ora Parameters<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Check sqlnet.ora is syntactically correct\n# (No built-in validator -- check by attempting connection and reviewing log)\n\n# Verify naming methods\ngrep NAMES.DIRECTORY_PATH $ORACLE_HOME\/network\/admin\/sqlnet.ora\n\n# Verify DCD is configured\ngrep SQLNET.EXPIRE_TIME $ORACLE_HOME\/network\/admin\/sqlnet.ora<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">12.5 \u2014 Check Network Configuration Inside Database<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\nset linesize 200\nset pagesize 100\ncol name  for a35\ncol value for a60\n\n-- Check listener-related parameters\nSELECT name, value\nFROM   v$parameter\nWHERE  name IN (\n    'local_listener',\n    'remote_listener',\n    'dispatchers',\n    'shared_servers',\n    'max_shared_servers',\n    'db_domain'\n)\nORDER BY name;\n\n-- Check if dispatchers are running (for shared server)\nSELECT name, status, dispatched, circuit, idle, busy\nFROM   v$dispatcher;\n\n-- Check shared server sessions if configured\nSELECT * FROM v$shared_server;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">12.6 \u2014 Verify SCAN (RAC Only)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>su - grid\n\n# Full SCAN check\n$ORACLE_HOME\/bin\/srvctl config scan\n$ORACLE_HOME\/bin\/srvctl status scan\n$ORACLE_HOME\/bin\/srvctl status scan_listener\n\n# Verify SCAN resolves correctly\nnslookup rac-scan.company.com\n\n# Test connection through SCAN\nsqlplus system\/Oracle_123@rac-scan.company.com:1521\/RACDB<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">12.7 \u2014 Verify DRCP (If Configured)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\n-- DRCP pool must be ACTIVE\nSELECT connection_pool, status, num_open_servers, num_busy_servers\nFROM   v$cpool_stats;\n\n-- Test DRCP connection\nCONNECT hr\/Hr_123@ORCL_POOLED<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">12.8 \u2014 Verify SSL (If Configured)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># TCPS endpoint must be in listener status\nlsnrctl status | grep -i tcps\n\n# Test SSL connection\ntnsping ORCL_SSL\nsqlplus system\/Oracle_123@ORCL_SSL<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Verify SSL is active in session\nSELECT sys_context('USERENV','NETWORK_PROTOCOL') network_protocol\nFROM   dual;\n-- Must show: tcps<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">13. Quick Reference Card<\/h3>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Task<\/th><th>Command<\/th><\/tr><\/thead><tbody><tr><td>Start listener<\/td><td><code>lsnrctl start<\/code><\/td><\/tr><tr><td>Stop listener<\/td><td><code>lsnrctl stop<\/code><\/td><\/tr><tr><td>Check listener status<\/td><td><code>lsnrctl status<\/code><\/td><\/tr><tr><td>Reload listener<\/td><td><code>lsnrctl reload<\/code><\/td><\/tr><tr><td>Check registered services<\/td><td><code>lsnrctl services<\/code><\/td><\/tr><tr><td>Force DB registration<\/td><td><code>ALTER SYSTEM REGISTER;<\/code><\/td><\/tr><tr><td>Test TNS resolution<\/td><td><code>tnsping ORCL<\/code><\/td><\/tr><tr><td>Test connection<\/td><td><code>sqlplus user\/pwd@ORCL<\/code><\/td><\/tr><tr><td>Easy Connect<\/td><td><code>sqlplus user\/pwd@host:port\/service<\/code><\/td><\/tr><tr><td>Check TNS_ADMIN<\/td><td><code>echo $TNS_ADMIN<\/code><\/td><\/tr><tr><td>Find tnsnames.ora location<\/td><td><code>tnsping ORCL | head -3<\/code><\/td><\/tr><tr><td>Check LOCAL_LISTENER<\/td><td><code>SHOW PARAMETER local_listener;<\/code><\/td><\/tr><tr><td>Set LOCAL_LISTENER<\/td><td><code>ALTER SYSTEM SET LOCAL_LISTENER='...' SCOPE=BOTH;<\/code><\/td><\/tr><tr><td>View listener log<\/td><td><code>tail -100 $ORACLE_HOME\/network\/log\/listener.log<\/code><\/td><\/tr><tr><td>Filter listener errors<\/td><td><code>grep TNS- listener.log | tail -20<\/code><\/td><\/tr><tr><td>Rotate listener log<\/td><td><code>lsnrctl set log_status off; mv listener.log listener_old.log; lsnrctl set log_status on<\/code><\/td><\/tr><tr><td>SCAN config<\/td><td><code>srvctl config scan<\/code><\/td><\/tr><tr><td>SCAN status<\/td><td><code>srvctl status scan<\/code><\/td><\/tr><tr><td>SCAN listener status<\/td><td><code>srvctl status scan_listener<\/code><\/td><\/tr><tr><td>Start SCAN listener<\/td><td><code>srvctl start scan_listener<\/code><\/td><\/tr><tr><td>Stop SCAN listener<\/td><td><code>srvctl stop scan_listener<\/code><\/td><\/tr><tr><td>Relocate SCAN listener<\/td><td><code>srvctl relocate scan_listener -scannumber 1 -n racnode2<\/code><\/td><\/tr><tr><td>Start DRCP<\/td><td><code>EXEC DBMS_CONNECTION_POOL.START_POOL(pool_name=&gt;'SYS_DEFAULT_CONNECTION_POOL',...);<\/code><\/td><\/tr><tr><td>Stop DRCP<\/td><td><code>EXEC DBMS_CONNECTION_POOL.STOP_POOL(pool_name=&gt;'SYS_DEFAULT_CONNECTION_POOL');<\/code><\/td><\/tr><tr><td>Monitor DRCP<\/td><td><code>SELECT connection_pool,status,num_open_servers,num_busy_servers FROM v$cpool_stats;<\/code><\/td><\/tr><tr><td>Start CMAN<\/td><td><code>cmctl start cman<\/code><\/td><\/tr><tr><td>Stop CMAN<\/td><td><code>cmctl stop cman<\/code><\/td><\/tr><tr><td>CMAN status<\/td><td><code>cmctl show status<\/code><\/td><\/tr><tr><td>CMAN connections<\/td><td><code>cmctl show connections<\/code><\/td><\/tr><tr><td>Create wallet<\/td><td><code>orapki wallet create -wallet \/path -pwd WalletPwd -auto_login<\/code><\/td><\/tr><tr><td>Add self-signed cert<\/td><td><code>orapki wallet add -wallet \/path -pwd WalletPwd -dn \"CN=...\" -self_signed -validity 3650<\/code><\/td><\/tr><tr><td>Display wallet<\/td><td><code>orapki wallet display -wallet \/path -pwd WalletPwd<\/code><\/td><\/tr><tr><td>Export certificate<\/td><td><code>orapki wallet export -wallet \/path -pwd WalletPwd -dn \"CN=...\" -cert \/tmp\/cert.crt<\/code><\/td><\/tr><tr><td>Import trusted cert<\/td><td><code>orapki wallet add -wallet \/path -pwd WalletPwd -trusted_cert -cert \/tmp\/cert.crt<\/code><\/td><\/tr><tr><td>Test SSL port<\/td><td><code>nc -zv dbserver01 2484<\/code><\/td><\/tr><tr><td>Verify SSL in session<\/td><td><code>SELECT sys_context('USERENV','NETWORK_PROTOCOL') FROM dual;<\/code><\/td><\/tr><tr><td>Check cert expiry<\/td><td><code>openssl s_client -connect host:2484 2&gt;\/dev\/null | openssl x509 -noout -dates<\/code><\/td><\/tr><tr><td>Check firewall port<\/td><td><code>ss -tlnp | grep 1521<\/code><\/td><\/tr><tr><td>Test port open<\/td><td><code>nc -zv dbserver01.company.com 1521<\/code><\/td><\/tr><tr><td>MOS Oracle Net Guide<\/td><td>Doc ID 1386821.1<\/td><\/tr><tr><td>MOS SCAN Configuration<\/td><td>Doc ID 2121366.1<\/td><\/tr><tr><td>MOS SSL\/TLS for Oracle<\/td><td>Doc ID 207303.1<\/td><\/tr><tr><td>MOS DRCP Configuration<\/td><td>Doc ID 1539645.1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">This SOP covers everything you need to manage Oracle Network and Connectivity on Linux without referring to any other source. Always keep tnsnames.ora and listener.ora backed up before making changes, always reload the listener after listener.ora changes rather than restarting to avoid dropping active connections, always use SERVICE_NAME instead of SID in tnsnames.ora for better HA and load balancing support, configure SQLNET.EXPIRE_TIME on all production servers to prevent ghost session accumulation, and always test SSL certificate expiry dates proactively before they cause outages.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A complete production-ready SOP for Oracle Network and Connectivity administration on Linux. Covers tnsnames.ora, listener.ora, sqlnet.ora management, SCAN listener configuration in RAC, connection pooling with DRCP, Oracle Connection Manager (CMAN) setup, and SSL\/TLS for Oracle connections \u2014 with real commands, expected outputs, and consultant-level notes for both standard OFA and enterprise custom path conventions. 1. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5806,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"googlesitekit_rrm_CAowu461DA:productID":"","footnotes":""},"categories":[1534],"tags":[],"class_list":["post-5805","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle-sop"],"_links":{"self":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/comments?post=5805"}],"version-history":[{"count":1,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5805\/revisions"}],"predecessor-version":[{"id":5807,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5805\/revisions\/5807"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media\/5806"}],"wp:attachment":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media?parent=5805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/categories?post=5805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/tags?post=5805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}