Skip to content

ORA-00845 MEMORY_TARGET Not Supported - Automatic Memory Management Guide

ORA-00845: MEMORY_TARGET Not Supported on This System

Section titled “ORA-00845: MEMORY_TARGET Not Supported on This System”

Error Text: ORA-00845: MEMORY_TARGET not supported on this system

This critical startup error prevents Oracle database startup when Automatic Memory Management (AMM) cannot allocate the required memory. ORA-00845 typically occurs due to insufficient shared memory filesystem space or incompatible system configuration for AMM.

Automatic Memory Management (AMM)
├── MEMORY_TARGET (Total memory pool)
├── MEMORY_MAX_TARGET (Maximum memory)
├── System Global Area (SGA)
│ ├── Buffer Cache
│ ├── Shared Pool
│ ├── Large Pool
│ └── Java Pool
└── Program Global Area (PGA)
├── Sort Area
├── Hash Area
└── Cursor Cache
  1. MEMORY_TARGET set → Oracle allocates shared memory
  2. Shared memory filesystem (/dev/shm) must have sufficient space
  3. Dynamic allocation between SGA and PGA components
  4. Operating system must support required memory operations
  • /dev/shm filesystem smaller than MEMORY_TARGET
  • Other processes consuming shared memory space
  • Incorrect /dev/shm mount configuration
  • Container environments with limited shared memory
  • Older Linux kernels lacking AMM support
  • Missing hugepages configuration
  • Incompatible shared memory implementation
  • SELinux restrictions blocking memory allocation
  • MEMORY_TARGET exceeds available system memory
  • MEMORY_MAX_TARGET set too high
  • Conflicting manual memory parameter settings
  • Instance already running with different memory configuration
  • Docker containers without proper shared memory setup
  • Cloud instances with restricted memory access
  • Virtual machines with insufficient memory allocation
  • Container orchestration platforms with memory limits
