{"id":5746,"date":"2026-07-11T09:53:40","date_gmt":"2026-07-11T04:23:40","guid":{"rendered":"https:\/\/w3buddy.com\/?p=5746"},"modified":"2026-07-19T22:17:42","modified_gmt":"2026-07-19T16:47:42","slug":"oracle-19c-installation","status":"publish","type":"post","link":"https:\/\/w3buddy.com\/blog\/oracle-19c-installation\/","title":{"rendered":"Oracle 19c Installation"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A complete production-ready SOP for installing Oracle Database 19c on Linux from scratch. Covers pre-checks, OS configuration, kernel parameters, OS user setup, silent installation, listener configuration, database creation via DBCA, auto-startup with systemd, and full post-installation validation \u2014 with real commands, expected outputs, and consultant-level notes for both standard OFA and enterprise custom path conventions.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SECTION 0 \u2014 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 base + latest RU)<\/td><\/tr><tr><td>OS<\/td><td>Oracle Linux 7.x \/ RHEL 7.x or 8.x<\/td><\/tr><tr><td>Install Type<\/td><td>Single Instance (Non-RAC)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 2660755.1 (19c Install on Linux)<\/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\">SECTION 0.1 \u2014 PATH CONVENTIONS \u2014 READ BEFORE ANYTHING ELSE<\/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> The very first thing you must confirm before starting any installation is which <strong>directory path convention<\/strong> the company follows. Never assume. Check with your lead or look at existing DB servers in the environment.<\/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\"><strong>Why does path convention matter?<\/strong> Every Oracle binary, every config file, every startup script, every Data Guard parameter, every OEM agent \u2014 all reference ORACLE_HOME and ORACLE_BASE. If you install in the wrong location, you will either conflict with an existing installation or create an inconsistency that causes problems during patching and Data Guard setup later.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Convention A \u2014 Standard OFA (Oracle Flexible Architecture)<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">OFA is Oracle&#8217;s own recommended standard. Most Oracle documentation and MOS notes use OFA paths. Common in environments set up by Oracle consultants or following Oracle best practices.<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Item<\/th><th>Path<\/th><\/tr><\/thead><tbody><tr><td>Oracle Base<\/td><td>\/u01\/app\/oracle<\/td><\/tr><tr><td>Oracle Home (Primary DB)<\/td><td>\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1<\/td><\/tr><tr><td>Oracle Home (Standby DB)<\/td><td>Same path \u2014 but on a <strong>separate standby server<\/strong><\/td><\/tr><tr><td>oraInventory<\/td><td>\/u01\/app\/oraInventory<\/td><\/tr><tr><td>Data files<\/td><td>\/u01\/app\/oracle\/oradata<\/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\"><strong>Convention B \u2014 Enterprise Custom Style<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Many large enterprises (banks, telecom companies, financial institutions) use a shorter, cleaner custom path. The key difference here is that the <strong>standby server gets a differently named ORACLE_HOME<\/strong> (<code>19.31Standby<\/code> vs <code>19.31<\/code>). This is intentional \u2014 it allows you to patch the primary and standby ORACLE_HOME directories independently, which is the foundation of <strong>rolling patching with Oracle Data Guard<\/strong>. This is a mature, production-proven approach.<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Item<\/th><th>Path<\/th><\/tr><\/thead><tbody><tr><td>Oracle Base<\/td><td>\/oracle<\/td><\/tr><tr><td>Oracle Home (Primary DB)<\/td><td>\/oracle\/RDBMS\/19.31<\/td><\/tr><tr><td>Oracle Home (Standby DB)<\/td><td>\/oracle\/RDBMS\/19.31Standby <em>(on standby server)<\/em><\/td><\/tr><tr><td>oraInventory<\/td><td>\/oracle\/oraInventory<\/td><\/tr><tr><td>Data files<\/td><td>\/oracle\/oradata<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>How to use this SOP with both conventions:<\/strong> All steps and commands in this SOP are written using <strong>Convention A paths<\/strong>. Wherever you see a path like <code>\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1<\/code>, simply substitute your company&#8217;s actual path. The commands, parameters, and logic are <strong>100% identical<\/strong> \u2014 only the directory paths change.<\/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\">SECTION 1 \u2014 PRE-INSTALLATION 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\"><strong>IMPORTANT:<\/strong> Never skip pre-checks even if you are in a hurry. A missed kernel parameter or a missing OS package will cause the installer to fail mid-way. Recovering from a half-complete installation is messy and time-consuming. 15 minutes on pre-checks saves 2 hours of troubleshooting.<\/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\"><strong>Run all pre-checks as the <code>oracle<\/code> OS user<\/strong> unless a specific step says to run as <code>root<\/code>.<\/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\">1.1 \u2014 Check OS Version &amp; Architecture<\/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\"><strong>Why:<\/strong> Oracle 19c is only certified on specific OS versions. Running on an unsupported OS version can cause unexpected issues and Oracle Support will not help you troubleshoot until you are on a certified platform.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Shows OS name, version, and release details\ncat \/etc\/os-release\n\n# Must return x86_64 \u2014 Oracle 19c does not support 32-bit OS\nuname -m\n\n# Shows exact kernel version \u2014 useful for MOS support tickets\nuname -r<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> OS must be Oracle Linux 6\/7\/8 or RHEL 6\/7\/8. Architecture must be <code>x86_64<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">1.2 \u2014 Check Available Disk Space<\/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\"><strong>Why:<\/strong> Oracle 19c ORACLE_HOME needs a minimum of 7.5 GB. The <code>\/tmp<\/code> directory is used by the installer during extraction and setup. If either is insufficient, the installer will abort.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Shows disk usage for ALL mounted filesystems in human-readable format\n# -h = human readable, -P = POSIX format (one line per filesystem, no wrapping)\ndf -hP\n\n# Specifically check \/tmp \u2014 installer needs at least 1GB free here\ndf -hP \/tmp\n\n# Shows RAM and swap in megabytes\n# Swap should ideally equal RAM size (up to 16GB RAM)\nfree -m<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>\/u01<\/code> or <code>\/oracle<\/code> mount \u2192 minimum <strong>7.5 GB free<\/strong><\/li>\n\n\n\n<li><code>\/tmp<\/code> \u2192 minimum <strong>1 GB free<\/strong><\/li>\n\n\n\n<li>Swap \u2192 minimum <strong>1.5 GB<\/strong><\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>IMPORTANT:<\/strong> If <code>\/tmp<\/code> has less than 1 GB free, do NOT start the installer. Either clean up <code>\/tmp<\/code> or before running the installer set these two variables to redirect the installer&#8217;s temp usage:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>export TMP=\/u01\/tmp\nexport TMPDIR=\/u01\/tmp\nmkdir -p \/u01\/tmp<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">1.3 \u2014 Check RAM<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why:<\/strong> Oracle 19c requires a minimum of 1 GB RAM but in practice you need at least 2 GB for a usable installation. This also determines how much SGA\/PGA you can allocate during database creation.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Shows total physical memory in KB \u2014 divide by 1024 to get MB\ngrep MemTotal \/proc\/meminfo\n\n# Shows total swap space\ngrep SwapTotal \/proc\/meminfo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> <code>MemTotal<\/code> should be at least 2,097,152 KB (2 GB).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">1.4 \u2014 Check Required OS Packages<\/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\"><strong>Why:<\/strong> Oracle binaries are compiled against specific Linux libraries. If these packages are missing, the Oracle installer either fails immediately or the database crashes later with library errors. This is one of the most common causes of failed installs on freshly built servers.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Checks all required packages in one command\n# Any line ending in \"not installed\" means that package is missing\nrpm -q binutils \\\n        compat-libcap1 \\\n        compat-libstdc++-33 \\\n        gcc \\\n        gcc-c++ \\\n        glibc \\\n        glibc-devel \\\n        ksh \\\n        libaio \\\n        libaio-devel \\\n        libgcc \\\n        libstdc++ \\\n        libstdc++-devel \\\n        libXi \\\n        libXtst \\\n        make \\\n        sysstat \\\n        elfutils-libelf-devel \\\n        fontconfig-devel \\\n        unzip <strong>2<\/strong>&gt;<strong>&amp;1<\/strong> | grep \"not installed\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> Ideally no output at all (meaning all packages are installed). If any package shows <code>not installed<\/code>, install it now.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Install ALL required packages in one command (run as root)\n# -y flag automatically answers yes to all prompts\nyum install -y binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ \\\nglibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel \\\nlibXi libXtst make sysstat elfutils-libelf-devel fontconfig-devel unzip<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">1.5 \u2014 Check Kernel Parameters<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why:<\/strong> Oracle uses shared memory, semaphores, and network buffers extensively. Linux kernel parameters control the maximum limits for these resources. If the limits are too low, Oracle will either fail to start or perform poorly under load. These must be set BEFORE installation.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Displays current values of all relevant kernel parameters\n\/sbin\/sysctl -a | grep -E \\\n\"kernel.shmall|kernel.shmmax|kernel.shmmni|\\\nkernel.sem|fs.file-max|\\\nnet.ipv4.ip_local_port_range|\\\nnet.core.rmem_default|net.core.rmem_max|\\\nnet.core.wmem_default|net.core.wmem_max\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Compare each output value against this table:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Parameter<\/th><th>What it controls<\/th><th>Minimum Required<\/th><\/tr><\/thead><tbody><tr><td>kernel.shmall<\/td><td>Total shared memory pages system-wide<\/td><td>1073741824<\/td><\/tr><tr><td>kernel.shmmax<\/td><td>Maximum size of single shared memory segment<\/td><td>4398046511104<\/td><\/tr><tr><td>kernel.shmmni<\/td><td>Maximum number of shared memory segments<\/td><td>4096<\/td><\/tr><tr><td>kernel.sem<\/td><td>Semaphore limits (4 values: semmsl semmns semopm semmni)<\/td><td>250 32000 100 128<\/td><\/tr><tr><td>fs.file-max<\/td><td>Maximum number of open file handles system-wide<\/td><td>6815744<\/td><\/tr><tr><td>net.ipv4.ip_local_port_range<\/td><td>Local port range for outbound connections<\/td><td>9000 65500<\/td><\/tr><tr><td>net.core.rmem_default<\/td><td>Default socket receive buffer size<\/td><td>262144<\/td><\/tr><tr><td>net.core.rmem_max<\/td><td>Maximum socket receive buffer size<\/td><td>4194304<\/td><\/tr><tr><td>net.core.wmem_default<\/td><td>Default socket send buffer size<\/td><td>262144<\/td><\/tr><tr><td>net.core.wmem_max<\/td><td>Maximum socket send buffer size<\/td><td>1048576<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>IMPORTANT:<\/strong> If ANY value is below the minimum, proceed to Section 2.4 to set them correctly before installation.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">1.6 \u2014 Check OS User Limits for oracle User<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why:<\/strong> Linux limits how many files and processes each user can open\/spawn. Oracle processes open hundreds of files and spawn many background processes. If these limits are too low, Oracle will throw <code>ORA-27123<\/code>, <code>ORA-27300<\/code>, or <code>Too many open files<\/code> errors during startup or under load.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Shows all current resource limits for the oracle user\n# Run this as oracle user \u2014 limits are per-user\nsu - oracle -c \"ulimit -a\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Check these specific values in the output:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Limit<\/th><th>What it controls<\/th><th>Required Soft<\/th><th>Required Hard<\/th><\/tr><\/thead><tbody><tr><td>open files<\/td><td>Max number of open file descriptors<\/td><td>1024<\/td><td>65536<\/td><\/tr><tr><td>max user processes<\/td><td>Max number of processes oracle user can spawn<\/td><td>2047<\/td><td>16384<\/td><\/tr><tr><td>stack size (kbytes)<\/td><td>Stack size per process<\/td><td>10240<\/td><td>32768<\/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\"><strong>IMPORTANT:<\/strong> If any limit is below the required value, proceed to Section 2.5 to configure <code>\/etc\/security\/limits.conf<\/code>.<\/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\">1.7 \u2014 Check Hostname &amp; \/etc\/hosts<\/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\"><strong>Why:<\/strong> Oracle listener, OEM agent, Data Guard, and RAC all rely on the server being able to resolve its own hostname. If <code>hostname -f<\/code> returns something different from what is in <code>\/etc\/hosts<\/code> or DNS, you will face listener registration failures and OEM connectivity issues later.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Shows short hostname (e.g., dbserver01)\nhostname\n\n# Shows fully qualified domain name (e.g., dbserver01.company.com)\nhostname -f\n\n# Confirms DNS resolution works for this hostname\nnslookup $(hostname)\n\n# Confirms \/etc\/hosts has an entry for this server\ngrep $(hostname) \/etc\/hosts<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What a correct <code>\/etc\/hosts<\/code> entry looks like:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>192.168.1.10   dbserver01.company.com   dbserver01<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>IMPORTANT:<\/strong> If <code>hostname -f<\/code> returns <code>localhost<\/code> or fails, you must fix <code>\/etc\/hosts<\/code> and set the hostname correctly using <code>hostnamectl set-hostname dbserver01.company.com<\/code> before proceeding.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">1.8 \u2014 Check oracle OS User &amp; Groups Exist<\/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\"><strong>Why:<\/strong> The Oracle installer needs specific OS groups to exist before it runs. It assigns OS authentication roles (SYSDBA, SYSOPER, etc.) to these groups. If they are missing, the installer fails during privilege assignment.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Confirms all required groups exist\ngrep -E \"oinstall|dba|oper|backupdba|dgdba|kmdba|racdba\" \/etc\/group\n\n# Shows oracle user's UID, primary group, and all secondary groups\nid oracle<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> All 7 groups must exist. The <code>oracle<\/code> user&#8217;s primary group must be <code>oinstall<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example of correct output from <code>id oracle<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54327(racdba)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">1.9 \u2014 Check Directory Structure Exists with Correct Permissions<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why:<\/strong> The installer writes files into ORACLE_HOME during installation. If the directory does not exist, or is owned by root, the installer will fail with permission errors.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Check directories exist and are owned by oracle:oinstall\n# Convention A\nls -ld \/u01\/app\/oracle\nls -ld \/u01\/app\/oraInventory\nls -ld \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\n\n# Convention B\nls -ld \/oracle\nls -ld \/oracle\/oraInventory\nls -ld \/oracle\/RDBMS\/19.31<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for in output:<\/strong> Owner must be <code>oracle<\/code>, group must be <code>oinstall<\/code>, permissions must be <code>drwxrwxr-x<\/code> (775).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example correct output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>drwxrwxr-x. 4 oracle oinstall 4096 Jan 15 10:00 \/u01\/app\/oracle<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">1.10 \u2014 Check Environment Variables<\/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\"><strong>Why:<\/strong> If <code>ORACLE_HOME<\/code> is already set (from a previous installation or a misconfigured profile), the new installer will get confused \u2014 it may write files to the wrong location or skip steps thinking Oracle is already installed there.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Shows all Oracle-related environment variables currently set\nsu - oracle -c \"env | grep -E 'ORACLE_BASE|ORACLE_HOME|ORACLE_SID|PATH|LD_LIBRARY_PATH'\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>IMPORTANT:<\/strong> For a <strong>fresh installation<\/strong>, <code>ORACLE_HOME<\/code> must NOT be set. If you see it already set, unset it temporarily before running the installer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\nunset ORACLE_HOME\nunset ORACLE_BASE\n# Confirm they are cleared\necho $ORACLE_HOME   # should return blank\necho $ORACLE_BASE   # should return blank<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">1.11 \u2014 Verify Installer File Exists &amp; Is Not Corrupted<\/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\"><strong>Why:<\/strong> A partially downloaded installer zip will extract without errors but will silently have missing or corrupt files inside. The install appears to succeed but then Oracle binaries crash or are missing. Always verify the checksum against the value shown on MOS before starting.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Confirm installer zip is present and check file size looks correct\nls -lh \/stage\/19c\/LINUX.X64_193000_db_home.zip\n\n# Calculate MD5 checksum \u2014 compare this value against what MOS shows for this file\nmd5sum \/stage\/19c\/LINUX.X64_193000_db_home.zip\n\n# OR use SHA256 (more reliable)\nsha256sum \/stage\/19c\/LINUX.X64_193000_db_home.zip<\/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\udcce Download Oracle software: <a href=\"https:\/\/edelivery.oracle.com\">https:\/\/edelivery.oracle.com<\/a><br>\ud83d\udcce To find the expected checksum: Log into MOS \u2192 Patches &amp; Updates \u2192 search patch 73161 (19.3 base) \u2192 the checksum is shown on the patch download page<\/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\">SECTION 2 \u2014 PRE-INSTALLATION CONFIGURATION<\/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\"><strong>IMPORTANT:<\/strong> Every step in this section must be performed as <strong>root<\/strong> unless explicitly stated otherwise. Open a separate terminal as root before starting.<\/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\">2.1 \u2014 Create OS Groups<\/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\"><strong>Why:<\/strong> Oracle uses Linux OS groups for database authentication. Each group maps to a specific Oracle privilege:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>oinstall<\/code> \u2192 primary group for oracle user, owns all Oracle files<\/li>\n\n\n\n<li><code>dba<\/code> \u2192 members get SYSDBA privilege (full DB admin access)<\/li>\n\n\n\n<li><code>oper<\/code> \u2192 members get SYSOPER privilege (startup\/shutdown only)<\/li>\n\n\n\n<li><code>backupdba<\/code> \u2192 members get SYSBACKUP privilege (RMAN operations)<\/li>\n\n\n\n<li><code>dgdba<\/code> \u2192 members get SYSDG privilege (Data Guard operations)<\/li>\n\n\n\n<li><code>kmdba<\/code> \u2192 members get SYSKM privilege (TDE wallet operations)<\/li>\n\n\n\n<li><code>racdba<\/code> \u2192 members get SYSRAC privilege (RAC specific operations)<\/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>Why fixed GIDs (54321 series)?<\/strong> When you have multiple servers (RAC nodes, standby), all servers must have the same GID numbers for the same group names. If GIDs differ across servers, shared storage file ownership will be inconsistent. Using 54321 series is a widely adopted convention.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Create all 7 required groups with fixed GIDs\ngroupadd -g 54321 oinstall\ngroupadd -g 54322 dba\ngroupadd -g 54323 oper\ngroupadd -g 54324 backupdba\ngroupadd -g 54325 dgdba\ngroupadd -g 54326 kmdba\ngroupadd -g 54327 racdba\n\n# Verify all 7 groups were created\ngrep -E \"oinstall|dba|oper|backupdba|dgdba|kmdba|racdba\" \/etc\/group<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">2.2 \u2014 Create oracle OS User<\/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\"><strong>Why:<\/strong> Oracle database software must not run as root (serious security risk). All Oracle processes run as the <code>oracle<\/code> OS user. The installer enforces this.<\/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\"><strong>Why UID 54321?<\/strong> Same reason as GIDs \u2014 consistency across all servers in the environment. If oracle user&#8217;s UID is different on two RAC nodes, file ownership on shared storage becomes inconsistent.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Create oracle user\n# -u 54321        \u2192 fixed UID\n# -g oinstall     \u2192 primary group (oinstall, NOT dba \u2014 this is a common mistake)\n# -G dba,oper,... \u2192 secondary groups (all Oracle privilege groups)\n# -d \/home\/oracle \u2192 home directory\n# -s \/bin\/bash    \u2192 login shell\nuseradd -u 54321 \\\n        -g oinstall \\\n        -G dba,oper,backupdba,dgdba,kmdba,racdba \\\n        -d \/home\/oracle \\\n        -s \/bin\/bash \\\n        oracle\n\n# Set a password for oracle user\npasswd oracle\n\n# Verify \u2014 confirm UID, primary group, and all secondary groups\nid oracle<\/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\"><strong>IMPORTANT:<\/strong> Primary group MUST be <code>oinstall<\/code>, NOT <code>dba<\/code>. This is a very common mistake. If oracle&#8217;s primary group is <code>dba<\/code>, all Oracle files will be owned by <code>dba<\/code> instead of <code>oinstall<\/code>, which breaks the privilege separation model.<\/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\">2.3 \u2014 Create Directory Structure<\/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\"><strong>Why:<\/strong> Oracle installer needs these directories to exist BEFORE it runs. The installer will not create them. ORACLE_HOME must be an empty directory that oracle user owns. oraInventory tracks what is installed in which Oracle Home.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Convention A \u2014 create all required directories\nmkdir -p \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1   # ORACLE_HOME \u2014 where Oracle software is installed\nmkdir -p \/u01\/app\/oraInventory                       # Oracle Inventory \u2014 tracks all Oracle installs on this server\n\n# Set oracle:oinstall as owner of everything under \/u01\/app\nchown -R oracle:oinstall \/u01\/app\/oracle\nchown -R oracle:oinstall \/u01\/app\/oraInventory\n\n# Set permissions to 775 \u2014 oracle and oinstall group members can read\/write\nchmod -R 775 \/u01\/app\/oracle\nchmod -R 775 \/u01\/app\/oraInventory<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Convention B \u2014 create all required directories\nmkdir -p \/oracle\/RDBMS\/19.31           # ORACLE_HOME for primary DB\nmkdir -p \/oracle\/RDBMS\/19.31Standby    # ORACLE_HOME for standby DB (only needed on standby server)\nmkdir -p \/oracle\/oraInventory          # Oracle Inventory\n\n# Set ownership and permissions\nchown -R oracle:oinstall \/oracle\nchmod -R 775 \/oracle<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Verify \u2014 both owner and permissions must be correct\n# Expected output example: drwxrwxr-x. 2 oracle oinstall 4096 Jan 15 10:00 \/u01\/app\/oracle\nls -ld $ORACLE_HOME\nls -ld $ORACLE_BASE<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">2.4 \u2014 Set Kernel Parameters in \/etc\/sysctl.conf<\/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\"><strong>Why this file?<\/strong> <code>\/etc\/sysctl.conf<\/code> is the Linux system configuration file for kernel parameters. Values set here are automatically loaded at every server boot. This is the permanent way to set kernel parameters.<\/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\"><strong>Why not just run <code>sysctl<\/code> commands directly?<\/strong> <code>sysctl -w<\/code> changes are lost after a reboot. <code>\/etc\/sysctl.conf<\/code> makes them permanent.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Open \/etc\/sysctl.conf as root for editing\nvi \/etc\/sysctl.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to do:<\/strong> Scroll to the very end of the file and add the following block. Do not delete existing entries \u2014 just append below them.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------\n# Oracle 19c Required Kernel Parameters\n# Added by DBA on &lt;date&gt; for Oracle installation\n# -------------------------------------------------------\n\n# Shared memory \u2014 controls how much shared memory Oracle SGA can use\n# shmall = total shared memory in pages (page = 4KB on Linux)\n# shmmax = max size of a single shared memory segment in bytes\n# shmmni = max number of shared memory segments\nkernel.shmall = 1073741824\nkernel.shmmax = 4398046511104\nkernel.shmmni = 4096\n\n# Semaphores \u2014 Oracle background processes use semaphores for IPC\n# Format: semmsl semmns semopm semmni\n# semmsl = max semaphores per set, semmns = total semaphores system-wide\n# semopm = max ops per semop call, semmni = max semaphore sets\nkernel.sem = 250 32000 100 128\n\n# File handles \u2014 Oracle opens many files simultaneously\nfs.file-max = 6815744\n\n# Async I\/O \u2014 Oracle uses async I\/O for better disk performance\nfs.aio-max-nr = 1048576\n\n# Network \u2014 Oracle Net uses these for connection buffers\nnet.ipv4.ip_local_port_range = 9000 65500\nnet.core.rmem_default = 262144\nnet.core.rmem_max = 4194304\nnet.core.wmem_default = 262144\nnet.core.wmem_max = 1048576<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Apply the new values immediately \u2014 no reboot needed\n# -p flag reads and applies values from \/etc\/sysctl.conf\n\/sbin\/sysctl -p\n\n# Verify the values were applied correctly\n\/sbin\/sysctl -a | grep -E \"kernel.shmall|kernel.shmmax|fs.file-max\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> The values shown must match what you just set. If they don&#8217;t, re-check for typos in <code>\/etc\/sysctl.conf<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">2.5 \u2014 Set OS User Limits in \/etc\/security\/limits.conf<\/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\"><strong>Why this file?<\/strong> <code>\/etc\/security\/limits.conf<\/code> is the Linux file that controls per-user resource limits (files, processes, memory). The values set here are applied every time the <code>oracle<\/code> user logs in or a new session is opened. Without these settings, Oracle hits OS-level resource limits and throws errors.<\/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\"><strong>Why both soft and hard?<\/strong> Soft limit = current active limit. Hard limit = the ceiling the user can raise themselves without root. Oracle automatically raises to the hard limit during startup. Both must be set high enough.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Open the limits file as root\nvi \/etc\/security\/limits.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to do:<\/strong> Scroll to the very end of the file and add the following block. Do not remove existing entries.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------\n# Oracle 19c User Resource Limits\n# Added by DBA on &lt;date&gt; for Oracle installation\n# -------------------------------------------------------\n\n# nofile  = maximum number of open file descriptors\n#           Oracle opens many datafiles, redo logs, trace files simultaneously\noracle   soft   nofile    1024\noracle   hard   nofile    65536\n\n# nproc   = maximum number of processes the oracle user can spawn\n#           Oracle has many background processes (PMON, SMON, DBWn, LGWR etc.)\noracle   soft   nproc     2047\noracle   hard   nproc     16384\n\n# stack   = stack size per process in KB\n#           Oracle requires at least 10MB stack per process\noracle   soft   stack     10240\noracle   hard   stack     32768\n\n# memlock = locked memory in KB (used for HugePages if configured)\n#           Set to 3GB here \u2014 adjust based on SGA size\noracle   soft   memlock   3145728\noracle   hard   memlock   3145728<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>IMPORTANT:<\/strong> These limits take effect only on <strong>new login sessions<\/strong>. If you are already logged in as oracle, log out and log back in, then verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\nulimit -n    # Should show 65536 (hard nofile)\nulimit -u    # Should show 16384 (hard nproc)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">2.6 \u2014 Set oracle User Environment Profile (~\/.bash_profile)<\/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\"><strong>Why?<\/strong> The <code>~\/.bash_profile<\/code> file is executed every time the oracle user logs in. It sets the Oracle environment variables that ALL Oracle commands depend on. Without these variables, commands like <code>sqlplus<\/code>, <code>rman<\/code>, <code>lsnrctl<\/code> will either not be found or will connect to the wrong database.<\/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\"><strong>What each variable does:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ORACLE_BASE<\/code> \u2192 Root of all Oracle software and diagnostic files<\/li>\n\n\n\n<li><code>ORACLE_HOME<\/code> \u2192 Where this specific Oracle version is installed<\/li>\n\n\n\n<li><code>ORACLE_SID<\/code> \u2192 Which database instance to connect to by default<\/li>\n\n\n\n<li><code>NLS_DATE_FORMAT<\/code> \u2192 How dates appear in SQL output (very important for readability)<\/li>\n\n\n\n<li><code>NLS_LANG<\/code> \u2192 Character set for the session<\/li>\n\n\n\n<li><code>PATH<\/code> \u2192 Ensures Oracle binaries are found without full path<\/li>\n\n\n\n<li><code>LD_LIBRARY_PATH<\/code> \u2192 Where Oracle looks for shared libraries<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Switch to oracle user\nsu - oracle\n\n# Open the profile file for editing\nvi ~\/.bash_profile<\/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\"><strong>What to do:<\/strong> Add the following block at the END of the existing <code>.bash_profile<\/code> file. Do not remove the existing content (it usually has <code>PATH<\/code> and <code>umask<\/code> settings already).<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Convention A \u2014 add this block:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------\n# Oracle Environment Configuration\n# -------------------------------------------------------\n\n# ORACLE_BASE \u2014 root directory for all Oracle software on this server\nexport ORACLE_BASE=\/u01\/app\/oracle\n\n# ORACLE_HOME \u2014 directory where this specific Oracle version (19.3) is installed\nexport ORACLE_HOME=\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\n\n# ORACLE_SID \u2014 name of the database instance on this server\n# Change this to match your actual DB name (e.g., PROD, DEVDB, etc.)\nexport ORACLE_SID=ORCL\n\n# NLS settings \u2014 controls date format and character set in SQL sessions\nexport NLS_DATE_FORMAT=\"DD-MON-YYYY HH24:MI:SS\"\nexport NLS_LANG=AMERICAN_AMERICA.AL32UTF8\n\n# PATH \u2014 add Oracle bin directory so you can run sqlplus, rman etc. directly\nexport PATH=$ORACLE_HOME\/bin:$ORACLE_HOME\/OPatch:$PATH\n\n# LD_LIBRARY_PATH \u2014 where Oracle looks for its shared libraries (.so files)\nexport LD_LIBRARY_PATH=$ORACLE_HOME\/lib:\/lib:\/usr\/lib\n\n# CLASSPATH \u2014 for Oracle Java components\nexport CLASSPATH=$ORACLE_HOME\/jlib:$ORACLE_HOME\/rdbms\/jlib\n\n# Useful shortcuts \u2014 optional but very helpful in day-to-day work\nalias sqlp='sqlplus \/ as sysdba'\nalias alert='tail -500f $ORACLE_BASE\/diag\/rdbms\/*\/*\/trace\/alert_*.log'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Convention B Primary Server \u2014 add this block:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------\n# Oracle Environment Configuration \u2014 PRIMARY SERVER\n# -------------------------------------------------------\nexport ORACLE_BASE=\/oracle\nexport ORACLE_HOME=\/oracle\/RDBMS\/19.31\nexport ORACLE_SID=ORCL\nexport NLS_DATE_FORMAT=\"DD-MON-YYYY HH24:MI:SS\"\nexport NLS_LANG=AMERICAN_AMERICA.AL32UTF8\nexport PATH=$ORACLE_HOME\/bin:$ORACLE_HOME\/OPatch:$PATH\nexport LD_LIBRARY_PATH=$ORACLE_HOME\/lib:\/lib:\/usr\/lib\nexport CLASSPATH=$ORACLE_HOME\/jlib:$ORACLE_HOME\/rdbms\/jlib\nalias sqlp='sqlplus \/ as sysdba'\nalias alert='tail -500f $ORACLE_BASE\/diag\/rdbms\/*\/*\/trace\/alert_*.log'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Convention B Standby Server \u2014 add this block:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># -------------------------------------------------------\n# Oracle Environment Configuration \u2014 STANDBY SERVER\n# NOTE: ORACLE_HOME points to 19.31Standby \u2014 different from primary\n# This allows independent patching of primary and standby homes\n# -------------------------------------------------------\nexport ORACLE_BASE=\/oracle\nexport ORACLE_HOME=\/oracle\/RDBMS\/19.31Standby\nexport ORACLE_SID=ORCL_STBY\nexport NLS_DATE_FORMAT=\"DD-MON-YYYY HH24:MI:SS\"\nexport NLS_LANG=AMERICAN_AMERICA.AL32UTF8\nexport PATH=$ORACLE_HOME\/bin:$ORACLE_HOME\/OPatch:$PATH\nexport LD_LIBRARY_PATH=$ORACLE_HOME\/lib:\/lib:\/usr\/lib\nexport CLASSPATH=$ORACLE_HOME\/jlib:$ORACLE_HOME\/rdbms\/jlib\nalias sqlp='sqlplus \/ as sysdba'\nalias alert='tail -500f $ORACLE_BASE\/diag\/rdbms\/*\/*\/trace\/alert_*.log'<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Apply the profile in the current session (so you don't need to log out)\n. ~\/.bash_profile\n\n# Verify all variables are set correctly\necho \"ORACLE_BASE  = $ORACLE_BASE\"\necho \"ORACLE_HOME  = $ORACLE_HOME\"\necho \"ORACLE_SID   = $ORACLE_SID\"\necho \"PATH         = $PATH\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">2.7 \u2014 Unzip Oracle Software into ORACLE_HOME<\/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\"><strong>Why unzip INTO ORACLE_HOME?<\/strong> This is the single most important thing to know about 19c installation. In Oracle 11g and 12c, you unzipped the installer to a staging area and ran <code>runInstaller<\/code> from there. <strong>Oracle 19c changed this completely.<\/strong> The zip file IS the Oracle Home \u2014 you must unzip it directly into your pre-created empty ORACLE_HOME directory. The <code>runInstaller<\/code> binary is inside the zip.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Switch to oracle user\nsu - oracle\n\n# Move into the ORACLE_HOME directory\ncd $ORACLE_HOME\n\n# Unzip the installer directly here\n# -q = quiet mode (no verbose output, faster)\nunzip -q \/stage\/19c\/LINUX.X64_193000_db_home.zip\n\n# Verify key files are now present in ORACLE_HOME\nls $ORACLE_HOME\/runInstaller      # The installer binary\nls $ORACLE_HOME\/install\/response\/ # Response files for silent install<\/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\"><strong>IMPORTANT:<\/strong> If you unzip to <code>\/stage\/19c\/<\/code> and run <code>runInstaller<\/code> from there (the old 11g\/12c method), the installer will create a new directory inside the stage folder as ORACLE_HOME, which is NOT what you want. Always unzip into the pre-created <code>$ORACLE_HOME<\/code> directory.<\/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\">SECTION 3 \u2014 ORACLE SOFTWARE INSTALLATION<\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">3.1 \u2014 Silent Installation<\/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\"><strong>Why silent installation?<\/strong> Silent install uses a command line with parameters instead of clicking through a GUI wizard. In production environments, GUI is often not available (no X11\/display). Silent installs are also repeatable, documentable, and scriptable \u2014 essential for a consultant.<\/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\"><strong>Why software-only first?<\/strong> We separate software installation from database creation. This gives you more control \u2014 you can install software once and create multiple databases, or apply patches to the software before creating the database.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\ncd $ORACLE_HOME\n\n# Run silent software-only installation\n# Each parameter is explained below\n.\/runInstaller -silent \\\n  -responseFile $ORACLE_HOME\/install\/response\/db_install.rsp \\\n  oracle.install.option=INSTALL_DB_SWONLY \\       # Install software only \u2014 no DB creation yet\n  UNIX_GROUP_NAME=oinstall \\                       # OS group that owns the inventory\n  INVENTORY_LOCATION=\/u01\/app\/oraInventory \\       # Where Oracle tracks all installations\n  ORACLE_BASE=\/u01\/app\/oracle \\                    # Oracle base directory\n  oracle.install.db.InstallEdition=EE \\            # EE = Enterprise Edition, SE2 = Standard Edition 2\n  oracle.install.db.OSDBA_GROUP=dba \\              # OS group that gets SYSDBA privilege\n  oracle.install.db.OSOPER_GROUP=oper \\            # OS group that gets SYSOPER privilege\n  oracle.install.db.OSBACKUPDBA_GROUP=backupdba \\  # OS group for SYSBACKUP privilege\n  oracle.install.db.OSDGDBA_GROUP=dgdba \\          # OS group for SYSDG (Data Guard) privilege\n  oracle.install.db.OSKMDBA_GROUP=kmdba \\          # OS group for SYSKM (TDE Key Management) privilege\n  oracle.install.db.OSRACDBA_GROUP=racdba \\        # OS group for SYSRAC (RAC) privilege\n  SECURITY_UPDATES_VIA_MYORACLESUPPORT=false \\     # Do not connect to MOS during install\n  DECLINE_SECURITY_UPDATES=true                    # Decline automatic security updates<\/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\"><strong>Monitor installation progress<\/strong> in a second terminal (do not close the installer terminal):<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Open a new terminal as oracle and watch the log\ntail -100f \/tmp\/InstallActions*\/installActions*.log<\/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\">When installation is complete you will see a message like:<br><code>The installation of Oracle Database 19c was successful.<\/code><br><code>Please check '\/tmp\/InstallActions...\/installActions.log' for more details.<\/code><\/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\">3.2 \u2014 Run Root Scripts (MANDATORY \u2014 as root)<\/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\"><strong>Why these scripts?<\/strong> The Oracle installer cannot run certain privileged operations itself because it runs as the <code>oracle<\/code> user. These two scripts perform the privileged steps that require root access:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>orainstRoot.sh<\/code> \u2014 registers the Oracle inventory location with the OS (creates <code>\/etc\/oraInst.loc<\/code>) and sets correct permissions on the inventory directory<\/li>\n\n\n\n<li><code>root.sh<\/code> \u2014 sets the correct ownership and setuid permissions on the Oracle binary itself (the <code>oracle<\/code> binary must be owned by root with setuid bit set so it can allocate shared memory)<\/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\"><strong>IMPORTANT:<\/strong> Run these as <strong>root<\/strong>. Run them in <strong>this exact order<\/strong>. Never skip either one. If you skip <code>root.sh<\/code>, the Oracle binary will not have the correct permissions and the database will fail to start.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Open a new terminal and switch to root\nsu - root\n# OR\nsudo su -\n\n# STEP 1 \u2014 Run orainstRoot.sh first\n# This registers the inventory and creates \/etc\/oraInst.loc\n\/u01\/app\/oraInventory\/orainstRoot.sh\n# Convention B: \/oracle\/oraInventory\/orainstRoot.sh\n\n# STEP 2 \u2014 Run root.sh immediately after\n# This sets SUID permissions on Oracle binary and other root-owned steps\n\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/root.sh\n# Convention B: \/oracle\/RDBMS\/19.31\/root.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output from <code>root.sh<\/code> (you should see something like this):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Performing root operations...\nThe following environment variables are set as:\n    ORACLE_OWNER= oracle\n    ORACLE_HOME=  \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\nEnter the full pathname of the local bin directory: &#91;\/usr\/local\/bin]:\n   Copying dbhome to \/usr\/local\/bin ...\n   Copying oraenv to \/usr\/local\/bin ...\n   Copying coraenv to \/usr\/local\/bin ...\nCreating \/etc\/oratab file...\nEntries will be added to the \/etc\/oratab file as needed by\nDatabase Configuration Assistant when a database is created\nFinished running generic part of root script.<\/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\"><strong>Press Enter when prompted<\/strong> for <code>\/usr\/local\/bin<\/code> \u2014 accept the default.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>IMPORTANT:<\/strong> Go back to the installer terminal and click <strong>OK<\/strong> (if GUI) or let the silent install continue AFTER root scripts complete.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">3.3 \u2014 Configure Oracle Listener (netca)<\/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\"><strong>What is the listener?<\/strong> The Oracle Listener is a separate process that listens on a network port (default 1521) and accepts incoming database connection requests. Without a listener, only local OS-authenticated connections work. Remote applications, JDBC connections, and tools like SQL Developer cannot connect without a listener.<\/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\"><strong>What does netca do?<\/strong> NETCA (Network Configuration Assistant) creates the <code>listener.ora<\/code> file and starts the listener process. It also creates a basic <code>tnsnames.ora<\/code> and <code>sqlnet.ora<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Configure listener silently using the default response file\n# This creates a listener named LISTENER on port 1521\nnetca -silent -responseFile $ORACLE_HOME\/network\/install\/netca_typ.rsp\n\n# Verify the listener started and is running\nlsnrctl status\n\n# Check listener log for any errors\ntail -50 $ORACLE_HOME\/network\/log\/listener.log<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What <code>lsnrctl status<\/code> output should look like:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>LSNRCTL for Linux: Version 19.0.0.0.0\nSTATUS of the LISTENER\nAlias                     LISTENER\nVersion                   TNSLSNR for Linux: Version 19.0.0.0.0\nStart Date                15-JAN-2024 10:30:00\nUptime                    0 days 0 hr. 0 min. 5 sec.\nTrace Level               off\nSecurity                  ON: Local OS Authentication\nListener Port(s)          1521<\/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\"><strong>IMPORTANT:<\/strong> If port 1521 is already in use by another Oracle installation on the same server, the listener will fail to start. Check with <code>ss -tlnp | grep 1521<\/code>. If occupied, you must use a different port \u2014 edit the response file and change the port before running netca.<\/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\">3.4 \u2014 Create Database Using DBCA (Silent)<\/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\"><strong>What is DBCA?<\/strong> DBCA (Database Configuration Assistant) creates the actual Oracle database \u2014 it creates the datafiles, redo logs, control files, installs the data dictionary, and configures the database parameters.<\/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\"><strong>Why silent DBCA?<\/strong> Same reason as silent installer \u2014 no GUI dependency, repeatable, documentable.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Create a non-CDB (traditional) database\n# Each parameter is explained inline\ndbca -silent \\\n  -createDatabase \\\n  -templateName General_Purpose.dbc \\      # Use General Purpose template \u2014 suitable for most workloads\n  -gdbName ORCL \\                          # Global database name (DB_NAME.DB_DOMAIN)\n  -sid ORCL \\                              # Oracle SID \u2014 must match ORACLE_SID in your profile\n  -responseFile NO_VALUE \\                 # Do not use a response file \u2014 use inline parameters\n  -characterSet AL32UTF8 \\                 # Character set \u2014 AL32UTF8 supports all languages, use this always\n  -sysPassword Oracle_123 \\               # SYS user password \u2014 change to your standard\n  -systemPassword Oracle_123 \\            # SYSTEM user password \u2014 change to your standard\n  -createAsContainerDatabase false \\       # false = traditional non-CDB database\n  -databaseType MULTIPURPOSE \\            # MULTIPURPOSE = balanced for OLTP and reporting\n  -automaticMemoryManagement false \\       # false = we will manage SGA\/PGA manually (recommended)\n  -totalMemory 2048 \\                      # Total memory in MB Oracle can use (SGA+PGA combined)\n  -storageType FS \\                        # FS = filesystem storage (use ASM for production RAC)\n  -datafileDestination \/u01\/app\/oracle\/oradata \\   # Where datafiles will be created\n  -redoLogFileSize 200 \\                   # Redo log size in MB \u2014 200MB is a good starting point\n  -emConfiguration NONE \\                 # Do not configure OEM during DBCA (we do it separately)\n  -ignorePreReqs                           # Ignore prerequisite warnings (we already checked manually)<\/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\">Convention B \u2014 change <code>-datafileDestination<\/code> to <code>\/oracle\/oradata<\/code><\/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\"><strong>Monitor DBCA progress<\/strong> in a separate terminal:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Convention A\ntail -100f \/u01\/app\/oracle\/cfgtoollogs\/dbca\/ORCL\/ORCL*.log\n\n# Convention B\ntail -100f \/oracle\/cfgtoollogs\/dbca\/ORCL\/ORCL*.log<\/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\"><strong>IMPORTANT \u2014 CDB Option:<\/strong> If your company policy requires Container Database (CDB) architecture (common in 19c deployments), change the DBCA command as follows:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>  -createAsContainerDatabase true \\\n  -numberOfPDBs 1 \\\n  -pdbName PDB1 \\\n  -pdbAdminPassword Oracle_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\">3.5 \u2014 Verify and Configure \/etc\/oratab<\/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\"><strong>What is \/etc\/oratab?<\/strong> This is a simple text file that maps each Oracle SID to its ORACLE_HOME path. It is used by:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>dbstart<\/code> and <code>dbshut<\/code> scripts to know which databases to start\/stop at boot<\/li>\n\n\n\n<li><code>oraenv<\/code> script to switch between Oracle environments<\/li>\n\n\n\n<li>Oracle agents and monitoring tools to discover databases on the server<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>Y<\/code> at the end means &#8220;auto-start this database at boot&#8221;. <code>N<\/code> means do not auto-start.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Check if DBCA added the entry automatically\ncat \/etc\/oratab<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected entry:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Convention A:\nORCL:\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1:Y\n\n# Convention B:\nORCL:\/oracle\/RDBMS\/19.31:Y<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># If the entry is missing, add it manually as root:\n\n# Convention A:\necho \"ORCL:\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1:Y\" &gt;&gt; \/etc\/oratab\n\n# Convention B:\necho \"ORCL:\/oracle\/RDBMS\/19.31:Y\" &gt;&gt; \/etc\/oratab\n\n# Verify the entry is now correct\ncat \/etc\/oratab<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">3.6 \u2014 Configure Database Auto-Startup at Boot (systemd)<\/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\"><strong>Why?<\/strong> By default, Oracle database does NOT start automatically when the Linux server is rebooted. In production environments, a server reboot (for patching, hardware maintenance etc.) must be followed by the database coming up automatically \u2014 you cannot expect a DBA to be online at 2 AM after every reboot to manually start the database.<\/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\"><strong>What is systemd?<\/strong> systemd is the Linux service manager used in OL7, OL8, and RHEL 7\/8. It controls what services start at boot and in what order. We create a custom service unit file that tells systemd to run Oracle&#8217;s <code>dbstart<\/code> script at boot time and <code>dbshut<\/code> at shutdown.<\/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\"><strong>What is the service unit file?<\/strong> A plain text file with three sections:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>[Unit]<\/code> \u2192 Describes the service and when it should start (after network is ready)<\/li>\n\n\n\n<li><code>[Service]<\/code> \u2192 What commands to run to start and stop the service, and which user to run as<\/li>\n\n\n\n<li><code>[Install]<\/code> \u2192 Which system boot target should include this service (<code>multi-user.target<\/code> = normal multi-user Linux boot)<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Step 1 \u2014 Create the service unit file (as root)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Open a new file in the systemd service directory\n# This directory is where all systemd service definitions live\nvi \/etc\/systemd\/system\/oracle-db.service<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Step 2 \u2014 Add the following content into the file<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Paste the entire block below as-is. Do not leave any blank lines at the top. Change the paths to match your convention.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Convention A \u2014 paste this:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=Oracle Database Service\n# \"After=network.target\" means: only start this service after the network interfaces are up\n# This is important because the listener needs network to accept connections\nAfter=network.target\n\n&#91;Service]\n# Type=forking means the startup command spawns child processes and exits\n# This is how Oracle works \u2014 dbstart starts Oracle then exits\nType=forking\n\n# Run Oracle as the oracle OS user, not root\nUser=oracle\nGroup=oinstall\n\n# ExecStart = command to run when starting the service\n# dbstart reads \/etc\/oratab and starts all databases with Y flag\n# The argument after dbstart is ORACLE_HOME \u2014 dbstart needs it to find Oracle binaries\nExecStart=\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/bin\/dbstart \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\n\n# ExecStop = command to run when stopping the service (server shutdown or systemctl stop)\n# dbshut reads \/etc\/oratab and shuts down all databases with Y flag\nExecStop=\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/bin\/dbshut \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\n\n# RemainAfterExit=yes means systemd considers the service \"active\" even after\n# dbstart exits \u2014 because Oracle database processes continue running in the background\nRemainAfterExit=yes\n\n&#91;Install]\n# multi-user.target = normal Linux boot level (equivalent of runlevel 3)\n# This line registers the service to start during normal system boot\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Convention B \u2014 paste this:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=Oracle Database Service\nAfter=network.target\n\n&#91;Service]\nType=forking\nUser=oracle\nGroup=oinstall\n\n# ExecStart \u2014 dbstart reads \/etc\/oratab and starts all Y-flagged databases\n# Argument is the ORACLE_HOME path \u2014 must match \/etc\/oratab and your bash_profile\nExecStart=\/oracle\/RDBMS\/19.31\/bin\/dbstart \/oracle\/RDBMS\/19.31\n\n# ExecStop \u2014 dbshut shuts down all Y-flagged databases gracefully before server powers off\nExecStop=\/oracle\/RDBMS\/19.31\/bin\/dbshut \/oracle\/RDBMS\/19.31\n\nRemainAfterExit=yes\n\n&#91;Install]\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Step 3 \u2014 Enable and start the service (as root)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Reload systemd daemon so it picks up the new service file we just created\n# Must run this every time you create or modify a service file\nsystemctl daemon-reload\n\n# Enable the service \u2014 registers it to start automatically at every boot\n# This creates a symlink in the appropriate boot target directory\nsystemctl enable oracle-db.service\n\n# Start the service right now (without rebooting)\nsystemctl start oracle-db.service\n\n# Check the service status \u2014 confirms it started successfully\nsystemctl status oracle-db.service<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output from <code>systemctl status<\/code>:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u25cf oracle-db.service - Oracle Database Service\n   Loaded: loaded (\/etc\/systemd\/system\/oracle-db.service; enabled; vendor preset: disabled)\n   Active: active (exited) since Tue 2024-01-15 10:45:00 IST; 5s ago\n  Process: 12345 ExecStart=\/u01\/app\/...\/dbstart ... (code=exited, status=0\/SUCCESS)\n Main PID: 12345 (code=exited, status=0\/SUCCESS)<\/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\"><code>Active: active (exited)<\/code> is CORRECT and expected \u2014 not a problem. This is because <code>dbstart<\/code> starts Oracle and then exits (Type=forking). The <code>RemainAfterExit=yes<\/code> tells systemd the service is still active even though the startup process exited.<\/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\"><strong>IMPORTANT \u2014 Verify auto-startup actually works:<\/strong> After setting up the service, test it by rebooting the server and confirming the database comes up automatically. Do not trust <code>systemctl enable<\/code> alone without a reboot test in a non-production environment first.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Test restart (only do this in a test window, not production peak hours)\nreboot\n\n# After server comes back up \u2014 verify DB is running\nsu - oracle\nsqlplus \/ as sysdba\nSELECT status FROM v$instance;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">SECTION 4 \u2014 POST-INSTALLATION 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\"><strong>IMPORTANT:<\/strong> Post-checks are your final quality gate. Do NOT hand over the environment, mark the task complete, or move to the next step without completing every check below. In a consultant role, these checks are your proof of delivery.<\/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\">Run all SQL queries from <code>sqlplus \/ as sysdba<\/code> unless stated otherwise.<\/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 Verify Oracle Inventory<\/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\"><strong>Why?<\/strong> The inventory is Oracle&#8217;s internal record of what is installed. If inventory is corrupted or incomplete, future patching with OPatch will fail.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# View the inventory XML file directly\n# This shows all Oracle Homes registered on this server\ncat \/u01\/app\/oraInventory\/ContentsXML\/inventory.xml\n# Convention B: cat \/oracle\/oraInventory\/ContentsXML\/inventory.xml\n\n# Use OPatch to display inventory in readable format\n# This is the standard way to check what is installed\n$ORACLE_HOME\/OPatch\/opatch lsinventory<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for in OPatch output:<\/strong> Your ORACLE_HOME should be listed, and it should show <code>Oracle Database 19c<\/code> with version <code>19.3.0.0.0<\/code>.<\/p>\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 Verify Oracle Home Binaries &amp; Permissions<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why?<\/strong> The <code>oracle<\/code> binary must have the setuid (SUID) bit set and be owned by root. Without this, the database cannot allocate shared memory segments. This is set by <code>root.sh<\/code> \u2014 so if <code>root.sh<\/code> was not run, this will be wrong.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Check all key binaries exist\nls -lh $ORACLE_HOME\/bin\/oracle     # Main database binary \u2014 must be owned by root with SUID\nls -lh $ORACLE_HOME\/bin\/sqlplus    # SQL*Plus command line tool\nls -lh $ORACLE_HOME\/bin\/rman       # RMAN backup tool\nls -lh $ORACLE_HOME\/bin\/expdp      # Data Pump export\nls -lh $ORACLE_HOME\/bin\/impdp      # Data Pump import\nls -lh $ORACLE_HOME\/bin\/lsnrctl    # Listener control\nls -lh $ORACLE_HOME\/bin\/dbca       # Database Configuration Assistant\n\n# Specifically check oracle binary permissions\nstat $ORACLE_HOME\/bin\/oracle | grep -E \"Access|Uid\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> The <code>oracle<\/code> binary must show:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-rwsr-s--x 1 root oinstall 419M Jan 15 10:40 oracle<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>s<\/code> in <code>rws<\/code> is the <strong>setuid bit<\/strong> \u2014 this is critical. If you see <code>rwx<\/code> without <code>s<\/code>, <code>root.sh<\/code> was not run correctly.<\/p>\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 Check Database Instance Status<\/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\"><strong>Why?<\/strong> Confirms the database is open and accepting connections. <code>READ WRITE<\/code> means the database is fully open. <code>MOUNTED<\/code> means it started but is not open. <code>STARTED<\/code> means only the instance is up but database is not mounted.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\n-- Formatting for clean output\nset linesize 150\nset pagesize 50\ncol name           for a12\ncol db_unique_name for a20\ncol open_mode      for a15\ncol log_mode       for a15\ncol host_name      for a30\ncol instance_name  for a15\ncol status         for a12\ncol version        for a15\n\n-- Check database status\nSELECT name, db_unique_name, open_mode, log_mode\nFROM   v$database;\n\n-- Check instance status\nSELECT instance_name, version, host_name, status\nFROM   v$instance;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NAME         DB_UNIQUE_NAME       OPEN_MODE       LOG_MODE\n------------ -------------------- --------------- ---------------\nORCL         orcl                 READ WRITE      ARCHIVELOG<\/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 Check All Datafiles Are Online<\/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\"><strong>Why?<\/strong> A datafile in OFFLINE status means that tablespace is inaccessible. Any application trying to access objects in that tablespace will get errors. Must be verified before go-live.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 200\nset pagesize 100\ncol file#           for 999\ncol tablespace_name for a25\ncol status          for a12\ncol name            for a70\n\nSELECT file#, tablespace_name, status, name\nFROM   v$datafile\nORDER BY file#;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> Every row must show <code>ONLINE<\/code> in the <code>STATUS<\/code> column. If any shows <code>OFFLINE<\/code> or <code>RECOVER<\/code> \u2014 stop and investigate immediately.<\/p>\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 Check Tablespace Usage<\/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\"><strong>Why?<\/strong> Ensures all tablespaces were created correctly during DBCA and have adequate free space. SYSTEM and SYSAUX tablespaces should never be close to full on a fresh install.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">sql<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 200\nset pagesize 100\ncol tablespace_name for a25\ncol status          for a10\ncol contents        for a12\ncol total_mb        for 9999999\ncol free_mb         for 9999999\ncol used_pct        for 999.99\n\nSELECT df.tablespace_name,\n       df.status,\n       df.contents,\n       ROUND(df.bytes\/1024\/1024,2)                  total_mb,\n       ROUND(NVL(fs.bytes,0)\/1024\/1024,2)            free_mb,\n       ROUND((1 - NVL(fs.bytes,0)\/df.bytes)*100,2)   used_pct\nFROM  (SELECT tablespace_name, status, contents,\n              SUM(bytes) bytes\n       FROM   dba_data_files\n       GROUP BY tablespace_name, status, contents) df,\n      (SELECT tablespace_name, SUM(bytes) bytes\n       FROM   dba_free_space\n       GROUP BY tablespace_name) fs\nWHERE  df.tablespace_name = fs.tablespace_name(+)\nORDER BY df.tablespace_name;<\/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 Check Redo Log Groups and Status<\/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?<\/strong> Redo logs record every change made to the database \u2014 they are critical for recovery. After a fresh install, all redo log groups should be <code>INACTIVE<\/code> or one should be <code>CURRENT<\/code>. If any group shows <code>NEEDS ARCHIVING<\/code> on a fresh install, archiving is not working properly.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 180\nset pagesize 50\ncol l#      for 999\ncol status  for a12\ncol member  for a65\n\nSELECT l.group#    l#,\n       l.members,\n       l.bytes\/1024\/1024  size_mb,\n       l.status,\n       l.archived,\n       f.member\nFROM   v$log l, v$logfile f\nWHERE  l.group# = f.group#\nORDER BY l.group#;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> One group should show <code>CURRENT<\/code> (the active redo log). Others should be <code>INACTIVE<\/code> or <code>ACTIVE<\/code>. Column <code>archived<\/code> should show <code>YES<\/code> for all non-CURRENT groups (if in archivelog mode).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.7 \u2014 Check Alert Log for Errors<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why?<\/strong> The alert log is the database&#8217;s own diary \u2014 it records every startup, shutdown, error, and significant event. Even if the database appears to be working, there may be warnings or non-fatal errors in the alert log that indicate a problem. Always check it after installation.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Step 1 \u2014 Find the exact location of the alert log\nsqlplus -s \/ as sysdba &lt;&lt;EOF\nset linesize 200 pagesize 0\ncol value for a80\nSELECT value FROM v\\$diag_info WHERE name = 'Diag Trace';\nEXIT;\nEOF<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Step 2 \u2014 Scan the alert log for any errors or warnings\n# Convention A path:\ntail -200 \/u01\/app\/oracle\/diag\/rdbms\/orcl\/ORCL\/trace\/alert_ORCL.log \\\n     | grep -E \"ORA-|Error|WARNING|CORRUPTED|FAILED\"\n\n# Convention B path:\ntail -200 \/oracle\/diag\/rdbms\/orcl\/ORCL\/trace\/alert_ORCL.log \\\n     | grep -E \"ORA-|Error|WARNING|CORRUPTED|FAILED\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> No output = good. Any <code>ORA-<\/code> errors need investigation before sign-off.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.8 \u2014 Verify Listener is Registered and Working End-to-End<\/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\"><strong>Why two checks?<\/strong> <code>lsnrctl status<\/code> only confirms the listener process is running. Testing an actual TNS connection (step 2 below) confirms the database has registered with the listener AND the full network path from client to database works. Both are needed.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Check 1 \u2014 Listener process status and registered services\nlsnrctl status\n\n# Check 2 \u2014 Test actual TNS connection (bypasses OS authentication, uses listener)\n# If this works, listener and network are both fine\nsqlplus system\/Oracle_123@localhost:1521\/ORCL<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>In <code>lsnrctl status<\/code> output look for:<\/strong> Your database service (e.g., <code>ORCL<\/code>) listed under <code>Services Summary<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.9 \u2014 Check OPatch Version and Applied Patches<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why?<\/strong> A fresh 19.3 base installation has NO patches applied. You need to document the baseline patch level. This is also your reference point before applying the latest Release Update in the next SOP.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Check OPatch utility version itself\n$ORACLE_HOME\/OPatch\/opatch version\n\n# List all patches currently installed in this Oracle Home\n# On a fresh 19.3 base install \u2014 this will show nothing under \"Patch  description\"\n$ORACLE_HOME\/OPatch\/opatch lsinventory\n\n# Condensed view \u2014 just Oracle home version and any patches\n$ORACLE_HOME\/OPatch\/opatch lsinventory | grep -E \"Oracle Database|Patch \"<\/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\udcce Download latest OPatch: MOS Doc ID <strong>6880880.1<\/strong><br>\ud83d\udcce Find latest 19c Release Updates: MOS \u2192 Patches &amp; Updates \u2192 search <strong>&#8220;Oracle Database 19c Release Update&#8221;<\/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\">4.10 \u2014 Check Archivelog Mode and Archive Destination<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why?<\/strong> In production, databases MUST be in ARCHIVELOG mode for backup and recovery (RMAN) and for Data Guard. If the database was created in NOARCHIVELOG mode, it must be switched to ARCHIVELOG before go-live.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 150\nset pagesize 50\ncol dest_name for a30\ncol status    for a10\ncol target    for a12\ncol archiver  for a12\n\n-- Shows current archive mode and archive destination\nARCHIVE LOG LIST;\n\n-- Shows configured archive destinations and their status\nSELECT dest_id, dest_name, status, target, archiver\nFROM   v$archive_dest\nWHERE  status != 'INACTIVE'\nORDER BY dest_id;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> <code>Database log mode: Archive Mode<\/code> and <code>Automatic archival: Enabled<\/code>.<\/p>\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> If database is in <code>No Archive Mode<\/code>, switch it to archivelog mode immediately:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>SHUTDOWN IMMEDIATE;\nSTARTUP MOUNT;\nALTER DATABASE ARCHIVELOG;\nALTER DATABASE OPEN;\nARCHIVE LOG LIST;   -- Confirm it now shows Archive Mode<\/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.11 \u2014 Check for INVALID Database Objects<\/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\"><strong>Why?<\/strong> Oracle&#8217;s internal components (PL\/SQL packages, views, triggers) must all be in VALID state. INVALID objects mean a component did not compile correctly. This can cause unexpected errors when those components are used by the database engine or by applications.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 180\nset pagesize 100\ncol owner       for a20\ncol object_name for a45\ncol object_type for a25\ncol status      for a10\n\n-- List all invalid objects\nSELECT owner, object_name, object_type, status\nFROM   dba_objects\nWHERE  status = 'INVALID'\nORDER BY owner, object_type, object_name;\n\n-- Quick count\nSELECT COUNT(*) invalid_count\nFROM   dba_objects\nWHERE  status = 'INVALID';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> Count should be 0 or very close to 0. A handful of invalid objects in non-SYS\/SYSTEM schemas is normal on a fresh install.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>IMPORTANT:<\/strong> If you see INVALID objects under SYS or SYSTEM, run <code>utlrp.sql<\/code> to recompile them:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Recompile all invalid objects in the database\n-- This script is provided by Oracle, located in the ORACLE_HOME\n@?\/rdbms\/admin\/utlrp.sql\n\n-- Re-check after recompile \u2014 count should now be 0\nSELECT COUNT(*) invalid_count\nFROM   dba_objects\nWHERE  status = 'INVALID';<\/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.12 \u2014 Final Component Registry Check<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why?<\/strong> <code>dba_registry<\/code> shows the installation status of every Oracle component (XML DB, JVM, Spatial, OLAP, etc.). All installed components must be in <code>VALID<\/code> state. This is Oracle&#8217;s own validation that all components installed and initialized correctly.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 200\nset pagesize 100\ncol comp_name for a50\ncol version   for a15\ncol status    for a12\n\nSELECT comp_name, version, status\nFROM   dba_registry\nORDER BY comp_name;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> Every row must show <code>VALID<\/code> in the <code>STATUS<\/code> column.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>IMPORTANT:<\/strong> If ANY component shows <code>INVALID<\/code>, <code>LOADING<\/code>, or <code>REMOVING<\/code> \u2014 the installation is not clean. Do NOT hand over the environment. Raise this with Oracle Support (MOS SR) before proceeding.<\/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\">SECTION 5 \u2014 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 \/ Action<\/th><\/tr><\/thead><tbody><tr><td>Check OS version<\/td><td><code>cat \/etc\/os-release<\/code><\/td><\/tr><tr><td>Check disk space<\/td><td><code>df -hP<\/code><\/td><\/tr><tr><td>Check \/tmp space<\/td><td><code>df -hP \/tmp<\/code><\/td><\/tr><tr><td>Check RAM<\/td><td><code>grep MemTotal \/proc\/meminfo<\/code><\/td><\/tr><tr><td>Check kernel params<\/td><td><code>sysctl -a | grep -E \"shm|sem|file-max\"<\/code><\/td><\/tr><tr><td>Install OS packages<\/td><td><code>yum install -y binutils libaio libaio-devel ...<\/code><\/td><\/tr><tr><td>Check oracle limits<\/td><td><code>su - oracle -c \"ulimit -a\"<\/code><\/td><\/tr><tr><td>Check hostname<\/td><td><code>hostname -f<\/code><\/td><\/tr><tr><td>Check oracle groups<\/td><td><code>grep oinstall \/etc\/group<\/code><\/td><\/tr><tr><td>Check oracle user<\/td><td><code>id oracle<\/code><\/td><\/tr><tr><td>Unzip location (19c rule)<\/td><td>Directly INTO <code>$ORACLE_HOME<\/code> \u2014 not a staging folder<\/td><\/tr><tr><td>Root scripts order<\/td><td><code>orainstRoot.sh<\/code> first \u2192 then <code>root.sh<\/code><\/td><\/tr><tr><td>oracle binary permission<\/td><td>Must show <code>-rwsr-s--x 1 root oinstall<\/code><\/td><\/tr><tr><td>Check DB open mode<\/td><td><code>SELECT open_mode FROM v$database;<\/code><\/td><\/tr><tr><td>Check instance status<\/td><td><code>SELECT status FROM v$instance;<\/code><\/td><\/tr><tr><td>Check listener<\/td><td><code>lsnrctl status<\/code><\/td><\/tr><tr><td>Test TNS connection<\/td><td><code>sqlplus system\/pwd@localhost:1521\/ORCL<\/code><\/td><\/tr><tr><td>View alert log<\/td><td><code>tail -200 alert_ORCL.log | grep ORA-<\/code><\/td><\/tr><tr><td>Check patches<\/td><td><code>opatch lsinventory<\/code><\/td><\/tr><tr><td>Check invalid objects<\/td><td><code>SELECT count(*) FROM dba_objects WHERE status='INVALID';<\/code><\/td><\/tr><tr><td>Recompile invalids<\/td><td><code>@?\/rdbms\/admin\/utlrp.sql<\/code><\/td><\/tr><tr><td>Check all components<\/td><td><code>SELECT comp_name,status FROM dba_registry;<\/code><\/td><\/tr><tr><td>Switch to archivelog<\/td><td><code>STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN;<\/code><\/td><\/tr><tr><td>MOS Install Guide<\/td><td>Doc ID <strong>2660755.1<\/strong><\/td><\/tr><tr><td>MOS OPatch Download<\/td><td>Doc ID <strong>6880880.1<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This SOP covers everything you need to install Oracle Database 19c on Linux from scratch without referring to any other source. Bookmark this page and use the Quick Reference Card above during your next installation for a clean, error-free setup.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A complete production-ready SOP for installing Oracle Database 19c on Linux from scratch. Covers pre-checks, OS configuration, kernel parameters, OS user setup, silent installation, listener configuration, database creation via DBCA, auto-startup with systemd, and full post-installation validation \u2014 with real commands, expected outputs, and consultant-level notes for both standard OFA and enterprise custom path conventions. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5777,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"googlesitekit_rrm_CAowu461DA:productID":"","footnotes":""},"categories":[1534],"tags":[],"class_list":["post-5746","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\/5746","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=5746"}],"version-history":[{"count":4,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5746\/revisions"}],"predecessor-version":[{"id":5820,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5746\/revisions\/5820"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media\/5777"}],"wp:attachment":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media?parent=5746"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/categories?post=5746"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/tags?post=5746"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}