{"id":5825,"date":"2026-07-26T15:01:12","date_gmt":"2026-07-26T09:31:12","guid":{"rendered":"https:\/\/w3buddy.com\/?p=5825"},"modified":"2026-07-26T15:01:15","modified_gmt":"2026-07-26T09:31:15","slug":"oracle-instance-database-startup-shutdown","status":"publish","type":"post","link":"https:\/\/w3buddy.com\/blog\/oracle-instance-database-startup-shutdown\/","title":{"rendered":"Oracle Instance and Database Startup and Shutdown"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A complete production-ready SOP for Oracle Database startup and shutdown procedures on Linux. Covers all startup modes, all shutdown modes, pfile vs spfile startup, startup and shutdown in RAC environments, CDB and PDB startup and shutdown, common startup failures and fixes, automatic startup configuration, and full pre and post checks \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>Covers<\/td><td>Standalone, RAC, CDB\/PDB, Data Guard<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 1359094.1 (Startup and Shutdown Best Practices)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 2059171.1 (CDB and PDB Startup Shutdown)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 1586986.1 (RAC Startup Shutdown)<\/td><\/tr><tr><td>Prepared By<\/td><td>W3Buddy<\/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. Startup and Shutdown \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>Why does a DBA need to master startup and shutdown?<\/strong> Every DBA activity eventually requires a database restart \u2014 patching, parameter changes, upgrade, recovery, hardware maintenance. Knowing exactly which startup mode to use, which shutdown mode is safe, and what to check before and after is fundamental. A wrong shutdown mode during an active workload or a wrong startup mode during recovery can make a bad situation much worse.<\/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\">The Three Stages of Database Startup<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>SHUTDOWN                NOMOUNT                  MOUNT                    OPEN\n(nothing running)       (instance only)          (instance + controlfile) (fully open)\n        \u2502                     \u2502                        \u2502                      \u2502\n        \u2502   STARTUP NOMOUNT   \u2502    ALTER DATABASE      \u2502   ALTER DATABASE     \u2502\n        \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502        MOUNT           \u2502        OPEN          \u2502\n        \u2502                     \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502\n        \u2502                     \u2502                        \u2502                      \u2502\n        \u2502  Reads:             \u2502  Reads:                \u2502  Reads:              \u2502\n        \u2502  \u25cf spfile\/pfile     \u2502  \u25cf control file        \u2502  \u25cf datafiles         \u2502\n        \u2502                     \u2502                        \u2502  \u25cf redo logs         \u2502\n        \u2502  Starts:            \u2502  Verifies:             \u2502  Performs:           \u2502\n        \u2502  \u25cf SGA allocated    \u2502  \u25cf all datafiles listed\u2502  \u25cf crash recovery    \u2502\n        \u2502  \u25cf BGPs started     \u2502  \u25cf redo logs listed    \u2502  \u25cf opens for users   \u2502\n        \u2502                     \u2502                        \u2502                      \u2502\n        \u2502  Used for:          \u2502  Used for:             \u2502  Normal operation    \u2502\n        \u2502  \u25cf RMAN restore     \u2502  \u25cf RMAN restore        \u2502                      \u2502\n        \u2502    of controlfile   \u2502  \u25cf Database rename     \u2502                      \u2502\n        \u2502  \u25cf Create DB        \u2502  \u25cf Archive log mode    \u2502                      \u2502\n        \u2502                     \u2502  \u25cf Data Guard setup    \u2502                      \u2502\n        \u2502                     \u2502  \u25cf RMAN full restore   \u2502                      \u2502<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">The Four Shutdown Modes<\/h4>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Mode<\/th><th>Waits for Sessions?<\/th><th>Waits for Transactions?<\/th><th>Checkpoints?<\/th><th>Instance Recovery Needed?<\/th><th>When to Use<\/th><\/tr><\/thead><tbody><tr><td>NORMAL<\/td><td>Yes \u2014 all sessions disconnect<\/td><td>Yes<\/td><td>Yes<\/td><td>No<\/td><td>Rarely used \u2014 too slow<\/td><\/tr><tr><td>TRANSACTIONAL<\/td><td>No new sessions, waits for active transactions<\/td><td>Yes<\/td><td>Yes<\/td><td>No<\/td><td>Graceful with active work<\/td><\/tr><tr><td>IMMEDIATE<\/td><td>Rolls back active transactions<\/td><td>No<\/td><td>Yes<\/td><td>No<\/td><td>Standard production shutdown<\/td><\/tr><tr><td>ABORT<\/td><td>Immediately kills everything<\/td><td>No<\/td><td>No<\/td><td>YES \u2014 at next startup<\/td><td>Emergency only<\/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\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> <code>SHUTDOWN ABORT<\/code> is like pulling the power cord. Oracle survives it \u2014 instance recovery runs at next startup \u2014 but it should only be used when <code>SHUTDOWN IMMEDIATE<\/code> hangs and you need the database down urgently. Never use ABORT as your standard shutdown method.<\/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\">3. Path Conventions and Environment Setup<\/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>Before any startup or shutdown \u2014 always confirm your environment variables are correct. Running startup or shutdown with the wrong ORACLE_SID is one of the most dangerous mistakes a DBA can make.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Confirm environment before ANY startup\/shutdown activity\nsu - oracle\n\n# Verify which database you are about to work on\necho \"ORACLE_SID  = $ORACLE_SID\"\necho \"ORACLE_HOME = $ORACLE_HOME\"\necho \"ORACLE_BASE = $ORACLE_BASE\"\n\n# Confirm these match what is in oratab\ngrep $ORACLE_SID \/etc\/oratab\n\n# Convention A\n# ORCL:\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1:Y\n\n# Convention B\n# ORCL:\/oracle\/RDBMS\/19.31:Y\n\n# If environment is wrong -- source the correct profile\n. ~\/.bash_profile\n\n# Or use oraenv to switch environments\n# export ORAENV_ASK=NO\n# export ORACLE_SID=ORCL\n# . oraenv<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. Pre-Startup 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 these checks before starting the database \u2014 especially after a crash, hardware maintenance, or OS reboot. Starting a database on a server that has underlying issues causes immediate re-crash or data corruption.<\/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 Check OS Resources Before Startup<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Check available RAM -- Oracle needs SGA + PGA available\nfree -m\n\n# Check if enough free memory exists for SGA\n# If swap is being heavily used -- risk of OOM kill during startup\ncat \/proc\/meminfo | grep -E \"MemFree|MemAvailable|SwapFree\"\n\n# Check filesystem space for datafiles, FRA, and archive logs\ndf -hP \/u01\/app\/oracle       # Convention A\n# df -hP \/oracle             # Convention B\n\ndf -hP \/u01\/app\/oracle\/fast_recovery_area\ndf -hP \/tmp\n\n# Check for any OS errors that may have caused a crash\ndmesg | tail -50 | grep -E \"error|OOM|killed|crash\"\ntail -100 \/var\/log\/messages | grep -E \"error|killed|OOM\"<\/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 Check Oracle Processes Are Not Already Running<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Confirm no Oracle processes are already running for this SID\n# If PMON is running -- instance is already up\nps -ef | grep ora_pmon_${ORACLE_SID} | grep -v grep\n\n# If processes exist but you cannot connect -- could be a stuck instance\n# Check all Oracle processes for this SID\nps -ef | grep _${ORACLE_SID} | grep -v grep\n\n# Check if listener is running\nlsnrctl status<\/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 Check Shared Memory Segments (After Crash\/Abort)<\/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> After <code>SHUTDOWN ABORT<\/code> or a crash, Oracle may leave shared memory segments and semaphores allocated on the OS. If you try to start the instance and these are still there, startup may fail or behave unpredictably.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Check for Oracle shared memory segments\n# As oracle user\nipcs -m | grep oracle\n\n# Check for Oracle semaphores\nipcs -s | grep oracle\n\n# If any exist after a clean shutdown -- remove them\n# ONLY do this if you are sure the instance is truly down\n# As oracle user\nipcrm -m &lt;shmid&gt;   # remove shared memory segment\nipcrm -s &lt;semid&gt;   # remove semaphore set\n\n# Automated cleanup (removes ALL oracle shared memory -- use carefully)\n# ipcs -m | grep oracle | awk '{print $2}' | xargs -I{} ipcrm -m {}\n# ipcs -s | grep oracle | awk '{print $2}' | xargs -I{} ipcrm -s {}<\/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 Parameter File Exists<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Confirm spfile or pfile exists before starting\nls -lh $ORACLE_HOME\/dbs\/spfile${ORACLE_SID}.ora\nls -lh $ORACLE_HOME\/dbs\/init${ORACLE_SID}.ora\n\n# Oracle startup file search order:\n# 1. spfile${ORACLE_SID}.ora  (e.g., spfileORCL.ora)\n# 2. spfile.ora               (generic)\n# 3. init${ORACLE_SID}.ora    (e.g., initORCL.ora -- pfile)\n\n# If spfile is in ASM or non-standard location\n# A pfile pointing to it must exist in $ORACLE_HOME\/dbs\/\n# e.g., initORCL.ora containing: SPFILE='+DATA\/ORCL\/spfileORCL.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\">4.5 \u2014 Check Alert Log for Previous Shutdown Reason<\/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> If the database was previously shut down due to an error or crash, the alert log tells you exactly what happened. Do not restart without understanding why it went down.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Check end of alert log to see why database was last shut down\ntail -100 \/u01\/app\/oracle\/diag\/rdbms\/orcl\/ORCL\/trace\/alert_ORCL.log\n\n# Convention B\ntail -100 \/oracle\/diag\/rdbms\/orcl\/ORCL\/trace\/alert_ORCL.log\n\n# Look for:\n# -- \"Shutting down instance (immediate)\" = clean IMMEDIATE shutdown\n# -- \"Shutting down instance (abort)\" = ABORT or crash\n# -- \"ORA-\" errors before shutdown = shutdown caused by error\n# -- \"Instance terminated by USER\" = manual shutdown\n# -- \"System state dump\" = Oracle detected a serious problem<\/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. Startup Modes \u2014 Complete Reference<\/h3>\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 STARTUP (Normal \u2014 Full Open)<\/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 happens:<\/strong> Oracle reads the parameter file, allocates SGA, starts background processes (NOMOUNT stage), reads control file (MOUNT stage), verifies all datafiles and redo logs are present and consistent, performs crash recovery if needed, then opens the database for user connections (OPEN stage).<\/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:<\/strong> Normal startup after a planned shutdown, after patching, after a parameter change that requires restart.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\nsqlplus \/ as sysdba<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Standard startup -- most common\nSTARTUP;\n\n-- Expected output:\n-- ORACLE instance started.\n--\n-- Total System Global Area 4294967296 bytes\n-- Fixed Size                  9144832 bytes\n-- Variable Size             855638016 bytes\n-- Database Buffers         3422552064 bytes\n-- Redo Buffers               7630848 bytes\n-- Database mounted.\n-- Database opened.<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Verify database is open\nSELECT status FROM v$instance;\n-- Must show: OPEN\n\nSELECT name, open_mode FROM v$database;\n-- Must show: open_mode = READ WRITE<\/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 STARTUP NOMOUNT<\/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 happens:<\/strong> Oracle reads the parameter file, allocates SGA, and starts background processes. The control file is NOT read. The database files are NOT accessed. Only the instance is running.<\/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:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creating a new database (DBCA uses this internally)<\/li>\n\n\n\n<li>Restoring the control file from RMAN backup (you need the instance running but no control file yet)<\/li>\n\n\n\n<li>RMAN duplicate (auxiliary instance starts in NOMOUNT)<\/li>\n\n\n\n<li>When control file is corrupt or missing<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Start instance only -- no database access\nSTARTUP NOMOUNT;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Expected output:\n-- ORACLE instance started.\n-- Total System Global Area 4294967296 bytes\n-- ...\n-- (No \"Database mounted\" or \"Database opened\" messages)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Verify NOMOUNT state\nSELECT status FROM v$instance;\n-- Must show: STARTED (not MOUNTED or OPEN)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Common use: restore control file then mount\n-- RMAN&gt; RESTORE CONTROLFILE FROM AUTOBACKUP;\n-- Then:\nALTER DATABASE MOUNT;<\/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 STARTUP MOUNT<\/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 happens:<\/strong> Oracle starts the instance (NOMOUNT) AND reads the control file. The control file tells Oracle where all datafiles and redo logs are. But the datafiles are NOT opened yet \u2014 no user data is accessible.<\/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:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enabling or disabling ARCHIVELOG mode<\/li>\n\n\n\n<li>Performing full database recovery with RMAN<\/li>\n\n\n\n<li>Enabling\/disabling FLASHBACK DATABASE<\/li>\n\n\n\n<li>Data Guard configuration<\/li>\n\n\n\n<li>Renaming datafiles (when tablespace is OFFLINE)<\/li>\n\n\n\n<li>Changing db_name with nid utility<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Start instance and mount database (reads control file)\nSTARTUP MOUNT;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Expected output:\n-- ORACLE instance started.\n-- Total System Global Area 4294967296 bytes\n-- ...\n-- Database mounted.\n-- (No \"Database opened\" message)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Verify MOUNT state\nSELECT status FROM v$instance;\n-- Must show: MOUNTED\n\nSELECT open_mode FROM v$database;\n-- Must show: MOUNTED (not READ WRITE or READ ONLY)<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Common uses after MOUNT:\n-- Enable archivelog mode:\nALTER DATABASE ARCHIVELOG;\nALTER DATABASE OPEN;\n\n-- Perform full RMAN recovery:\n-- RMAN&gt; RESTORE DATABASE;\n-- RMAN&gt; RECOVER DATABASE;\n-- ALTER DATABASE OPEN RESETLOGS;\n\n-- Enable Flashback Database:\nALTER DATABASE FLASHBACK ON;\nALTER DATABASE OPEN;<\/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 STARTUP READ ONLY<\/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 happens:<\/strong> Database opens fully but in READ ONLY mode. No DML (INSERT, UPDATE, DELETE) is allowed. Queries work normally.<\/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:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Opening a physical standby for reporting queries (Active Data Guard)<\/li>\n\n\n\n<li>Testing a restored database without allowing any changes<\/li>\n\n\n\n<li>Opening a database on a read-only file system<\/li>\n\n\n\n<li>Snapshot standby conversion<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Open database in read-only mode\nSTARTUP;            -- first start normally (MOUNT stage)\nALTER DATABASE OPEN READ ONLY;\n\n-- Or in one command\nSTARTUP;\n-- If already mounted:\n-- ALTER DATABASE OPEN READ ONLY;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Verify READ ONLY state\nSELECT name, open_mode FROM v$database;\n-- Must show: open_mode = READ ONLY\n\n-- Test that writes are rejected\nINSERT INTO hr.test VALUES (1);\n-- ORA-16000: database or pluggable database open for read-only access<\/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.5 \u2014 STARTUP RESTRICT<\/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 happens:<\/strong> Database opens fully (READ WRITE) but only users with RESTRICTED SESSION privilege can connect. Regular application users get <code>ORA-01035: ORACLE only available to users with RESTRICTED SESSION privilege<\/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\">\ud83d\udcdd <strong>When to use:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Maintenance activities while keeping DB available for DBA only<\/li>\n\n\n\n<li>Running utlrp.sql to compile invalid objects (stop application connections first)<\/li>\n\n\n\n<li>Loading initial data before going live<\/li>\n\n\n\n<li>Post-upgrade validation before allowing application users in<\/li>\n\n\n\n<li>Performing Data Pump export with no other activity<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Start in restricted mode -- DBA only\nSTARTUP RESTRICT;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Check restricted mode\nSELECT logins FROM v$instance;\n-- Must show: RESTRICTED\n\n-- Grant specific user access during maintenance\nGRANT RESTRICTED SESSION TO app_user;\n\n-- Remove restriction when maintenance is done\nALTER SYSTEM DISABLE RESTRICTED SESSION;\n\n-- Verify restriction is removed\nSELECT logins FROM v$instance;\n-- Must show: ALLOWED<\/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.6 \u2014 STARTUP FORCE<\/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 happens:<\/strong> Equivalent to <code>SHUTDOWN ABORT<\/code> followed by <code>STARTUP<\/code>. It kills any existing instance (without clean shutdown) and starts a fresh one. Used when the database is in an unknown or hung state.<\/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\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> <code>STARTUP FORCE<\/code> causes instance recovery at startup just like ABORT does. Only use it when normal startup fails because the instance is stuck.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Force startup -- kills existing instance then starts fresh\nSTARTUP FORCE;\n\n-- Verify after force startup\nSELECT status FROM v$instance;\nSELECT name, open_mode FROM v$database;<\/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.7 \u2014 STARTUP Using a Specific PFILE<\/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:<\/strong> When the spfile is corrupted, you have made a bad spfile change, or you need to test with different parameters.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Start using a specific pfile (not the default spfile)\nSTARTUP PFILE='\/u01\/app\/oracle\/admin\/ORCL\/pfile\/init_backup.ora';\n\n-- Convention B\nSTARTUP PFILE='\/oracle\/admin\/ORCL\/pfile\/init_backup.ora';\n\n-- Common recovery scenario:\n-- spfile has bad parameter that prevents startup\n-- Step 1: Create pfile from spfile (if you can get to NOMOUNT)\n-- Step 2: Edit pfile to remove bad parameter\n-- Step 3: Start with pfile\n-- Step 4: Fix spfile from running instance\n-- Step 5: Restart with spfile\n\n-- Create pfile from spfile (while DB is running or from NOMOUNT)\nCREATE PFILE='\/tmp\/initORCL_recovery.ora' FROM SPFILE;\n-- Edit the file and fix the bad parameter\n-- Then startup:\nSTARTUP PFILE='\/tmp\/initORCL_recovery.ora';\n-- Then fix spfile:\nCREATE SPFILE FROM PFILE='\/tmp\/initORCL_recovery.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\">5.8 \u2014 Manual Stage-by-Stage Startup<\/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 start stage by stage?<\/strong> In recovery scenarios you often need to stop at a specific stage. For example, during RMAN recovery you MOUNT the database, restore and recover, then OPEN. Understanding how to advance through stages manually gives you precise control.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Stage 1: Allocate memory and start processes (NOMOUNT)\nSTARTUP NOMOUNT;\n\n-- Verify NOMOUNT\nSELECT status FROM v$instance;\n-- STARTED\n\n-- Stage 2: Read control file (MOUNT)\nALTER DATABASE MOUNT;\n\n-- Verify MOUNT\nSELECT status FROM v$instance;\n-- MOUNTED\nSELECT open_mode FROM v$database;\n-- MOUNTED\n\n-- Stage 3: Open database (OPEN)\nALTER DATABASE OPEN;\n\n-- Verify OPEN\nSELECT status FROM v$instance;\n-- OPEN\nSELECT open_mode FROM v$database;\n-- READ WRITE<\/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. Shutdown Modes \u2014 Complete Reference<\/h3>\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 SHUTDOWN NORMAL<\/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 happens:<\/strong> Oracle stops accepting new connections. Waits for ALL currently connected sessions to disconnect voluntarily. Once all sessions disconnect, performs a checkpoint (writes all dirty blocks to disk) and closes the database cleanly.<\/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:<\/strong> Theoretically the cleanest shutdown. In practice almost never used in production because you could wait hours or forever for sessions to disconnect.<\/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\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> If even one session remains connected, SHUTDOWN NORMAL will wait indefinitely. The DBA must either kill those sessions or use a different shutdown mode.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Cleanest shutdown -- waits for all sessions to disconnect\nSHUTDOWN NORMAL;\n\n-- How long will it wait?\n-- Check how many sessions are connected\nSELECT COUNT(*) active_sessions\nFROM   v$session\nWHERE  type = 'USER';\n\n-- If sessions are present and you don't want to wait\n-- Either kill them manually or use IMMEDIATE<\/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 SHUTDOWN IMMEDIATE (Standard Production Shutdown)<\/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 happens:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Oracle stops accepting new connections<\/li>\n\n\n\n<li>Active transactions are rolled back (uncommitted work is lost \u2014 this is correct behavior)<\/li>\n\n\n\n<li>Connected sessions are terminated<\/li>\n\n\n\n<li>Checkpoint is performed (all dirty blocks written to disk)<\/li>\n\n\n\n<li>Database files closed cleanly<\/li>\n\n\n\n<li>Instance terminated<\/li>\n<\/ol>\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:<\/strong> This is the STANDARD production shutdown. Use for planned maintenance, patching, parameter changes, and any situation where you need the database down promptly.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Standard production shutdown -- USE THIS BY DEFAULT\nSHUTDOWN IMMEDIATE;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Expected output:\n-- Database closed.\n-- Database dismounted.\n-- ORACLE instance shut down.<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- What happens to active transactions?\n-- Any uncommitted transaction is automatically rolled back\n-- This is CORRECT Oracle behavior -- committed data is never lost\n-- Uncommitted data is INTENTIONALLY discarded (that's what COMMIT is for)<\/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>How long does SHUTDOWN IMMEDIATE take?<\/strong> Depends on:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Number of uncommitted transactions to roll back (can take minutes for large transactions)<\/li>\n\n\n\n<li>Volume of dirty blocks to write to disk during checkpoint<\/li>\n\n\n\n<li>Size of UNDO segments that need to be applied<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- If SHUTDOWN IMMEDIATE is taking too long -- check what is being rolled back\n-- In another session (while shutdown is in progress):\nSELECT usn, state, undoblks\nFROM   v$rollstat\nWHERE  usn &gt; 0\nORDER BY undoblks 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 SHUTDOWN TRANSACTIONAL<\/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 happens:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Oracle stops accepting new connections<\/li>\n\n\n\n<li>Sessions that are not in a transaction are immediately terminated<\/li>\n\n\n\n<li>Sessions WITH active transactions are allowed to complete their current transaction (COMMIT or ROLLBACK)<\/li>\n\n\n\n<li>Once all transactions are complete, remaining sessions are terminated<\/li>\n\n\n\n<li>Checkpoint and clean shutdown<\/li>\n<\/ol>\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:<\/strong> When you want a clean shutdown but have active application transactions running and want to give them a chance to complete naturally rather than forcing a rollback.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Graceful shutdown -- waits for active transactions to complete\nSHUTDOWN TRANSACTIONAL;\n\n-- Monitor progress -- check active transactions\nSELECT COUNT(*) active_transactions\nFROM   v$transaction;\n-- When this reaches 0 -- shutdown will proceed<\/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.4 \u2014 SHUTDOWN ABORT (Emergency Only)<\/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 happens:<\/strong> Oracle immediately terminates all Oracle processes, releases shared memory, and exits. No rollback. No checkpoint. No clean file closure. It is the equivalent of pulling the server power cord.<\/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 ABORT is necessary:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>SHUTDOWN IMMEDIATE<\/code> has been running for an unacceptably long time and will not complete<\/li>\n\n\n\n<li>The database is completely hung and unresponsive<\/li>\n\n\n\n<li>You need the database down NOW (emergency hardware failure, etc.)<\/li>\n\n\n\n<li>Oracle Support asks you to do it<\/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> <code>SHUTDOWN ABORT<\/code> always requires instance recovery at the NEXT startup. Oracle will automatically roll forward committed changes and roll back uncommitted changes at startup \u2014 this is normal and Oracle handles it automatically. No manual intervention needed for instance recovery.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- EMERGENCY ONLY -- causes instance recovery at next startup\nSHUTDOWN ABORT;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Expected output:\n-- ORACLE instance shut down.\n-- (No \"Database closed\" or \"Database dismounted\" messages)\n-- This confirms it was a non-clean shutdown<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Verify Oracle processes are gone after ABORT\nps -ef | grep ora_.*_ORCL | grep -v grep\n# Should return no output<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Next startup after ABORT -- Oracle automatically performs instance recovery\nSTARTUP;\n\n-- Alert log will show:\n-- \"Beginning crash recovery of 1 threads\"\n-- \"Completed crash recovery at\"\n-- \"Database opened\"\n-- This is normal and automatic -- no DBA action needed<\/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.5 \u2014 Shutdown Decision Guide<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>Which shutdown to use?\n        \u2502\n        \u251c\u2500\u2500 Is this an EMERGENCY? Database hung? Must be down NOW?\n        \u2502         \u2514\u2500\u2500 YES \u2192 SHUTDOWN ABORT\n        \u2502\n        \u251c\u2500\u2500 Is SHUTDOWN IMMEDIATE hanging for &gt; 30 minutes?\n        \u2502         \u2514\u2500\u2500 YES \u2192 SHUTDOWN ABORT (then investigate why IMMEDIATE hung)\n        \u2502\n        \u251c\u2500\u2500 Are there important transactions you want to let finish?\n        \u2502         \u2514\u2500\u2500 YES \u2192 SHUTDOWN TRANSACTIONAL\n        \u2502\n        \u2514\u2500\u2500 Standard planned maintenance?\n                  \u2514\u2500\u2500 YES \u2192 SHUTDOWN IMMEDIATE (always your default choice)<\/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. Startup and Shutdown with spfile and pfile<\/h3>\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 Understand the Parameter File Search Order<\/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 you issue <code>STARTUP<\/code> with no PFILE clause, Oracle looks for parameter files in this exact order:<\/strong><\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>Oracle looks in $ORACLE_HOME\/dbs\/ for:\n  1. spfile${ORACLE_SID}.ora  \u2192 e.g., spfileORCL.ora   (binary spfile)\n  2. spfile.ora               \u2192 generic binary spfile\n  3. init${ORACLE_SID}.ora    \u2192 e.g., initORCL.ora      (text pfile)\n\nFirst file found wins -- search stops there<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Check what parameter files exist\nls -lh $ORACLE_HOME\/dbs\/*.ora 2&gt;\/dev\/null\nls -lh $ORACLE_HOME\/dbs\/spfile*.ora 2&gt;\/dev\/null\nls -lh $ORACLE_HOME\/dbs\/init*.ora 2&gt;\/dev\/null<\/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 Create spfile from pfile (and Vice Versa)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Scenario: You have edited init.ora and want to create spfile from it\n-- Database must be down (or you can do it while running to create a new spfile)\nCREATE SPFILE FROM PFILE='\/u01\/app\/oracle\/admin\/ORCL\/pfile\/initORCL.ora';\n\n-- Create spfile from current running instance parameters\nCREATE SPFILE FROM MEMORY;\n\n-- Create pfile from spfile (to read\/edit parameter values)\nCREATE PFILE='\/tmp\/initORCL_readable.ora' FROM SPFILE;\n\n-- Create pfile from memory (shows current actual values including dynamic changes)\nCREATE PFILE='\/tmp\/initORCL_current.ora' FROM MEMORY;<\/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 Recover from a Bad Parameter Change<\/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>Very common scenario:<\/strong> A DBA changes a parameter that prevents the database from starting. Here is the recovery procedure.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Scenario: ALTER SYSTEM SET sga_target=100T SCOPE=SPFILE; \n-- (too large -- causes ORA-27102 on next startup)\n\n-- Step 1: Try to start -- fails\nSTARTUP;\n-- ORA-27102: out of memory\n\n-- Step 2: Create pfile from the corrupted spfile\n-- You need to get to NOMOUNT first -- but even that fails?\n-- Create pfile BEFORE the failed startup attempt using OS-level spfile\n-- Or if you can get to NOMOUNT:\nSTARTUP NOMOUNT;  -- this might work before reading spfile parameters\nCREATE PFILE='\/tmp\/initORCL_fix.ora' FROM SPFILE;\nSHUTDOWN ABORT;\n\n-- Step 3: Edit the pfile and fix the bad parameter\nvi \/tmp\/initORCL_fix.ora\n-- Find the bad line: sga_target=107374182400000\n-- Change to: sga_target=4G\n\n-- Step 4: Start using the fixed pfile\nSTARTUP PFILE='\/tmp\/initORCL_fix.ora';\n\n-- Step 5: Recreate the spfile from the fixed pfile\nCREATE SPFILE FROM PFILE='\/tmp\/initORCL_fix.ora';\n\n-- Step 6: Restart using the new corrected spfile\nSHUTDOWN IMMEDIATE;\nSTARTUP;\n\n-- Step 7: Verify\nSHOW PARAMETER sga_target;<\/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. Post-Startup 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> Never hand over a database after startup without completing these checks. A database that appears to start fine may have underlying issues that only manifest after a few minutes.<\/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 Verify Instance and Database Status<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\n-- Check instance status\nset linesize 200\nset pagesize 50\ncol instance_name  for a15\ncol host_name      for a25\ncol version_full   for a20\ncol status         for a12\ncol logins         for a12\ncol startup_time   for a25\n\nSELECT instance_name,\n       host_name,\n       version_full,\n       status,\n       logins,\n       TO_CHAR(startup_time,'YYYY-MM-DD HH24:MI:SS') startup_time\nFROM   v$instance;\n\n-- Check database open mode\ncol name           for a12\ncol db_unique_name for a20\ncol open_mode      for a15\ncol log_mode       for a15\ncol database_role  for a20\n\nSELECT name, db_unique_name, open_mode, log_mode, database_role\nFROM   v$database;<\/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 Check All Datafiles Are Online<\/h4>\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\n-- Check for any offline or recovery-needed datafiles\nSELECT file#, tablespace_name, status, name\nFROM   v$datafile\nWHERE  status NOT IN ('ONLINE','SYSTEM')\nORDER BY file#;\n\n-- No rows = all datafiles online (good)\n-- Any rows = problem that needs immediate attention<\/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 Check All Tablespaces Are Online<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 150\nset pagesize 100\ncol tablespace_name for a25\ncol status          for a12\n\nSELECT tablespace_name, status\nFROM   dba_tablespaces\nWHERE  status != 'ONLINE'\nORDER BY tablespace_name;\n\n-- No rows = all tablespaces online (good)<\/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 Verify Background Processes Started<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Verify all expected background processes are running\nps -ef | grep ora_.*_${ORACLE_SID} | grep -v grep | sort\n\n# Key processes that must be present\nps -ef | grep -E \"ora_pmon|ora_smon|ora_dbw|ora_lgwr|ora_ckpt|ora_mmon\" | \\\n    grep ${ORACLE_SID} | grep -v grep<\/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.5 \u2014 Check Redo Logs Are Active<\/h4>\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 group# l#, sequence#, bytes\/1024\/1024 size_mb,\n       status, archived\nFROM   v$log\nORDER BY group#;\n\n-- One group must show CURRENT\n-- All others should be INACTIVE or ACTIVE<\/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.6 \u2014 Check Archiving is Working (ARCHIVELOG Mode)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Check archiving status\nARCHIVE LOG LIST;\n\n-- Force a log switch and confirm archiving works\nALTER SYSTEM SWITCH LOGFILE;\n\n-- Wait 10 seconds then check a new archivelog was created\nSELECT sequence#,\n       TO_CHAR(completion_time,'YYYY-MM-DD HH24:MI:SS') completed\nFROM   v$archived_log\nWHERE  completion_time &gt; SYSDATE - 1\/1440\nORDER BY sequence# DESC\nFETCH FIRST 5 ROWS ONLY;<\/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.7 \u2014 Check Alert Log After Startup<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Most important post-startup check\n# The alert log shows exactly what Oracle did during startup\n# and any errors encountered\ntail -100 \/u01\/app\/oracle\/diag\/rdbms\/orcl\/ORCL\/trace\/alert_ORCL.log\n\n# What to look for:\n# GOOD: \"Database opened\"\n# GOOD: \"Completed crash recovery\" (after ABORT -- normal)\n# BAD: Any ORA- errors after \"Database opened\"\n# BAD: \"Errors in file\" messages\n# BAD: \"ORA-600\" or \"ORA-7445\" (internal errors)\n\n# Filter for errors only\ngrep \"ORA-\" \/u01\/app\/oracle\/diag\/rdbms\/orcl\/ORCL\/trace\/alert_ORCL.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\">8.8 \u2014 Verify Listener Registered the Database<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Check listener knows about the database\nlsnrctl status\n\n# Look for the service in lsnrctl output\nlsnrctl services | grep -i \"service\\|instance\"\n\n# If not registered -- force registration\nsqlplus \/ as sysdba<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>ALTER SYSTEM REGISTER;\nEXIT;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Wait 10 seconds then check again\nlsnrctl status<\/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.9 \u2014 Test Database Connectivity After Startup<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Test local OS-authenticated connection\nsqlplus \/ as sysdba\n\n# Test TNS connection (confirms listener + network work)\nsqlplus system\/Oracle_123@ORCL\n\n# Test application user can connect\nsqlplus hr\/Hr_123@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\">8.10 \u2014 Check Invalid Objects After Startup<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysdba\n\nset linesize 180\nset pagesize 100\ncol owner       for a20\ncol object_name for a45\ncol object_type for a25\n\nSELECT COUNT(*) invalid_objects\nFROM   dba_objects\nWHERE  status = 'INVALID';\n\n-- If count is unexpectedly high\n-- Recompile\n@?\/rdbms\/admin\/utlrp.sql\n\n-- Verify after recompile\nSELECT COUNT(*) FROM dba_objects WHERE status = 'INVALID';<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">9. Common Startup Failures and Fixes<\/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>This section covers the most common startup errors a consultant encounters. Know these cold.<\/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\">9.1 \u2014 ORA-01078: Failure in Processing System Parameters<\/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>Cause:<\/strong> spfile or pfile not found, or has an invalid parameter.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Error during startup:\n-- ORA-01078: failure in processing system parameters\n-- LRM-00109: could not open parameter file '\/u01\/app\/...\/dbs\/initORCL.ora'<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Fix: Check if parameter file exists\nls -lh $ORACLE_HOME\/dbs\/spfile${ORACLE_SID}.ora\nls -lh $ORACLE_HOME\/dbs\/init${ORACLE_SID}.ora\n\n# If missing -- create a minimal pfile\ncat &gt; $ORACLE_HOME\/dbs\/init${ORACLE_SID}.ora &lt;&lt; EOF\ndb_name=ORCL\nEOF\n\n# Then startup with this minimal pfile and restore from backup\nsqlplus \/ as sysdba\nSTARTUP PFILE='$ORACLE_HOME\/dbs\/initORCL.ora';\n-- Then restore spfile from RMAN backup<\/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 ORA-00205: Error in Identifying Control File<\/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>Cause:<\/strong> Control file listed in parameter file does not exist or cannot be opened. Either the path is wrong or the control file was deleted\/corrupted.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Error during startup:\n-- ORA-00205: error in identifying control file, check alert log for more info<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Check what control files Oracle is looking for\nSHOW PARAMETER control_files;\n\n-- Check alert log for more detail\n-- grep \"ORA-00205\" \/path\/to\/alert_ORCL.log<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Fix 1: If control file path is wrong in parameter\n# Create pfile, fix path, restart\nsqlplus \/ as sysdba\nSTARTUP NOMOUNT;\nCREATE PFILE='\/tmp\/initfix.ora' FROM SPFILE;\nSHUTDOWN ABORT;\nvi \/tmp\/initfix.ora\n# Fix control_files parameter to correct path\nSTARTUP PFILE='\/tmp\/initfix.ora';\nCREATE SPFILE FROM PFILE='\/tmp\/initfix.ora';\nSHUTDOWN IMMEDIATE;\nSTARTUP;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Fix 2: If control file is missing\n# Restore from RMAN backup\nrman target \/<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>STARTUP NOMOUNT;\nRESTORE CONTROLFILE FROM AUTOBACKUP;\nALTER DATABASE MOUNT;\nRECOVER DATABASE;\nALTER DATABASE OPEN RESETLOGS;<\/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 ORA-01157: Cannot Identify\/Lock Data File<\/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>Cause:<\/strong> A datafile listed in the control file cannot be found. The file was deleted, moved, or the disk is unavailable.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Error during database open:\n-- ORA-01157: cannot identify\/lock data file 5 - see DBWR trace file\n-- ORA-01110: data file 5: '\/u01\/app\/oracle\/oradata\/ORCL\/users01.dbf'<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Check which file is missing\nSELECT file#, name, status FROM v$datafile WHERE status != 'ONLINE';\n\n-- Fix 1: If file was accidentally moved -- rename it back\nALTER DATABASE RENAME FILE\n    '\/old\/path\/users01.dbf'\n    TO '\/u01\/app\/oracle\/oradata\/ORCL\/users01.dbf';\nALTER DATABASE OPEN;\n\n-- Fix 2: If file is truly gone -- restore from RMAN\n-- Keep database in MOUNT state\n-- Then in RMAN:<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>rman target \/<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>RESTORE DATAFILE 5;\nRECOVER DATAFILE 5;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>ALTER DATABASE OPEN;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Fix 3: If tablespace is not critical and you want to open without it\n-- (last resort -- tablespace data is lost)\nALTER DATABASE DATAFILE 5 OFFLINE DROP;\nALTER DATABASE OPEN;\n-- Then drop the tablespace\nDROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;<\/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 ORA-27102: Out of Memory<\/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>Cause:<\/strong> Oracle cannot allocate the SGA because there is not enough free memory on the server. SGA_TARGET or MEMORY_TARGET is set too large.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Error during startup:\n-- ORA-27102: out of memory\n-- Linux-x86_64 Error: 28: No space left on device<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Check available memory\nfree -m\n\n# Check current SGA_TARGET in spfile\n# Since DB won't start, read the spfile directly\n# Create pfile to read it\n# Start in NOMOUNT using minimal pfile\ncat &gt; \/tmp\/init_minimal.ora &lt;&lt; EOF\ndb_name=ORCL\nEOF\n\nsqlplus \/ as sysdba\nSTARTUP NOMOUNT PFILE='\/tmp\/init_minimal.ora';<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Hmm -- even NOMOUNT with minimal pfile works\n-- Now create pfile from spfile to see what's set\nCREATE PFILE='\/tmp\/initfull.ora' FROM SPFILE;\nSHUTDOWN ABORT;\n-- Edit pfile and reduce SGA_TARGET\nvi \/tmp\/initfull.ora\n-- Change: sga_target=100T to sga_target=4G (or appropriate value)\n\nSTARTUP PFILE='\/tmp\/initfull.ora';\n-- Fix the spfile\nCREATE SPFILE FROM PFILE='\/tmp\/initfull.ora';\nSHUTDOWN IMMEDIATE;\nSTARTUP;<\/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 ORA-00600: Internal Error at Startup<\/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>Cause:<\/strong> Oracle internal error. Could be many things \u2014 corrupted system tablespace, corrupted data dictionary, software bug.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Check alert log for exact ORA-600 error code\ngrep \"ORA-600\" \/u01\/app\/oracle\/diag\/rdbms\/orcl\/ORCL\/trace\/alert_ORCL.log | tail -5\n\n# Note the error code: e.g., ORA-600 &#91;4194] or ORA-600 &#91;17182]\n# Search MOS for the specific code\n# https:\/\/support.oracle.com -- search \"ORA-600 &#91;&lt;code&gt;]\"<\/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 For ORA-600 errors at startup always open an Oracle Support Service Request (SR) with the alert log and trace files. MOS Doc ID <strong>1523319.1<\/strong> has ORA-600 lookup tool.<\/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.6 \u2014 Database Hangs During Startup (Instance Recovery Taking Too Long)<\/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>Cause:<\/strong> After SHUTDOWN ABORT or crash, Oracle is performing instance recovery \u2014 rolling forward and backward a large number of transactions. This is normal but can take a long time if there were many uncommitted transactions or if redo logs are large.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># While startup appears hung -- check what SMON is doing\n# In another terminal\nps -ef | grep ora_smon_ORCL | grep -v grep\n# SMON should be running (consuming CPU during recovery)\n\n# Check alert log to confirm recovery is in progress\ntail -f \/u01\/app\/oracle\/diag\/rdbms\/orcl\/ORCL\/trace\/alert_ORCL.log\n# Look for: \"Beginning crash recovery\"\n# Then: \"Recovery of Online Redo Log: Thread 1 Group N...\"\n# Then: \"Completed crash recovery\"\n# Wait for \"Database opened\" before concluding startup\n\n# Monitor recovery progress\n# In sqlplus (if you can connect while mounted)\nsqlplus \/ as sysdba\nSELECT * FROM v$fast_start_progress;\n-- Shows: ESTIMATED_WORK, WORK_DONE, WORK_REMAINING<\/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. CDB and PDB Startup and Shutdown<\/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>In a Container Database (CDB) environment, startup and shutdown has additional complexity because you have the CDB root and multiple PDBs, each with their own open\/close state.<\/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\">10.1 \u2014 CDB Startup and Shutdown Overview<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>CDB Startup\/Shutdown relationship:\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nWhen CDB starts   \u2192 All PDBs start in MOUNTED state (not open) by default\nWhen CDB shuts    \u2192 All PDBs are automatically closed\n\nCDB open_mode = READ WRITE \u2192 does NOT mean PDBs are open\nPDBs must be opened individually OR via saved open state\n\nPDB open modes:\n  MOUNTED    \u2192 PDB is associated with CDB but not accessible\n  READ WRITE \u2192 PDB is fully open for users\n  READ ONLY  \u2192 PDB is open for queries only\n  MIGRATE    \u2192 PDB is in upgrade 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\">10.2 \u2014 Start CDB and Check PDB Status<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Start the CDB (same as standalone startup)\nSTARTUP;\n\n-- Check CDB status\nSELECT name, open_mode FROM v$database;\n-- open_mode = READ WRITE (CDB is open)\n\n-- Check PDB status after CDB startup\nset linesize 200\nset pagesize 100\ncol name      for a20\ncol open_mode for a15\ncol restricted for a5\n\nSELECT con_id, name, open_mode, restricted\nFROM   v$pdbs\nORDER BY con_id;\n\n-- Typically after CDB startup:\n-- CON_ID NAME        OPEN_MODE   RESTRICTED\n-- 2      PDB$SEED    READ ONLY   NO         (seed is always read only)\n-- 3      PDB1        MOUNTED     NO         (needs to be opened)\n-- 4      PDB2        MOUNTED     NO         (needs to be opened)<\/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 Open Individual PDBs<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Open a specific PDB\nALTER PLUGGABLE DATABASE PDB1 OPEN;\n\n-- Open PDB in read-only mode\nALTER PLUGGABLE DATABASE PDB1 OPEN READ ONLY;\n\n-- Open ALL PDBs in the CDB at once\nALTER PLUGGABLE DATABASE ALL OPEN;\n\n-- Open all PDBs except specific ones\nALTER PLUGGABLE DATABASE ALL EXCEPT PDB_MAINT OPEN;\n\n-- Open with restricted access (DBA only)\nALTER PLUGGABLE DATABASE PDB1 OPEN RESTRICTED;\n\n-- Verify PDB is open\nSELECT con_id, name, open_mode\nFROM   v$pdbs\nWHERE  name = 'PDB1';<\/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 Close Individual PDBs<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Close a specific PDB (without shutting CDB)\nALTER PLUGGABLE DATABASE PDB1 CLOSE IMMEDIATE;\n\n-- Close all PDBs\nALTER PLUGGABLE DATABASE ALL CLOSE IMMEDIATE;\n\n-- Verify PDB is closed\nSELECT con_id, name, open_mode\nFROM   v$pdbs\nWHERE  name = 'PDB1';\n-- open_mode = MOUNTED<\/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 Save PDB Open State (Auto-Open After CDB Restart)<\/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 save state?<\/strong> By default PDBs are MOUNTED after CDB restart and must be manually opened. In production you want PDBs to automatically open when the CDB starts. <code>SAVE STATE<\/code> persists the current open mode so it is restored automatically.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Save state so PDB auto-opens when CDB restarts\nALTER PLUGGABLE DATABASE PDB1 SAVE STATE;\n\n-- Save state for all PDBs at once\nALTER PLUGGABLE DATABASE ALL SAVE STATE;\n\n-- Verify saved state\nset linesize 200\nset pagesize 100\ncol con_name   for a20\ncol instance_name for a15\ncol state      for a15\n\nSELECT con_name, instance_name, state\nFROM   dba_pdb_saved_states\nORDER BY con_name;\n\n-- Discard saved state (PDB will be MOUNTED on next CDB start)\nALTER PLUGGABLE DATABASE PDB1 DISCARD STATE;<\/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 Connect to a Specific PDB<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Method 1: Connect directly using service name (preferred)\nsqlplus hr\/Hr_123@PDB1\n\n-- Method 2: Connect to CDB then switch container\nsqlplus \/ as sysdba\nALTER SESSION SET CONTAINER = PDB1;\n\n-- Verify you are in the correct container\nSELECT sys_context('USERENV','CON_NAME')  current_container,\n       sys_context('USERENV','CON_ID')    con_id\nFROM   dual;\n\n-- Switch back to CDB root\nALTER SESSION SET CONTAINER = CDB$ROOT;<\/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 CDB Shutdown<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Shutting down CDB automatically closes all PDBs first\n-- Use same modes as non-CDB\n\n-- Standard CDB shutdown\nSHUTDOWN IMMEDIATE;\n\n-- What happens:\n-- All PDBs are closed first (CLOSE IMMEDIATE applied to each PDB)\n-- CDB then shuts down cleanly<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">11. RAC Startup and Shutdown<\/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>In RAC, each node has its own Oracle instance. All instances access the same database files on shared storage. You manage instances using <code>srvctl<\/code> \u2014 Oracle&#8217;s cluster resource manager.<\/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 RAC Startup with srvctl (Recommended)<\/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 use srvctl instead of sqlplus for RAC?<\/strong> srvctl starts\/stops RAC resources in the correct dependency order \u2014 ASM first, then database instances, then listeners. It also coordinates with Clusterware so the cluster knows the resource state. Starting instances directly with sqlplus in RAC bypasses Clusterware and can cause inconsistencies.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># As oracle user\nsu - oracle\n\n# Start the entire RAC database on ALL nodes\n$ORACLE_HOME\/bin\/srvctl start database -db RACDB\n\n# Start database on a specific node only\n$ORACLE_HOME\/bin\/srvctl start instance \\\n    -db RACDB \\\n    -instance RACDB1\n\n# Start with a specific startup option\n$ORACLE_HOME\/bin\/srvctl start instance \\\n    -db RACDB \\\n    -instance RACDB1 \\\n    -startoption MOUNT   # or OPEN, NOMOUNT\n\n# Check status of all instances\n$ORACLE_HOME\/bin\/srvctl status database -db RACDB\n\n# Expected output:\n# Instance RACDB1 is running on node racnode1\n# Instance RACDB2 is running on node 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\">11.2 \u2014 RAC Shutdown with srvctl<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Stop entire RAC database (all instances)\n$ORACLE_HOME\/bin\/srvctl stop database \\\n    -db RACDB \\\n    -stopoption immediate\n\n# Stop specific instance only\n$ORACLE_HOME\/bin\/srvctl stop instance \\\n    -db RACDB \\\n    -instance RACDB1 \\\n    -stopoption immediate\n\n# Verify shutdown\n$ORACLE_HOME\/bin\/srvctl status database -db RACDB\n\n# Stop with abort (emergency)\n$ORACLE_HOME\/bin\/srvctl stop database \\\n    -db RACDB \\\n    -stopoption abort<\/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.3 \u2014 RAC Startup\/Shutdown via SQL*Plus (When srvctl is Not Available)<\/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>Sometimes you need to use sqlplus for RAC instance management \u2014 for example when Clusterware is down but you need to start the database for recovery.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Connect to specific instance (on that node)\n# On racnode1:\nexport ORACLE_SID=RACDB1\nsqlplus \/ as sysdba<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Start this instance only (not the whole cluster)\nSTARTUP;\n\n-- Check which node you are on\nSELECT instance_name, host_name FROM v$instance;\n\n-- Check all instances in the cluster\nSELECT inst_id, instance_name, host_name, status\nFROM   gv$instance\nORDER BY inst_id;<\/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 Rolling Restart in RAC (Zero Downtime)<\/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>One of RAC&#8217;s greatest advantages is that you can restart one instance while the other continues serving users \u2014 zero application downtime.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Step 1: Relocate all services away from node1\n$ORACLE_HOME\/bin\/srvctl relocate service \\\n    -db RACDB \\\n    -service RACDB_APP \\\n    -oldinst RACDB1 \\\n    -newinst RACDB2\n\n# Step 2: Stop instance on node1 only\n$ORACLE_HOME\/bin\/srvctl stop instance \\\n    -db RACDB \\\n    -instance RACDB1 \\\n    -stopoption immediate\n\n# Step 3: Do your maintenance on node1\n# (patch, parameter change, etc.)\n\n# Step 4: Restart instance on node1\n$ORACLE_HOME\/bin\/srvctl start instance \\\n    -db RACDB \\\n    -instance RACDB1\n\n# Step 5: Relocate services back\n$ORACLE_HOME\/bin\/srvctl relocate service \\\n    -db RACDB \\\n    -service RACDB_APP \\\n    -oldinst RACDB2 \\\n    -newinst RACDB1\n\n# Verify\n$ORACLE_HOME\/bin\/srvctl status database -db RACDB\n$ORACLE_HOME\/bin\/srvctl status service -db 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\">12. Data Guard \u2014 Startup and Shutdown Considerations<\/h3>\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 Startup Sequence in Data Guard<\/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\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> In a Data Guard environment, startup and shutdown sequence matters. If you start the standby before the primary, or shut down the primary without proper consideration for the standby, you can cause redo gap issues.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>Correct startup order:\n1. Start PRIMARY database first\n2. Start STANDBY database (MRP will automatically sync)\n\nCorrect shutdown order:\n1. Stop STANDBY MRP first (optional but cleaner)\n2. Shut down PRIMARY\n3. Shut down STANDBY<\/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 Start Primary and Verify Standby Syncs<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On PRIMARY -- start normally\nSTARTUP;\n\n-- Check primary is open and shipping redo\nSELECT name, open_mode, database_role FROM v$database;\n\nSELECT dest_id, status, error\nFROM   v$archive_dest\nWHERE  dest_id = 2;\n-- Must show: STATUS = VALID<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On STANDBY -- start and begin apply\nSTARTUP MOUNT;\n\n-- Start MRP (Managed Recovery Process)\nALTER DATABASE RECOVER MANAGED STANDBY DATABASE\n    USING CURRENT LOGFILE\n    DISCONNECT FROM SESSION;\n\n-- Verify apply is running\nSELECT process, status, sequence#\nFROM   v$managed_standby\nWHERE  process = 'MRP0';<\/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 Shut Down in Data Guard Environment<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- On STANDBY -- stop MRP first\nALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;\n\n-- Verify MRP stopped\nSELECT process, status\nFROM   v$managed_standby\nWHERE  process = 'MRP0';\n-- No rows = MRP stopped\n\n-- Shutdown standby\nSHUTDOWN IMMEDIATE;\n\n-- On PRIMARY -- shutdown after standby is down\nSHUTDOWN IMMEDIATE;<\/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. Automatic Startup 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\">\ud83d\udcdd <strong>Production databases must restart automatically after a server reboot.<\/strong> OS-level automation ensures the database comes up without requiring a DBA to manually start it at 3 AM after a power outage or OS patching reboot.<\/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\">13.1 \u2014 Configure Auto-Startup Using systemd (OL7\/OL8\/RHEL7\/RHEL8)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># As root -- create systemd service file\nvi \/etc\/systemd\/system\/oracle-db.service<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=Oracle Database Service for ORCL\n# Start AFTER the network is up (listener needs network)\nAfter=network.target\n\n&#91;Service]\n# Type=forking: dbstart launches Oracle then exits\n# Oracle processes continue running in background\nType=forking\nUser=oracle\nGroup=oinstall\n\n# ExecStart: dbstart reads \/etc\/oratab and starts all Y-flagged databases\n# Argument is ORACLE_HOME so dbstart can find Oracle binaries\nExecStart=\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/bin\/dbstart \\\n          \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\n\n# ExecStop: dbshut cleanly shuts down all Y-flagged databases\nExecStop=\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\/bin\/dbshut \\\n         \/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\n\n# RemainAfterExit=yes: service remains \"active\" even after dbstart exits\n# (Oracle processes continue running -- they are the actual service)\nRemainAfterExit=yes\n\n&#91;Install]\n# multi-user.target = normal Linux boot (runlevel 3 equivalent)\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Reload systemd and enable\/start the service\nsystemctl daemon-reload\nsystemctl enable oracle-db.service\nsystemctl start oracle-db.service\n\n# Verify service status\nsystemctl status oracle-db.service\n\n# Expected output:\n# \u25cf oracle-db.service - Oracle Database Service for ORCL\n#    Loaded: loaded (\/etc\/systemd\/system\/oracle-db.service; enabled)\n#    Active: active (exited) since ...\n# NOTE: \"active (exited)\" is CORRECT for Type=forking -- not an error<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">13.2 \u2014 Verify \/etc\/oratab is Correct<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># \/etc\/oratab controls which databases dbstart\/dbshut manages\n# Format: SID:ORACLE_HOME:Y\/N\n# Y = auto-start, N = do not auto-start\n\ncat \/etc\/oratab\n\n# Expected entry for auto-start:\n# ORCL:\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1:Y\n\n# Change N to Y to enable auto-start\nvi \/etc\/oratab\n# Find the ORCL line and change the last character to Y<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">13.3 \u2014 Test Auto-Startup by Rebooting<\/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\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Always test auto-startup in a non-production environment before relying on it in production.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Test auto-startup (schedule a reboot at a safe time)\nsudo reboot\n\n# After server comes back up -- verify database started automatically\nsu - oracle\nsqlplus \/ as sysdba\nSELECT status FROM v$instance;\n-- Must show: OPEN (without manual intervention)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">14. Pre-Shutdown Checklist<\/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 checklist before every planned database shutdown \u2014 especially for production.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Run all these before shutting down production\n\n-- 1. How many users are connected?\nSELECT COUNT(*) active_sessions\nFROM   v$session\nWHERE  type = 'USER';\n\n-- 2. Are there any long-running transactions?\nSELECT s.username, s.machine, t.start_time,\n       ROUND((SYSDATE - CAST(t.start_time AS DATE))*24*60,0) minutes\nFROM   v$transaction t, v$session s\nWHERE  t.ses_addr = s.saddr\nORDER BY t.start_time;\n\n-- 3. Is any RMAN backup running?\nSELECT status, start_time, output_device_type\nFROM   v$rman_status\nWHERE  status = 'RUNNING';\n\n-- 4. Are any Data Pump jobs running?\nSELECT job_name, state, operation\nFROM   dba_datapump_jobs\nWHERE  state = 'EXECUTING';\n\n-- 5. Are any scheduled jobs running?\nSELECT job_name, running_instance, elapsed_time\nFROM   dba_scheduler_running_jobs;\n\n-- 6. Is archiving working (no backlog)?\nSELECT dest_id, status, error\nFROM   v$archive_dest\nWHERE  dest_id IN (1,2)\nAND    status != 'INACTIVE';\n\n-- 7. Is FRA space OK (should not be near full at shutdown)?\nSELECT name,\n       ROUND(space_used\/space_limit*100,2) pct_used\nFROM   v$recovery_file_dest;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">15. 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>Full startup<\/td><td><code>STARTUP;<\/code><\/td><\/tr><tr><td>Start NOMOUNT<\/td><td><code>STARTUP NOMOUNT;<\/code><\/td><\/tr><tr><td>Start MOUNT<\/td><td><code>STARTUP MOUNT;<\/code><\/td><\/tr><tr><td>Start READ ONLY<\/td><td><code>STARTUP; ALTER DATABASE OPEN READ ONLY;<\/code><\/td><\/tr><tr><td>Start RESTRICT<\/td><td><code>STARTUP RESTRICT;<\/code><\/td><\/tr><tr><td>Start FORCE<\/td><td><code>STARTUP FORCE;<\/code><\/td><\/tr><tr><td>Start with pfile<\/td><td><code>STARTUP PFILE='\/path\/init.ora';<\/code><\/td><\/tr><tr><td>Advance NOMOUNT\u2192MOUNT<\/td><td><code>ALTER DATABASE MOUNT;<\/code><\/td><\/tr><tr><td>Advance MOUNT\u2192OPEN<\/td><td><code>ALTER DATABASE OPEN;<\/code><\/td><\/tr><tr><td>Open with RESETLOGS<\/td><td><code>ALTER DATABASE OPEN RESETLOGS;<\/code><\/td><\/tr><tr><td>Enable RESTRICT mode<\/td><td><code>ALTER SYSTEM ENABLE RESTRICTED SESSION;<\/code><\/td><\/tr><tr><td>Disable RESTRICT mode<\/td><td><code>ALTER SYSTEM DISABLE RESTRICTED SESSION;<\/code><\/td><\/tr><tr><td>Shutdown IMMEDIATE<\/td><td><code>SHUTDOWN IMMEDIATE;<\/code><\/td><\/tr><tr><td>Shutdown NORMAL<\/td><td><code>SHUTDOWN NORMAL;<\/code><\/td><\/tr><tr><td>Shutdown TRANSACTIONAL<\/td><td><code>SHUTDOWN TRANSACTIONAL;<\/code><\/td><\/tr><tr><td>Shutdown ABORT<\/td><td><code>SHUTDOWN ABORT;<\/code><\/td><\/tr><tr><td>Create spfile from pfile<\/td><td><code>CREATE SPFILE FROM PFILE='\/path\/init.ora';<\/code><\/td><\/tr><tr><td>Create pfile from spfile<\/td><td><code>CREATE PFILE='\/tmp\/init.ora' FROM SPFILE;<\/code><\/td><\/tr><tr><td>Create pfile from memory<\/td><td><code>CREATE PFILE='\/tmp\/init.ora' FROM MEMORY;<\/code><\/td><\/tr><tr><td>Check instance status<\/td><td><code>SELECT status FROM v$instance;<\/code><\/td><\/tr><tr><td>Check DB open mode<\/td><td><code>SELECT name,open_mode FROM v$database;<\/code><\/td><\/tr><tr><td>Check login mode<\/td><td><code>SELECT logins FROM v$instance;<\/code><\/td><\/tr><tr><td>Force listener registration<\/td><td><code>ALTER SYSTEM REGISTER;<\/code><\/td><\/tr><tr><td>Start RAC database<\/td><td><code>srvctl start database -db RACDB<\/code><\/td><\/tr><tr><td>Stop RAC database<\/td><td><code>srvctl stop database -db RACDB -stopoption immediate<\/code><\/td><\/tr><tr><td>Start RAC instance<\/td><td><code>srvctl start instance -db RACDB -instance RACDB1<\/code><\/td><\/tr><tr><td>Stop RAC instance<\/td><td><code>srvctl stop instance -db RACDB -instance RACDB1 -stopoption immediate<\/code><\/td><\/tr><tr><td>RAC database status<\/td><td><code>srvctl status database -db RACDB<\/code><\/td><\/tr><tr><td>Open all PDBs<\/td><td><code>ALTER PLUGGABLE DATABASE ALL OPEN;<\/code><\/td><\/tr><tr><td>Close specific PDB<\/td><td><code>ALTER PLUGGABLE DATABASE PDB1 CLOSE IMMEDIATE;<\/code><\/td><\/tr><tr><td>Save PDB state<\/td><td><code>ALTER PLUGGABLE DATABASE ALL SAVE STATE;<\/code><\/td><\/tr><tr><td>Check PDB status<\/td><td><code>SELECT con_id,name,open_mode FROM v$pdbs;<\/code><\/td><\/tr><tr><td>Switch to PDB<\/td><td><code>ALTER SESSION SET CONTAINER = PDB1;<\/code><\/td><\/tr><tr><td>Switch to CDB root<\/td><td><code>ALTER SESSION SET CONTAINER = CDB$ROOT;<\/code><\/td><\/tr><tr><td>Start MRP (standby)<\/td><td><code>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;<\/code><\/td><\/tr><tr><td>Stop MRP (standby)<\/td><td><code>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;<\/code><\/td><\/tr><tr><td>Enable auto-startup<\/td><td><code>systemctl enable oracle-db.service<\/code><\/td><\/tr><tr><td>Check oratab<\/td><td><code>cat \/etc\/oratab<\/code><\/td><\/tr><tr><td>Check active sessions<\/td><td><code>SELECT COUNT(*) FROM v$session WHERE type='USER';<\/code><\/td><\/tr><tr><td>Check active transactions<\/td><td><code>SELECT s.username,t.start_time FROM v$transaction t,v$session s WHERE t.ses_addr=s.saddr;<\/code><\/td><\/tr><tr><td>MOS Startup Shutdown<\/td><td>Doc ID 1359094.1<\/td><\/tr><tr><td>MOS CDB PDB Startup<\/td><td>Doc ID 2059171.1<\/td><\/tr><tr><td>MOS RAC Startup<\/td><td>Doc ID 1586986.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 start and shut down Oracle databases in all configurations \u2014 standalone, CDB\/PDB, RAC, and Data Guard \u2014 without referring to any other source. Always confirm your ORACLE_SID before any startup or shutdown, always use SHUTDOWN IMMEDIATE as your default shutdown method, always check the alert log after every startup, always save PDB state so they open automatically after CDB restart, and always test auto-startup configuration after setting it up so you are not surprised during an actual server reboot.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A complete production-ready SOP for Oracle Database startup and shutdown procedures on Linux. Covers all startup modes, all shutdown modes, pfile vs spfile startup, startup and shutdown in RAC environments, CDB and PDB startup and shutdown, common startup failures and fixes, automatic startup configuration, and full pre and post checks \u2014 with real commands, expected [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5826,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"googlesitekit_rrm_CAowu461DA:productID":"","footnotes":""},"categories":[1534],"tags":[],"class_list":["post-5825","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\/5825","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=5825"}],"version-history":[{"count":1,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5825\/revisions"}],"predecessor-version":[{"id":5827,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5825\/revisions\/5827"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media\/5826"}],"wp:attachment":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media?parent=5825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/categories?post=5825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/tags?post=5825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}