3806  words
  19  minutes 
  Oracle Database 23c Setup - Complete Installation and Configuration Guide 
   Anubhav Gain 
    2025-01-29 
       Oracle Database 23c Setup
Oracle Database 23c introduces groundbreaking features including AI Vector Search, JSON Relational Duality, and enhanced security capabilities. This guide provides a complete walkthrough for installing and configuring Oracle Database 23c in enterprise environments.
Oracle Database 23c Architecture Overview
Understanding the Oracle 23c architecture is crucial for proper installation and configuration:
graph TB    subgraph "Oracle Database 23c Architecture"        subgraph "Instance Components"            SGA[System Global Area]            PGA[Program Global Area]            BGP[Background Processes]
            subgraph "SGA Components"                DB_CACHE[Database Buffer Cache]                SHARED_POOL[Shared Pool]                REDO_BUFFER[Redo Log Buffer]                LARGE_POOL[Large Pool]                JAVA_POOL[Java Pool]                STREAMS_POOL[Streams Pool]            end
            subgraph "Background Processes"                PMON[PMON - Process Monitor]                SMON[SMON - System Monitor]                DBWn[DBWn - Database Writer]                LGWR[LGWR - Log Writer]                CKPT[CKPT - Checkpoint]                ARCn[ARCn - Archiver]            end        end
        subgraph "Database Storage"            SYSTEM[SYSTEM Tablespace]            SYSAUX[SYSAUX Tablespace]            UNDO[UNDO Tablespace]            TEMP[TEMP Tablespace]            USERS[USER Tablespaces]
            subgraph "Physical Files"                DATAFILES[Data Files]                CTLFILES[Control Files]                REDOLOGS[Redo Log Files]                ARCHIVELOG[Archive Log Files]                SPFILE[SPFILE/PFILE]            end        end
        subgraph "New 23c Features"            AI_VECTOR[AI Vector Search]            JSON_DUALITY[JSON Relational Duality]            TRUE_CACHE[True Cache]            SQL_FIREWALL[SQL Firewall]            BLOCKCHAIN[Blockchain Tables]        end    end
    SGA --> DB_CACHE    SGA --> SHARED_POOL    SGA --> REDO_BUFFER
    BGP --> PMON    BGP --> SMON    BGP --> DBWn    BGP --> LGWR
    DBWn --> DATAFILES    LGWR --> REDOLOGS    ARCn --> ARCHIVELOG
    style SGA fill:#f96,stroke:#333,stroke-width:2px    style AI_VECTOR fill:#9f9,stroke:#333,stroke-width:2pxSystem Requirements and Prerequisites