-- Check memory parameters (if database can connect)
SHOW PARAMETER memory;
SHOW PARAMETER sga;
SHOW PARAMETER pga;
-- Check from SPFILE if database won't start
strings $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora | grep -i memory
Terminal window
# Check total system memory
free -h
cat /proc/meminfo | grep MemTotal
# Check /dev/shm filesystem
df -h /dev/shm
mount | grep shm
# Check /dev/shm mount options
cat /proc/mounts | grep shm
# Check available space vs Oracle requirements
ls -la /dev/shm/
du -sh /dev/shm/*
Terminal window
# Calculate memory requirements from SPFILE
ORACLE_SID=ORCL # Set your SID
SPFILE=$ORACLE_HOME/dbs/spfile$ORACLE_SID.ora
echo "Current SPFILE memory settings:"
strings $SPFILE | grep -i memory_target
strings $SPFILE | grep -i memory_max_target
strings $SPFILE | grep -i sga_target
# Check for Oracle shared memory segments
ipcs -m | grep oracle
ipcs -m | grep $ORACLE_USER
Terminal window
# Check alert log for detailed error information
tail -n 50 $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/alert_$ORACLE_SID.log
# Look for patterns like:
# - "Starting ORACLE instance"
# - "MEMORY_TARGET not supported"
# - "Automatic Memory Management is disabled"
# - "ORA-00845"
# Check for related trace files
ls -la $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/ | grep -E "(ora_|ORA_)" | tail -10
Terminal window
# Check current /dev/shm size
df -h /dev/shm
# Calculate required size (MEMORY_TARGET + 20% overhead)
# Example: For MEMORY_TARGET=8G, need at least 10G /dev/shm
# Resize /dev/shm temporarily (requires root)
sudo mount -o remount,size=12G /dev/shm
# Verify new size
df -h /dev/shm
# Attempt Oracle startup
sqlplus / as sysdba
STARTUP;
Terminal window
# Backup current fstab
sudo cp /etc/fstab /etc/fstab.backup
# Edit /etc/fstab (requires root)
sudo vi /etc/fstab
# Add or modify the /dev/shm entry:
tmpfs /dev/shm tmpfs defaults,size=12G 0 0
# Alternative with more explicit options:
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec,size=12G 0 0
# Test the configuration
sudo mount -o remount /dev/shm
df -h /dev/shm
# Restart Oracle
sqlplus / as sysdba
STARTUP;

Solution 2: Disable Automatic Memory Management

Section titled “Solution 2: Disable Automatic Memory Management”
-- Connect using PFILE or SPFILE modification
sqlplus / as sysdba
-- Create PFILE from SPFILE for modification
CREATE PFILE='/tmp/init$ORACLE_SID.ora' FROM SPFILE;
-- Exit and edit PFILE
EXIT;
Terminal window
# Edit the PFILE to disable AMM
vi /tmp/init$ORACLE_SID.ora
# Comment out or remove these lines:
# *.memory_target=8G
# *.memory_max_target=8G
# Add manual memory settings instead:
*.sga_target=6G
*.pga_aggregate_target=2G
# Alternative: Set individual SGA components
# *.sga_target=0
# *.shared_pool_size=1G
# *.db_cache_size=4G
# *.large_pool_size=500M
# *.java_pool_size=200M
# *.pga_aggregate_target=2G
-- Start with PFILE
sqlplus / as sysdba
STARTUP PFILE='/tmp/init$ORACLE_SID.ora';
-- Create new SPFILE with corrected parameters
CREATE SPFILE FROM PFILE='/tmp/init$ORACLE_SID.ora';
-- Restart with new SPFILE
SHUTDOWN IMMEDIATE;
STARTUP;
-- Verify memory configuration
SHOW PARAMETER memory;
SHOW PARAMETER sga;
SHOW PARAMETER pga;
-- If database starts intermittently, reduce memory allocation
sqlplus / as sysdba
-- Reduce memory targets
ALTER SYSTEM SET memory_target = 6G SCOPE = SPFILE;
ALTER SYSTEM SET memory_max_target = 6G SCOPE = SPFILE;
-- Restart database
SHUTDOWN IMMEDIATE;
STARTUP;
#!/bin/bash
# memory_calculator.sh - Calculate optimal Oracle memory settings
# Get system memory in GB
TOTAL_MEM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
TOTAL_MEM_GB=$((TOTAL_MEM_KB / 1024 / 1024))
echo "System Memory Analysis:"
echo "Total System Memory: ${TOTAL_MEM_GB}GB"
# Calculate recommendations
OS_RESERVE_GB=2
OTHER_APPS_GB=1
AVAILABLE_GB=$((TOTAL_MEM_GB - OS_RESERVE_GB - OTHER_APPS_GB))
# Oracle memory recommendations (70% of available)
ORACLE_MEM_GB=$((AVAILABLE_GB * 70 / 100))
SGA_GB=$((ORACLE_MEM_GB * 75 / 100))
PGA_GB=$((ORACLE_MEM_GB * 25 / 100))
echo ""
echo "Recommended Oracle Memory Settings:"
echo "MEMORY_TARGET: ${ORACLE_MEM_GB}G"
echo "Or Manual Settings:"
echo "SGA_TARGET: ${SGA_GB}G"
echo "PGA_AGGREGATE_TARGET: ${PGA_GB}G"
echo ""
echo "Required /dev/shm size: $((ORACLE_MEM_GB + 1))G"
# Check current /dev/shm
SHM_SIZE_KB=$(df /dev/shm | awk 'NR==2 {print $2}')
SHM_SIZE_GB=$((SHM_SIZE_KB / 1024 / 1024))
echo "Current /dev/shm size: ${SHM_SIZE_GB}G"
if [ $SHM_SIZE_GB -lt $((ORACLE_MEM_GB + 1)) ]; then
echo "WARNING: /dev/shm too small. Need to increase to $((ORACLE_MEM_GB + 1))G"
else
echo "OK: /dev/shm size is sufficient"
fi
# Dockerfile for Oracle with proper shared memory
FROM oracle/database:19.3.0-ee
# Configure shared memory in container
RUN echo "tmpfs /dev/shm tmpfs defaults,size=12G 0 0" >> /etc/fstab
# Set Oracle memory parameters
ENV ORACLE_MEMORY_TARGET=8G
ENV ORACLE_SGA_TARGET=6G
ENV ORACLE_PGA_TARGET=2G
Terminal window
# Run Oracle container with increased shared memory
docker run -d \
--name oracle-db \
--shm-size=12g \
-e ORACLE_SID=ORCL \
-e ORACLE_PDB=PDB1 \
-e ORACLE_PWD=YourPassword \
-e ORACLE_MEMORY_TARGET=8G \
-p 1521:1521 \
-p 5500:5500 \
oracle/database:19.3.0-ee
# Check container shared memory
docker exec oracle-db df -h /dev/shm
kubernetes-oracle.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: oracle-database
spec:
replicas: 1
selector:
matchLabels:
app: oracle-database
template:
metadata:
labels:
app: oracle-database
spec:
containers:
- name: oracle
image: oracle/database:19.3.0-ee
env:
- name: ORACLE_SID
value: "ORCL"
- name: ORACLE_PWD
value: "YourPassword"
- name: ORACLE_MEMORY_TARGET
value: "8G"
resources:
requests:
memory: "12Gi"
cpu: "2"
limits:
memory: "16Gi"
cpu: "4"
volumeMounts:
- name: dshm
mountPath: /dev/shm
- name: oracle-data
mountPath: /opt/oracle/oradata
volumes:
- name: dshm
emptyDir:
medium: Memory
sizeLimit: 12Gi
- name: oracle-data
persistentVolumeClaim:
claimName: oracle-data-pvc

Configure Hugepages for Better Performance

Section titled “Configure Hugepages for Better Performance”
Terminal window
# Calculate hugepages needed
MEMORY_TARGET_GB=8
HUGEPAGE_SIZE_KB=$(grep Hugepagesize /proc/meminfo | awk '{print $2}')
HUGEPAGE_SIZE_MB=$((HUGEPAGE_SIZE_KB / 1024))
HUGEPAGES_NEEDED=$((MEMORY_TARGET_GB * 1024 / HUGEPAGE_SIZE_MB))
echo "Hugepages calculation:"
echo "Memory Target: ${MEMORY_TARGET_GB}GB"
echo "Hugepage Size: ${HUGEPAGE_SIZE_MB}MB"
echo "Hugepages Needed: ${HUGEPAGES_NEEDED}"
# Set hugepages
sudo sysctl -w vm.nr_hugepages=$HUGEPAGES_NEEDED
# Make permanent
echo "vm.nr_hugepages = $HUGEPAGES_NEEDED" | sudo tee -a /etc/sysctl.conf
# Configure Oracle to use hugepages
sqlplus / as sysdba
ALTER SYSTEM SET use_large_pages = TRUE SCOPE = SPFILE;
-- Create memory monitoring procedure
CREATE OR REPLACE PROCEDURE check_memory_config AS
v_memory_target NUMBER;
v_sga_size NUMBER;
v_pga_size NUMBER;
v_shm_available NUMBER;
BEGIN
-- Get current memory configuration
SELECT value INTO v_memory_target
FROM v$parameter WHERE name = 'memory_target';
SELECT SUM(value) INTO v_sga_size FROM v$sga;
SELECT value INTO v_pga_size
FROM v$pgastat WHERE name = 'total PGA allocated';
-- Check if AMM is enabled
IF v_memory_target > 0 THEN
DBMS_OUTPUT.PUT_LINE('AMM enabled with MEMORY_TARGET: ' ||
ROUND(v_memory_target/1024/1024/1024, 2) || 'GB');
-- Check /dev/shm space (would need external script)
DBMS_OUTPUT.PUT_LINE('Verify /dev/shm has sufficient space');
ELSE
DBMS_OUTPUT.PUT_LINE('Manual memory management in use');
END IF;
DBMS_OUTPUT.PUT_LINE('Current SGA: ' || ROUND(v_sga_size/1024/1024/1024, 2) || 'GB');
DBMS_OUTPUT.PUT_LINE('Current PGA: ' || ROUND(v_pga_size/1024/1024/1024, 2) || 'GB');
END;
/
-- Run the check
EXEC check_memory_config;
Terminal window
# For AWS EC2 instances running Oracle
# Choose memory-optimized instances (r5, r6i, x1e)
# Instance type recommendations:
# r5.2xlarge: 64GB RAM - supports up to 40GB Oracle memory
# r5.4xlarge: 128GB RAM - supports up to 80GB Oracle memory
# r5.8xlarge: 256GB RAM - supports up to 180GB Oracle memory
# Configure /dev/shm in user data script
#!/bin/bash
echo "tmpfs /dev/shm tmpfs defaults,size=50G 0 0" >> /etc/fstab
mount -o remount /dev/shm
# Set optimal kernel parameters
echo "vm.nr_hugepages = 20480" >> /etc/sysctl.conf # 40GB hugepages
sysctl -p
Terminal window
# Azure VM configuration
# Use memory-optimized series (Dv3, Ev3, Mv2)
# GCP configuration
# Use memory-optimized machine types (n1-highmem, n2-highmem)
# Common cloud configuration script
#!/bin/bash
# cloud_oracle_setup.sh
# Get total memory
TOTAL_MEM_GB=$(free -g | awk 'NR==2{print $2}')
ORACLE_MEM_GB=$((TOTAL_MEM_GB * 60 / 100)) # 60% for Oracle
SHM_SIZE_GB=$((ORACLE_MEM_GB + 5)) # Oracle memory + 5GB buffer
echo "Configuring Oracle for ${TOTAL_MEM_GB}GB system"
echo "Oracle memory: ${ORACLE_MEM_GB}GB"
echo "/dev/shm size: ${SHM_SIZE_GB}GB"
# Configure /dev/shm
cp /etc/fstab /etc/fstab.backup
echo "tmpfs /dev/shm tmpfs defaults,size=${SHM_SIZE_GB}G 0 0" >> /etc/fstab
mount -o remount /dev/shm
# Configure hugepages if memory > 16GB
if [ $ORACLE_MEM_GB -gt 16 ]; then
HUGEPAGES=$((ORACLE_MEM_GB * 512)) # 2MB hugepages
echo "vm.nr_hugepages = $HUGEPAGES" >> /etc/sysctl.conf
sysctl -p
fi
echo "Oracle memory configuration completed"
#!/bin/bash
# validate_oracle_memory.sh - Pre-deployment memory validation
REQUIRED_MEMORY_GB=${1:-8}
ORACLE_SID=${2:-ORCL}
echo "Validating memory configuration for Oracle $ORACLE_SID"
echo "Required memory: ${REQUIRED_MEMORY_GB}GB"
# Check system memory
TOTAL_MEM_GB=$(free -g | awk 'NR==2{print $2}')
if [ $TOTAL_MEM_GB -lt $((REQUIRED_MEMORY_GB * 2)) ]; then
echo "ERROR: Insufficient system memory"
echo "Required: $((REQUIRED_MEMORY_GB * 2))GB, Available: ${TOTAL_MEM_GB}GB"
exit 1
fi
# Check /dev/shm
SHM_SIZE_GB=$(df /dev/shm | awk 'NR==2 {print int($2/1024/1024)}')
if [ $SHM_SIZE_GB -lt $((REQUIRED_MEMORY_GB + 2)) ]; then
echo "ERROR: Insufficient /dev/shm space"
echo "Required: $((REQUIRED_MEMORY_GB + 2))GB, Available: ${SHM_SIZE_GB}GB"
echo "Fix: sudo mount -o remount,size=$((REQUIRED_MEMORY_GB + 2))G /dev/shm"
exit 1
fi
# Check for existing Oracle processes
if pgrep -f "ora_.*_$ORACLE_SID" > /dev/null; then
echo "WARNING: Oracle instance $ORACLE_SID appears to be running"
fi
echo "Memory validation completed successfully"
#!/bin/bash
# oracle_memory_manager.sh - Automated memory management
ORACLE_SID=${1:-ORCL}
ACTION=${2:-check}
case $ACTION in
"check")
echo "Checking Oracle memory configuration..."
df -h /dev/shm
free -h
ipcs -m | grep oracle
;;
"increase-shm")
NEW_SIZE=${3:-16G}
echo "Increasing /dev/shm to $NEW_SIZE..."
sudo mount -o remount,size=$NEW_SIZE /dev/shm
df -h /dev/shm
;;
"fix-amm")
echo "Attempting to fix AMM configuration..."
# Check if database is running
if pgrep -f "ora_smon_$ORACLE_SID" > /dev/null; then
echo "Database is running, checking memory usage..."
sqlplus -s / as sysdba << EOF
SET PAGESIZE 0 FEEDBACK OFF
SELECT 'Memory Target: ' || value/1024/1024/1024 || 'GB' FROM v\$parameter WHERE name='memory_target';
SELECT 'SGA Size: ' || SUM(value)/1024/1024/1024 || 'GB' FROM v\$sga;
EXIT;
EOF
else
echo "Database is not running, checking /dev/shm..."
df -h /dev/shm
# Attempt startup
sqlplus / as sysdba << EOF
STARTUP;
EXIT;
EOF
fi
;;
*)
echo "Usage: $0 <ORACLE_SID> <check|increase-shm|fix-amm> [size]"
exit 1
;;
esac
  • ORA-27125 - Unable to create shared memory segment
  • ORA-04031 - Unable to allocate shared memory
  • ORA-00600 - Internal error (memory corruption)
  • ORA-01034 - Oracle not available (startup failure)
  1. Check /dev/shm space immediately

    Terminal window
    df -h /dev/shm
  2. Increase /dev/shm if needed

    Terminal window
    sudo mount -o remount,size=16G /dev/shm
  3. Try database startup

    sqlplus / as sysdba
    STARTUP;
  4. If still failing, disable AMM

    CREATE PFILE='/tmp/init.ora' FROM SPFILE;
    -- Edit PFILE to remove memory_target
    STARTUP PFILE='/tmp/init.ora';
Terminal window
# Check memory status
df -h /dev/shm
free -h
ipcs -m | grep oracle
# Increase /dev/shm
sudo mount -o remount,size=16G /dev/shm
# Oracle memory commands
sqlplus / as sysdba
SHOW PARAMETER memory;
ALTER SYSTEM SET memory_target = 6G SCOPE = SPFILE;
STARTUP;
# Disable AMM emergency
CREATE PFILE FROM SPFILE;
# Edit PFILE: comment out memory_target, add sga_target/pga_aggregate_target
STARTUP PFILE='/path/to/pfile';
Terminal window
# Essential /etc/fstab entry
tmpfs /dev/shm tmpfs defaults,size=16G 0 0
# Essential /etc/sysctl.conf entries (for hugepages)
vm.nr_hugepages = 8192
vm.hugetlb_shm_group = 54321 # Oracle group ID
# Verify configuration
mount -o remount /dev/shm
sysctl -p
df -h /dev/shm