Hardware Requirements
#!/bin/bashecho "=== Oracle Database 23c Prerequisites Check ==="echo
# Check CPUecho "CPU Information:"lscpu | grep -E "Architecture|CPU\(s\)|Thread|Core|Socket"echo
# Check Memoryecho "Memory Information:"free -hecho "Oracle 23c Requirements:"echo "- Minimum RAM: 2 GB (8 GB recommended for production)"echo "- Minimum Swap: 1.5 times RAM when RAM < 2 GB"echo
# Check Disk Spaceecho "Disk Space:"df -hecho "Oracle 23c Requirements:"echo "- Oracle Software: 10 GB"echo "- Data Files: 20 GB minimum (varies based on use)"echo "- Recovery Area: 20 GB minimum"echo
# Check OS Versionecho "Operating System:"cat /etc/os-release | grep -E "NAME|VERSION"echo "Supported OS: Oracle Linux 8.6+, RHEL 8.6+, SLES 15 SP3+"echo
# Check Kernel Parametersecho "Kernel Parameters Check:"echo "Current values vs. Required minimums:"echo
# Shared Memoryecho -n "kernel.shmall: "sysctl -n kernel.shmall 2>/dev/null || echo "not set"echo "  Required: $(getconf PAGE_SIZE) * $(getconf PHYS_PAGES) / 2"
echo -n "kernel.shmmax: "sysctl -n kernel.shmmax 2>/dev/null || echo "not set"echo "  Required: $(getconf PHYS_PAGES) * $(getconf PAGE_SIZE) / 2"
echo -n "kernel.shmmni: "sysctl -n kernel.shmmni 2>/dev/null || echo "not set"echo "  Required: 4096"
# Semaphoresecho -n "kernel.sem: "sysctl -n kernel.sem 2>/dev/null || echo "not set"echo "  Required: 250 32000 100 128"
# File Handlesecho -n "fs.file-max: "sysctl -n fs.file-max 2>/dev/null || echo "not set"echo "  Required: 6815744"
echo -n "fs.aio-max-nr: "sysctl -n fs.aio-max-nr 2>/dev/null || echo "not set"echo "  Required: 1048576"
# Networkecho -n "net.ipv4.ip_local_port_range: "sysctl -n net.ipv4.ip_local_port_range 2>/dev/null || echo "not set"echo "  Required: 9000 65500"
echo -n "net.core.rmem_default: "sysctl -n net.core.rmem_default 2>/dev/null || echo "not set"echo "  Required: 262144"
echo -n "net.core.rmem_max: "sysctl -n net.core.rmem_max 2>/dev/null || echo "not set"echo "  Required: 4194304"
echo -n "net.core.wmem_default: "sysctl -n net.core.wmem_default 2>/dev/null || echo "not set"echo "  Required: 262144"
echo -n "net.core.wmem_max: "sysctl -n net.core.wmem_max 2>/dev/null || echo "not set"echo "  Required: 1048576"Operating System Configuration
#!/bin/bash# Set variablesORACLE_BASE=/u01/app/oracleORACLE_HOME=$ORACLE_BASE/product/23c/dbhome_1ORACLE_SID=ORCL23CORACLE_INVENTORY=/u01/app/oraInventory
echo "=== Preparing OS for Oracle Database 23c ==="
# Create Oracle user and groupsecho "Creating Oracle groups..."groupadd -g 54321 oinstallgroupadd -g 54322 dbagroupadd -g 54323 opergroupadd -g 54324 backupdbagroupadd -g 54325 dgdbagroupadd -g 54326 kmdbagroupadd -g 54327 asmdbagroupadd -g 54328 asmopergroupadd -g 54329 asmadmingroupadd -g 54330 racdba
echo "Creating Oracle user..."useradd -u 54321 -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba oracle
# Set password for oracle userecho "oracle:Oracle123!" | chpasswd
# Create directoriesecho "Creating Oracle directories..."mkdir -p $ORACLE_BASEmkdir -p $ORACLE_HOMEmkdir -p $ORACLE_INVENTORYmkdir -p /u01/app/oracle/oradatamkdir -p /u01/app/oracle/recovery_areachown -R oracle:oinstall /u01chmod -R 775 /u01
# Configure kernel parametersecho "Configuring kernel parameters..."cat > /etc/sysctl.d/97-oracle-database-sysctl.conf << EOF# Oracle Database 23c Kernel Parametersfs.aio-max-nr = 1048576fs.file-max = 6815744kernel.shmall = $(echo "$(getconf PHYS_PAGES) / 2" | bc)kernel.shmmax = $(echo "$(getconf PHYS_PAGES) * $(getconf PAGE_SIZE) / 2" | bc)kernel.shmmni = 4096kernel.sem = 250 32000 100 128net.ipv4.ip_local_port_range = 9000 65500net.core.rmem_default = 262144net.core.rmem_max = 4194304net.core.wmem_default = 262144net.core.wmem_max = 1048576vm.dirty_background_ratio = 3vm.dirty_ratio = 15vm.dirty_expire_centisecs = 500vm.dirty_writeback_centisecs = 100EOF
sysctl -p /etc/sysctl.d/97-oracle-database-sysctl.conf
# Configure user limitsecho "Configuring user limits..."cat > /etc/security/limits.d/97-oracle.conf << EOF# Oracle Database 23c User Limitsoracle   soft   nofile    1024oracle   hard   nofile    65536oracle   soft   nproc     16384oracle   hard   nproc     16384oracle   soft   stack     10240oracle   hard   stack     32768oracle   soft   memlock   unlimitedoracle   hard   memlock   unlimitedEOF
# Configure PAMecho "Configuring PAM..."echo "session required pam_limits.so" >> /etc/pam.d/login
# Install required packagesecho "Installing required packages..."yum install -y \    bc \    binutils \    compat-openssl11 \    elfutils-libelf \    elfutils-libelf-devel \    fontconfig-devel \    glibc \    glibc-devel \    ksh \    libaio \    libaio-devel \    libdtrace-ctf-devel \    libXrender \    libXrender-devel \    libX11 \    libXau \    libXi \    libXtst \    libgcc \    librdmacm-devel \    libstdc++ \    libstdc++-devel \    libxcb \    make \    net-tools \    nfs-utils \    python3 \    python3-configshell \    python3-rtslib \    python3-six \    smartmontools \    sysstat \    unixODBC \    libnsl
# Configure firewallecho "Configuring firewall..."firewall-cmd --permanent --add-port=1521/tcpfirewall-cmd --permanent --add-port=5500/tcpfirewall-cmd --permanent --add-port=5501/tcpfirewall-cmd --reload
# Disable SELinux (for installation)echo "Configuring SELinux..."setenforce 0sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
# Create Oracle environment scriptecho "Creating Oracle environment script..."cat > /home/oracle/.bash_profile << 'EOF'# Oracle Database 23c Environment Variablesexport ORACLE_BASE=/u01/app/oracleexport ORACLE_HOME=$ORACLE_BASE/product/23c/dbhome_1export ORACLE_SID=ORCL23Cexport PATH=$PATH:$ORACLE_HOME/binexport LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATHexport CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlibexport NLS_LANG=AMERICAN_AMERICA.AL32UTF8export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
# Aliasesalias sqlplus='rlwrap sqlplus'alias rman='rlwrap rman'alias dgmgrl='rlwrap dgmgrl'alias alert='tail -f $ORACLE_BASE/diag/rdbms/orcl23c/ORCL23C/trace/alert_ORCL23C.log'
# Functionsfunction sids {    ps -ef | grep pmon | grep -v grep | awk '{print $NF}' | cut -d_ -f3-}
function setdb {    export ORACLE_SID=$1    echo "ORACLE_SID set to $ORACLE_SID"}EOF
chown oracle:oinstall /home/oracle/.bash_profile
echo "OS preparation completed successfully!"Silent Installation
Response File Configuration
# db_install.rsp - Oracle Database 23c Silent Installation Response Fileoracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v23.0.0oracle.install.option=INSTALL_DB_SWONLYUNIX_GROUP_NAME=oinstallINVENTORY_LOCATION=/u01/app/oraInventoryORACLE_HOME=/u01/app/oracle/product/23c/dbhome_1ORACLE_BASE=/u01/app/oracleoracle.install.db.InstallEdition=EEoracle.install.db.OSDBA_GROUP=dbaoracle.install.db.OSOPER_GROUP=operoracle.install.db.OSBACKUPDBA_GROUP=backupdbaoracle.install.db.OSDGDBA_GROUP=dgdbaoracle.install.db.OSKMDBA_GROUP=kmdbaoracle.install.db.OSRACDBA_GROUP=racdbaoracle.install.db.rootconfig.executeRootScript=falseoracle.install.db.rootconfig.configMethod=oracle.install.db.rootconfig.sudoPath=oracle.install.db.rootconfig.sudoUserName=oracle.install.db.CLUSTER_NODES=oracle.install.db.config.starterdb.type=GENERAL_PURPOSEoracle.install.db.config.starterdb.globalDBName=oracle.install.db.config.starterdb.SID=oracle.install.db.config.starterdb.characterSet=AL32UTF8oracle.install.db.config.starterdb.memoryOption=falseoracle.install.db.config.starterdb.memoryLimit=oracle.install.db.config.starterdb.installExampleSchemas=falseoracle.install.db.config.starterdb.password.ALL=oracle.install.db.config.starterdb.password.SYS=oracle.install.db.config.starterdb.password.SYSTEM=oracle.install.db.config.starterdb.password.DBSNMP=oracle.install.db.config.starterdb.password.PDBADMIN=oracle.install.db.config.starterdb.managementOption=DEFAULToracle.install.db.config.starterdb.omsHost=oracle.install.db.config.starterdb.omsPort=0oracle.install.db.config.starterdb.emAdminUser=oracle.install.db.config.starterdb.emAdminPassword=oracle.install.db.config.starterdb.enableRecovery=falseoracle.install.db.config.starterdb.storageType=FILE_SYSTEM_STORAGEoracle.install.db.config.starterdb.fileSystemStorage.dataLocation=oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=Installation Script
#!/bin/bash# Run as oracle userif [ "$(whoami)" != "oracle" ]; then    echo "This script must be run as oracle user"    exit 1fi
# Set environmentexport ORACLE_BASE=/u01/app/oracleexport ORACLE_HOME=$ORACLE_BASE/product/23c/dbhome_1export ORACLE_SID=ORCL23Cexport PATH=$PATH:$ORACLE_HOME/bin
# Extract Oracle softwareecho "Extracting Oracle Database 23c software..."cd $ORACLE_HOMEunzip -q /path/to/LINUX.X64_232000_db_home.zip
# Run installer in silent modeecho "Starting Oracle Database 23c installation..."./runInstaller -silent \    -responseFile /home/oracle/db_install.rsp \    -ignorePrereqFailure \    -waitforcompletion
# Check installation logecho "Installation completed. Check logs at:"echo "$ORACLE_BASE/oraInventory/logs/installActions*.log"
# Run root scriptsecho "Please run the following commands as root:"echo "1. $ORACLE_BASE/oraInventory/orainstRoot.sh"echo "2. $ORACLE_HOME/root.sh"Database Creation
Database Creation Response File
# dbca.rsp - Database Configuration Assistant Response FileresponseFileVersion=/oracle/assistants/rspfmt_dbca_response_schema_v23.0.0gdbName=ORCL23Csid=ORCL23CdatabaseConfigType=SIRACOneNodeServiceName=policyManaged=falsecreateServerPool=falseserverPoolName=cardinality=force=falsepqPoolName=pqCardinality=createAsContainerDatabase=truenumberOfPDBs=1pdbName=PDB1useLocalUndoForPDBs=truepdbAdminPassword=Oracle123!nodelist=templateName=General_Purpose.dbcsysPassword=Oracle123!systemPassword=Oracle123!serviceUserPassword=emConfiguration=NONEemExpressPort=5500runCVUChecks=falsedbsnmpPassword=omsHost=omsPort=0emUser=emPassword=dvConfiguration=falsedvUserName=dvUserPassword=dvAccountManagerName=dvAccountManagerPassword=olsConfiguration=falsedatafileJarLocation={ORACLE_HOME}/assistants/dbca/templates/datafileDestination={ORACLE_BASE}/oradata/{DB_UNIQUE_NAME}/recoveryAreaDestination={ORACLE_BASE}/recovery_area/{DB_UNIQUE_NAME}storageType=FSdiskGroupName=asmsnmpPassword=characterSet=AL32UTF8nationalCharacterSet=AL16UTF16registerWithDirService=falsedirServiceUserName=dirServicePassword=walletPassword=listeners=LISTENERvariablesFile=variables=initParams=sampleSchema=falsememoryPercentage=40databaseType=MULTIPURPOSEautomaticMemoryManagement=falsetotalMemory=0Create Database Script
#!/bin/bash# Set environmentsource /home/oracle/.bash_profile
echo "=== Creating Oracle Database 23c ==="
# Create listenerecho "Creating listener..."cat > $ORACLE_HOME/network/admin/listener.ora << EOFLISTENER =  (DESCRIPTION_LIST =    (DESCRIPTION =      (ADDRESS = (PROTOCOL = TCP)(HOST = $(hostname))(PORT = 1521))      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))    )  )
ADR_BASE_LISTENER = $ORACLE_BASEENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ONEOF
# Create tnsnames.oracat > $ORACLE_HOME/network/admin/tnsnames.ora << EOFORCL23C =  (DESCRIPTION =    (ADDRESS = (PROTOCOL = TCP)(HOST = $(hostname))(PORT = 1521))    (CONNECT_DATA =      (SERVER = DEDICATED)      (SERVICE_NAME = ORCL23C)    )  )
PDB1 =  (DESCRIPTION =    (ADDRESS = (PROTOCOL = TCP)(HOST = $(hostname))(PORT = 1521))    (CONNECT_DATA =      (SERVER = DEDICATED)      (SERVICE_NAME = PDB1)    )  )EOF
# Start listenerlsnrctl start
# Create database using DBCAdbca -silent -createDatabase \    -templateName General_Purpose.dbc \    -gdbname ORCL23C \    -sid ORCL23C \    -responseFile NO_VALUE \    -characterSet AL32UTF8 \    -sysPassword Oracle123! \    -systemPassword Oracle123! \    -createAsContainerDatabase true \    -numberOfPDBs 1 \    -pdbName PDB1 \    -pdbAdminPassword Oracle123! \    -databaseType MULTIPURPOSE \    -automaticMemoryManagement false \    -totalMemory 2048 \    -storageType FS \    -datafileDestination "$ORACLE_BASE/oradata" \    -recoveryAreaDestination "$ORACLE_BASE/recovery_area" \    -emConfiguration NONE \    -ignorePreReqs
# Configure database for autostartecho "Configuring database for autostart..."cat > /etc/oratab << EOFORCL23C:$ORACLE_HOME:YEOF
# Create startup scriptcat > /etc/systemd/system/oracle-database.service << EOF[Unit]Description=Oracle Database 23cAfter=network.target
[Service]Type=forkingUser=oracleGroup=oinstallEnvironment="ORACLE_HOME=$ORACLE_HOME"Environment="ORACLE_SID=ORCL23C"ExecStart=$ORACLE_HOME/bin/dbstart $ORACLE_HOMEExecStop=$ORACLE_HOME/bin/dbshut $ORACLE_HOMETimeoutSec=300
[Install]WantedBy=multi-user.targetEOF
systemctl daemon-reloadsystemctl enable oracle-databasePost-Installation Configuration
Initial Database Configuration
-- initial-config.sql-- Run as SYSDBA
-- Configure database parametersALTER SYSTEM SET db_create_file_dest='$ORACLE_BASE/oradata' SCOPE=BOTH;ALTER SYSTEM SET db_recovery_file_dest='$ORACLE_BASE/recovery_area' SCOPE=BOTH;ALTER SYSTEM SET db_recovery_file_dest_size=20G SCOPE=BOTH;
-- Enable archivelog modeSHUTDOWN IMMEDIATE;STARTUP MOUNT;ALTER DATABASE ARCHIVELOG;ALTER DATABASE OPEN;
-- Configure flashbackALTER DATABASE FLASHBACK ON;
-- Set retention policiesALTER SYSTEM SET db_flashback_retention_target=1440 SCOPE=BOTH;ALTER SYSTEM SET undo_retention=900 SCOPE=BOTH;
-- Configure Resource ManagerBEGIN  DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
  -- Create consumer groups  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(    consumer_group => 'OLTP_GROUP',    comment => 'Online Transaction Processing Applications'  );
  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(    consumer_group => 'BATCH_GROUP',    comment => 'Batch Processing Applications'  );
  DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(    consumer_group => 'REPORTING_GROUP',    comment => 'Reporting and Analytics Applications'  );
  -- Create resource plan  DBMS_RESOURCE_MANAGER.CREATE_PLAN(    plan => 'PROD_PLAN',    comment => 'Production Resource Plan'  );
  -- Create plan directives  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(    plan => 'PROD_PLAN',    group_or_subplan => 'OLTP_GROUP',    comment => 'OLTP Priority',    cpu_p1 => 70,    parallel_degree_limit_p1 => 4  );
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(    plan => 'PROD_PLAN',    group_or_subplan => 'BATCH_GROUP',    comment => 'Batch Priority',    cpu_p1 => 20,    parallel_degree_limit_p1 => 8  );
  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(    plan => 'PROD_PLAN',    group_or_subplan => 'REPORTING_GROUP',    comment => 'Reporting Priority',    cpu_p1 => 10,    parallel_degree_limit_p1 => 2  );
  DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();END;/
-- Enable the resource planALTER SYSTEM SET RESOURCE_MANAGER_PLAN='PROD_PLAN' SCOPE=BOTH;
-- Configure Automatic Workload Repository (AWR)BEGIN  DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(    retention => 10080,  -- 7 days    interval => 60       -- 60 minutes  );END;/
-- Configure Automatic Maintenance TasksBEGIN  -- Enable automatic statistics gathering  DBMS_AUTO_TASK_ADMIN.ENABLE(    client_name => 'auto optimizer stats collection',    operation => NULL,    window_name => NULL  );
  -- Enable automatic SQL tuning  DBMS_AUTO_TASK_ADMIN.ENABLE(    client_name => 'sql tuning advisor',    operation => NULL,    window_name => NULL  );END;/Security Configuration
-- security-config.sql-- Enhanced security settings for Oracle 23c
-- Enable unified auditingALTER SYSTEM SET unified_audit_trail=DB,EXTENDED SCOPE=SPFILE;
-- Create audit policyCREATE AUDIT POLICY secure_policy  PRIVILEGES CREATE SESSION, ALTER SYSTEM, ALTER DATABASE  ACTIONS ALL ON SYS.AUD$  ACTIONS SELECT, INSERT, UPDATE, DELETE ON HR.EMPLOYEES;
-- Enable the audit policyAUDIT POLICY secure_policy;
-- Configure password policyALTER PROFILE DEFAULT LIMIT  FAILED_LOGIN_ATTEMPTS 5  PASSWORD_LIFE_TIME 90  PASSWORD_REUSE_TIME 365  PASSWORD_REUSE_MAX 10  PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function  PASSWORD_LOCK_TIME 1  PASSWORD_GRACE_TIME 7;
-- Create secure application userCREATE USER app_user IDENTIFIED BY "ComplexP@ssw0rd123!"  DEFAULT TABLESPACE users  TEMPORARY TABLESPACE temp  QUOTA UNLIMITED ON users  PROFILE DEFAULT  ACCOUNT UNLOCK;
-- Grant minimal privilegesGRANT CREATE SESSION TO app_user;GRANT CREATE TABLE TO app_user;GRANT CREATE SEQUENCE TO app_user;GRANT CREATE PROCEDURE TO app_user;
-- Enable SQL Firewall (New in 23c)BEGIN  DBMS_SQL_FIREWALL.ENABLE;
  -- Create SQL Firewall allowed list  DBMS_SQL_FIREWALL.CREATE_ALLOWED_SQL_LIST(    username => 'APP_USER',    list_name => 'APP_ALLOWED_SQL'  );
  -- Add allowed SQL statements  DBMS_SQL_FIREWALL.ADD_ALLOWED_SQL(    username => 'APP_USER',    list_name => 'APP_ALLOWED_SQL',    sql_text => 'SELECT * FROM products WHERE product_id = :1'  );END;/
-- Configure Transparent Data Encryption (TDE)-- Create wallet directory!mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/wallet
-- Configure sqlnet.ora for wallet!echo "ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=$ORACLE_BASE/admin/$ORACLE_SID/wallet)))" >> $ORACLE_HOME/network/admin/sqlnet.ora
-- Create and open walletADMINISTER KEY MANAGEMENT CREATE KEYSTORE '$ORACLE_BASE/admin/$ORACLE_SID/wallet' IDENTIFIED BY "WalletP@ssw0rd123!";ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "WalletP@ssw0rd123!";ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "WalletP@ssw0rd123!" WITH BACKUP;
-- Enable TDE for tablespacesALTER TABLESPACE users ENCRYPTION ONLINE USING 'AES256' ENCRYPT;Performance Tuning
-- performance-tuning.sql-- Oracle 23c Performance Optimization
-- Memory configurationALTER SYSTEM SET memory_target=0 SCOPE=SPFILE;ALTER SYSTEM SET memory_max_target=0 SCOPE=SPFILE;ALTER SYSTEM SET sga_target=6G SCOPE=SPFILE;ALTER SYSTEM SET pga_aggregate_target=2G SCOPE=SPFILE;
-- Specific memory componentsALTER SYSTEM SET db_cache_size=4G SCOPE=SPFILE;ALTER SYSTEM SET shared_pool_size=1G SCOPE=SPFILE;ALTER SYSTEM SET large_pool_size=512M SCOPE=SPFILE;ALTER SYSTEM SET java_pool_size=256M SCOPE=SPFILE;ALTER SYSTEM SET streams_pool_size=256M SCOPE=SPFILE;
-- Process and session configurationALTER SYSTEM SET processes=1000 SCOPE=SPFILE;ALTER SYSTEM SET sessions=1522 SCOPE=SPFILE;ALTER SYSTEM SET open_cursors=1000 SCOPE=BOTH;
-- I/O and file managementALTER SYSTEM SET db_files=1000 SCOPE=SPFILE;ALTER SYSTEM SET db_writer_processes=4 SCOPE=SPFILE;ALTER SYSTEM SET filesystemio_options='setall' SCOPE=SPFILE;ALTER SYSTEM SET disk_asynch_io=TRUE SCOPE=SPFILE;
-- Optimizer settingsALTER SYSTEM SET optimizer_adaptive_plans=TRUE SCOPE=BOTH;ALTER SYSTEM SET optimizer_adaptive_statistics=TRUE SCOPE=BOTH;ALTER SYSTEM SET result_cache_mode=FORCE SCOPE=BOTH;ALTER SYSTEM SET result_cache_max_size=512M SCOPE=BOTH;
-- Parallel processingALTER SYSTEM SET parallel_max_servers=64 SCOPE=BOTH;ALTER SYSTEM SET parallel_min_servers=0 SCOPE=BOTH;ALTER SYSTEM SET parallel_degree_policy=AUTO SCOPE=BOTH;
-- Configure Automatic Memory Management for PDBsALTER PLUGGABLE DATABASE PDB1 OPEN;ALTER SESSION SET CONTAINER=PDB1;ALTER SYSTEM SET sga_target=2G SCOPE=BOTH;ALTER SYSTEM SET pga_aggregate_target=1G SCOPE=BOTH;ALTER SESSION SET CONTAINER=CDB$ROOT;
-- Create performance monitoring jobBEGIN  DBMS_SCHEDULER.CREATE_JOB (    job_name => 'COLLECT_PERFORMANCE_STATS',    job_type => 'PLSQL_BLOCK',    job_action => 'BEGIN DBMS_STATS.GATHER_DATABASE_STATS(options=>''GATHER AUTO''); END;',    start_date => SYSTIMESTAMP,    repeat_interval => 'FREQ=DAILY; BYHOUR=2',    enabled => TRUE,    comments => 'Automatic statistics collection job'  );END;/
-- Enable SQL Plan ManagementALTER SYSTEM SET optimizer_capture_sql_plan_baselines=TRUE SCOPE=BOTH;ALTER SYSTEM SET optimizer_use_sql_plan_baselines=TRUE SCOPE=BOTH;New Oracle 23c Features Configuration
AI Vector Search Setup
-- vector-search-setup.sql-- Configure AI Vector Search in Oracle 23c
-- Create user for vector operationsCREATE USER vector_user IDENTIFIED BY "VectorP@ss123!"  DEFAULT TABLESPACE users  QUOTA UNLIMITED ON users;
GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE TO vector_user;GRANT EXECUTE ON DBMS_VECTOR TO vector_user;GRANT EXECUTE ON DBMS_VECTOR_ADMIN TO vector_user;
-- Create vector-enabled tableCONNECT vector_user/VectorP@ss123!@PDB1
CREATE TABLE product_embeddings (    product_id NUMBER PRIMARY KEY,    product_name VARCHAR2(200),    description VARCHAR2(4000),    embedding VECTOR(384),  -- 384-dimensional vector    category VARCHAR2(100));
-- Create vector indexCREATE VECTOR INDEX idx_product_embeddingON product_embeddings(embedding)ORGANIZATION INMEMORYDISTANCE COSINE;
-- Insert sample data with vectorsINSERT INTO product_embeddings VALUES (    1,    'Professional Laptop',    'High-performance laptop for professionals',    TO_VECTOR('[0.1, 0.2, ..., 0.384]'),  -- 384 dimensions    'Electronics');
-- Query using vector similaritySELECT product_id, product_name,       VECTOR_DISTANCE(embedding, TO_VECTOR('[0.1, 0.2, ..., 0.384]'), COSINE) as similarityFROM product_embeddingsWHERE VECTOR_DISTANCE(embedding, TO_VECTOR('[0.1, 0.2, ..., 0.384]'), COSINE) < 0.5ORDER BY similarity;JSON Relational Duality Views
-- json-duality-setup.sql-- Configure JSON Relational Duality in Oracle 23c
-- Create relational tablesCREATE TABLE departments (    dept_id NUMBER PRIMARY KEY,    dept_name VARCHAR2(100),    location VARCHAR2(100));
CREATE TABLE employees (    emp_id NUMBER PRIMARY KEY,    emp_name VARCHAR2(100),    email VARCHAR2(100),    dept_id NUMBER REFERENCES departments(dept_id),    hire_date DATE,    salary NUMBER);
-- Create JSON Relational Duality ViewCREATE JSON DUALITY VIEW department_dv ASSELECT JSON {    'departmentId' : d.dept_id,    'departmentName' : d.dept_name,    'location' : d.location,    'employees' : [        SELECT JSON {            'employeeId' : e.emp_id,            'name' : e.emp_name,            'email' : e.email,            'hireDate' : e.hire_date,            'salary' : e.salary        }        FROM employees e        WHERE e.dept_id = d.dept_id    ]}FROM departments d;
-- Insert data through duality view (automatically updates relational tables)INSERT INTO department_dv VALUES (    JSON {        'departmentName' : 'Engineering',        'location' : 'Building A',        'employees' : [            {                'name' : 'John Doe',                'email' : 'john.doe@company.com',                'hireDate' : '2024-01-15',                'salary' : 75000            }        ]    });
-- Query duality viewSELECT JSON_SERIALIZE(data PRETTY)FROM department_dvWHERE JSON_VALUE(data, '$.departmentName') = 'Engineering';Blockchain Tables
-- blockchain-setup.sql-- Configure Blockchain Tables in Oracle 23c
-- Create blockchain table for audit trailCREATE BLOCKCHAIN TABLE security_audit_trail (    audit_id NUMBER,    event_time TIMESTAMP,    user_name VARCHAR2(128),    action VARCHAR2(100),    object_name VARCHAR2(128),    sql_text VARCHAR2(4000),    ip_address VARCHAR2(45),    CONSTRAINT pk_audit_blockchain PRIMARY KEY (audit_id)) NO DROP UNTIL 365 DAYS IDLE  NO DELETE UNTIL 180 DAYS AFTER INSERT  HASHING USING SHA2_512 VERSION V2;
-- Insert audit recordsINSERT INTO security_audit_trail VALUES (    1,    SYSTIMESTAMP,    'ADMIN_USER',    'CREATE TABLE',    'SENSITIVE_DATA',    'CREATE TABLE sensitive_data (id NUMBER, data VARCHAR2(4000))',    '192.168.1.100');
-- Verify blockchainSELECT DBMS_BLOCKCHAIN_TABLE.VERIFY_ROWS('SECURITY_AUDIT_TRAIL') FROM DUAL;
-- Get chain infoSELECT DBMS_BLOCKCHAIN_TABLE.GET_CHAIN_INFO('SECURITY_AUDIT_TRAIL') FROM DUAL;Monitoring and Maintenance
Monitoring Scripts
#!/bin/bashsource /home/oracle/.bash_profile
# Function to check database statuscheck_db_status() {    echo "=== Database Status ==="    sqlplus -s / as sysdba << EOFSET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFFSELECT 'Database Status: ' || status FROM v\$instance;SELECT 'Database Name: ' || name FROM v\$database;SELECT 'Instance Name: ' || instance_name FROM v\$instance;SELECT 'Version: ' || version FROM v\$instance;EOF    echo}
# Function to check tablespace usagecheck_tablespace_usage() {    echo "=== Tablespace Usage ==="    sqlplus -s / as sysdba << EOFSET LINESIZE 200SET PAGESIZE 100COLUMN tablespace_name FORMAT A30COLUMN used_gb FORMAT 999,999.99COLUMN free_gb FORMAT 999,999.99COLUMN total_gb FORMAT 999,999.99COLUMN pct_used FORMAT 999.99
SELECT    tablespace_name,    ROUND(used_space/1024/1024/1024, 2) AS used_gb,    ROUND(free_space/1024/1024/1024, 2) AS free_gb,    ROUND(total_space/1024/1024/1024, 2) AS total_gb,    ROUND((used_space/total_space)*100, 2) AS pct_usedFROM (    SELECT        tablespace_name,        SUM(bytes) AS total_space,        SUM(CASE WHEN autoextensible = 'YES' THEN maxbytes ELSE bytes END) AS max_space    FROM dba_data_files    GROUP BY tablespace_name) df,(    SELECT        tablespace_name,        SUM(bytes) AS free_space    FROM dba_free_space    GROUP BY tablespace_name) fsWHERE df.tablespace_name = fs.tablespace_name(+)AND df.tablespace_name NOT LIKE 'UNDO%'ORDER BY pct_used DESC;EOF    echo}
# Function to check active sessionscheck_active_sessions() {    echo "=== Active Sessions ==="    sqlplus -s / as sysdba << EOFSET LINESIZE 200SET PAGESIZE 100COLUMN username FORMAT A20COLUMN program FORMAT A30COLUMN machine FORMAT A30COLUMN status FORMAT A10
SELECT    sid,    serial#,    username,    program,    machine,    status,    last_call_etFROM v\$sessionWHERE username IS NOT NULLAND status = 'ACTIVE'ORDER BY last_call_et DESC;EOF    echo}
# Function to check alert logcheck_alert_log() {    echo "=== Recent Alert Log Entries ==="    tail -20 $ORACLE_BASE/diag/rdbms/${ORACLE_SID,,}/$ORACLE_SID/trace/alert_$ORACLE_SID.log | grep -E "ORA-|Error|Warning"    echo}
# Function to check backup statuscheck_backup_status() {    echo "=== Recent Backup Status ==="    sqlplus -s / as sysdba << EOFSET LINESIZE 200SET PAGESIZE 100COLUMN start_time FORMAT A20COLUMN end_time FORMAT A20COLUMN input_type FORMAT A15COLUMN status FORMAT A10COLUMN input_gb FORMAT 999,999.99COLUMN output_gb FORMAT 999,999.99
SELECT    TO_CHAR(start_time, 'YYYY-MM-DD HH24:MI') AS start_time,    TO_CHAR(end_time, 'YYYY-MM-DD HH24:MI') AS end_time,    input_type,    status,    ROUND(input_bytes/1024/1024/1024, 2) AS input_gb,    ROUND(output_bytes/1024/1024/1024, 2) AS output_gbFROM v\$rman_backup_job_detailsWHERE start_time > SYSDATE - 7ORDER BY start_time DESC;EOF    echo}
# Main monitoring loopwhile true; do    clear    echo "Oracle Database 23c Monitoring - $(date)"    echo "========================================="
    check_db_status    check_tablespace_usage    check_active_sessions    check_alert_log    check_backup_status
    echo "Refreshing in 60 seconds... (Press Ctrl+C to exit)"    sleep 60doneAutomated Backup Script
#!/bin/bashsource /home/oracle/.bash_profile
# VariablesBACKUP_DIR=/backup/oracle/$(date +%Y%m%d)LOG_FILE=/backup/oracle/logs/backup_$(date +%Y%m%d_%H%M%S).log
# Create backup directorymkdir -p $BACKUP_DIRmkdir -p /backup/oracle/logs
# Function to log messageslog_message() {    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE}
# Start backuplog_message "Starting Oracle 23c backup"
# Run RMAN backuprman target / log=$LOG_FILE append << EOFRUN {    # Allocate channels    ALLOCATE CHANNEL ch1 DEVICE TYPE DISK;    ALLOCATE CHANNEL ch2 DEVICE TYPE DISK;
    # Backup database plus archivelog    BACKUP AS COMPRESSED BACKUPSET    INCREMENTAL LEVEL 0    DATABASE PLUS ARCHIVELOG    FORMAT '$BACKUP_DIR/db_%d_%T_%U'    TAG 'FULL_BACKUP_$(date +%Y%m%d)';
    # Backup control file    BACKUP CURRENT CONTROLFILE    FORMAT '$BACKUP_DIR/ctrl_%d_%T_%U'    TAG 'CONTROL_FILE_$(date +%Y%m%d)';
    # Backup spfile    BACKUP SPFILE    FORMAT '$BACKUP_DIR/spfile_%d_%T_%U'    TAG 'SPFILE_$(date +%Y%m%d)';
    # Delete obsolete backups    DELETE NOPROMPT OBSOLETE RECOVERY WINDOW OF 7 DAYS;
    # Release channels    RELEASE CHANNEL ch1;    RELEASE CHANNEL ch2;}
# Validate backupVALIDATE BACKUPSET COMPLETED AFTER 'SYSDATE-1/24';
# List backupsLIST BACKUP SUMMARY;
EXIT;EOF
# Check backup statusif [ $? -eq 0 ]; then    log_message "Backup completed successfully"else    log_message "Backup failed with error code $?"    exit 1fi
# Cleanup old logsfind /backup/oracle/logs -name "*.log" -mtime +30 -delete
log_message "Backup process completed"Performance Monitoring Dashboard
graph TB    subgraph "Oracle 23c Monitoring Stack"        subgraph "Data Collection"            AWR[AWR Snapshots]            ASH[ASH Data]            Metrics[V$ Views]            Stats[Optimizer Statistics]        end
        subgraph "Analysis Tools"            ADDM[ADDM Reports]            SQLTuning[SQL Tuning Advisor]            SegAdvisor[Segment Advisor]            PerfHub[Performance Hub]        end
        subgraph "Visualization"            EM[Enterprise Manager]            Grafana[Grafana]            Custom[Custom Dashboards]        end
        subgraph "Alerting"            DBAlert[Database Alerts]            OSWatcher[OS Watcher]            Email[Email Notifications]            SNMP[SNMP Traps]        end    end
    AWR --> ADDM    ASH --> SQLTuning    Metrics --> PerfHub    Stats --> SegAdvisor
    ADDM --> EM    SQLTuning --> EM    PerfHub --> Grafana
    EM --> DBAlert    Grafana --> Email    OSWatcher --> SNMP
    style AWR fill:#f96,stroke:#333,stroke-width:2px    style EM fill:#9f9,stroke:#333,stroke-width:2pxTroubleshooting Common Issues
Diagnostic Script
#!/bin/bashsource /home/oracle/.bash_profile
echo "=== Oracle 23c Diagnostic Report ==="echo "Generated: $(date)"echo
# Check instance statusecho "1. Instance Status:"sqlplus -s / as sysdba << EOFSET PAGESIZE 0 FEEDBACK OFFSELECT 'Status: ' || status || ', Started: ' || TO_CHAR(startup_time, 'YYYY-MM-DD HH24:MI:SS')FROM v\$instance;EOF
# Check for blocking sessionsecho -e "\n2. Blocking Sessions:"sqlplus -s / as sysdba << EOFSET LINESIZE 200SELECT    s1.sid || ',' || s1.serial# AS blocking_session,    s2.sid || ',' || s2.serial# AS blocked_session,    s1.username AS blocking_user,    s2.username AS blocked_user,    l1.type,    l1.id1,    l1.id2FROM v\$lock l1, v\$lock l2, v\$session s1, v\$session s2WHERE l1.id1 = l2.id1AND l1.id2 = l2.id2AND l1.block = 1AND l2.request > 0AND l1.sid = s1.sidAND l2.sid = s2.sid;EOF
# Check for long-running queriesecho -e "\n3. Long Running Queries (>60 seconds):"sqlplus -s / as sysdba << EOFSET LINESIZE 200COLUMN sql_text FORMAT A50 TRUNCATESELECT    sid,    serial#,    username,    last_call_et AS seconds,    sql_id,    SUBSTR(sql_text, 1, 50) AS sql_textFROM v\$session s, v\$sql qWHERE s.sql_id = q.sql_idAND s.status = 'ACTIVE'AND s.username IS NOT NULLAND last_call_et > 60ORDER BY last_call_et DESC;EOF
# Check wait eventsecho -e "\n4. Top Wait Events:"sqlplus -s / as sysdba << EOFSET LINESIZE 200SELECT    event,    total_waits,    time_waited,    average_waitFROM v\$system_eventWHERE event NOT LIKE 'SQL*Net%'AND event NOT LIKE '%idle%'ORDER BY time_waited DESCFETCH FIRST 10 ROWS ONLY;EOF
# Check for invalid objectsecho -e "\n5. Invalid Objects:"sqlplus -s / as sysdba << EOFSELECT owner, object_type, COUNT(*) AS countFROM dba_objectsWHERE status = 'INVALID'GROUP BY owner, object_typeORDER BY owner, object_type;EOF
# Check flash recovery area usageecho -e "\n6. Flash Recovery Area Usage:"sqlplus -s / as sysdba << EOFSELECT    name,    ROUND(space_limit/1024/1024/1024, 2) AS limit_gb,    ROUND(space_used/1024/1024/1024, 2) AS used_gb,    ROUND((space_used/space_limit)*100, 2) AS pct_usedFROM v\$recovery_file_dest;EOF
# Generate recommendationsecho -e "\n7. Recommendations:"if [ -f $ORACLE_BASE/diag/rdbms/${ORACLE_SID,,}/$ORACLE_SID/trace/alert_$ORACLE_SID.log ]; then    errors=$(grep -c "ORA-" $ORACLE_BASE/diag/rdbms/${ORACLE_SID,,}/$ORACLE_SID/trace/alert_$ORACLE_SID.log 2>/dev/null || echo "0")    if [ $errors -gt 0 ]; then        echo "- Review alert log: $errors ORA- errors found"    fifi
echo "- Run ADDM report for detailed performance analysis"echo "- Check AWR reports for historical performance trends"echo "- Review listener log for connection issues"Conclusion
Oracle Database 23c represents a significant evolution in database technology, introducing AI-native capabilities, enhanced security features, and improved developer productivity tools. This guide has covered the essential steps for installing and configuring Oracle 23c in enterprise environments.
Key takeaways:
- Proper OS preparation is crucial for optimal performance
 - Silent installation enables automated deployments
 - Security configuration should be implemented from day one
 - New features like Vector Search and JSON Duality provide modern development capabilities
 - Regular monitoring ensures database health and performance
 - Automated backups protect against data loss
 
Remember to:
- Always test in a non-production environment first
 - Follow Oracle’s security best practices
 - Implement comprehensive monitoring
 - Plan for regular patching and updates
 - Document your configuration for disaster recovery
 
Resources
 Oracle Database 23c Setup - Complete Installation and Configuration Guide 
  https://mranv.pages.dev/posts/oracle-database-23c-setup/