Skip to content

ORA-01109 Database Not Open - Database State and Recovery Solutions

Error Text: ORA-01109: database not open

This error occurs when attempting to perform operations that require the database to be in OPEN state, but the database is currently in MOUNT state or another non-open state. The database instance is running and the database is mounted, but not yet opened for normal operations.

Database Lifecycle States
├── SHUTDOWN - Database completely stopped
├── NOMOUNT - Instance started, no database files accessed
├── MOUNT - Database mounted, control files read, not open
├── OPEN - Database fully operational for user access
└── OPEN READ ONLY - Database open for read-only access
-- Normal startup sequence
STARTUP NOMOUNT; -- Instance started
ALTER DATABASE MOUNT; -- Database mounted
ALTER DATABASE OPEN; -- Database opened
-- Direct startup
STARTUP; -- Goes directly to OPEN state
  • Database started with STARTUP MOUNT
  • Maintenance operations requiring MOUNT state
  • Recovery operations in progress
  • Database waiting for manual intervention
  • Media recovery required
  • Redo log corruption
  • Datafile issues preventing open
  • Archive log gaps
  • Missing or corrupt datafiles
  • Tablespace issues
  • Control file inconsistencies
  • Parameter file problems
-- Connect as SYSDBA
sqlplus / as sysdba
-- Check current database state
SELECT status FROM v$instance;
SELECT open_mode FROM v$database;
-- Check database information
SELECT name, created, log_mode FROM v$database;
-- Check if database needs recovery
SELECT * FROM v$recover_file;
-- Check datafile status
SELECT file#, status, enabled, name FROM v$datafile;
-- Check tablespace status
SELECT name, status FROM v$tablespace;
-- Check control file status
SELECT status FROM v$controlfile;
Terminal window
# Check alert log for errors
tail -100 $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/alert_$ORACLE_SID.log
# Look for specific error patterns
grep -i "error\|ora-" $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/alert_$ORACLE_SID.log
-- Connect as SYSDBA
sqlplus / as sysdba
-- Open the database
ALTER DATABASE OPEN;
-- Verify status
SELECT open_mode FROM v$database;
SELECT status FROM v$instance;
-- If database needs recovery
RECOVER DATABASE;
-- Follow prompts or use AUTO
RECOVER DATABASE USING BACKUP CONTROLFILE;
-- Then open database
ALTER DATABASE OPEN;
-- Open database ignoring consistency
ALTER DATABASE OPEN RESETLOGS;
-- Note: This should only be used after proper recovery
-- or in emergency situations with DBA approval
-- Check what recovery is needed
SELECT * FROM v$recover_file;
-- Apply archive logs
RECOVER DATABASE;
-- Or specific file
RECOVER DATAFILE '/path/to/datafile.dbf';
-- Open after recovery
ALTER DATABASE OPEN;
-- Check archive log sequence
SELECT sequence#, first_change#, next_change#
FROM v$archived_log
ORDER BY sequence# DESC;
-- If archive logs missing, incomplete recovery
RECOVER DATABASE UNTIL TIME '2024-01-01 10:00:00';
ALTER DATABASE OPEN RESETLOGS;
-- Check datafile status
SELECT file#, status, enabled, error, name
FROM v$datafile
WHERE status != 'ONLINE';
-- Bring datafile online if possible
ALTER DATABASE DATAFILE '/path/to/file.dbf' ONLINE;
-- Or recover specific datafile
RECOVER DATAFILE '/path/to/file.dbf';
ALTER DATABASE DATAFILE '/path/to/file.dbf' ONLINE;
-- Check redo log status
SELECT group#, status, members, bytes FROM v$log;
SELECT * FROM v$logfile;
-- Clear corrupt redo log (if not current)
ALTER DATABASE CLEAR LOGFILE GROUP 2;
-- If current log is corrupt
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 1;
Terminal window
# Connect to RMAN
rman target /
# If database is mounted
restore database;
recover database;
alter database open;
# Point-in-time recovery
run {
set until time "to_date('2024-01-01 12:00:00','YYYY-MM-DD HH24:MI:SS')";
restore database;
recover database;
alter database open resetlogs;
}
-- If using backup control file
STARTUP MOUNT;
RECOVER DATABASE USING BACKUP CONTROLFILE;
-- Apply all available archive logs
ALTER DATABASE OPEN RESETLOGS;
-- Take problematic tablespace offline
ALTER TABLESPACE problem_ts OFFLINE IMMEDIATE;
-- Open database
ALTER DATABASE OPEN;
-- Recover tablespace separately
RECOVER TABLESPACE problem_ts;
ALTER TABLESPACE problem_ts ONLINE;
-- Open database read-only
ALTER DATABASE OPEN READ ONLY;
-- Verify read-only status
SELECT open_mode FROM v$database;
-- Later change to read-write
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN;
-- Useful for:
-- - Reporting during maintenance
-- - Data verification
-- - Backup operations
-- - Testing scenarios
-- Check for blocking sessions
SELECT blocking_session, sid, serial#, wait_class, event
FROM v$session
WHERE blocking_session IS NOT NULL;
-- Check long operations
SELECT sid, opname, target, sofar, totalwork,
ROUND(sofar/totalwork*100,2) as pct_complete
FROM v$session_longops
WHERE sofar != totalwork;
-- Check which files need recovery
SELECT * FROM v$recover_file;
-- Recover specific files
RECOVER DATAFILE '/path/to/file.dbf';
-- Or recover all
RECOVER DATABASE;

ORA-01122 Database File Failed Verification

Section titled “ORA-01122 Database File Failed Verification”
-- Check file headers
SELECT file#, checkpoint_change#, checkpoint_time
FROM v$datafile_header;
-- Compare with control file
SELECT file#, checkpoint_change#, checkpoint_time
FROM v$datafile;
-- Recover if needed
RECOVER DATABASE;
-- Create monitoring view
CREATE OR REPLACE VIEW db_status_monitor AS
SELECT
i.instance_name,
i.status as instance_status,
d.open_mode,
d.database_status,
CASE
WHEN i.status = 'OPEN' AND d.open_mode = 'READ_WRITE'
THEN 'FULLY_OPERATIONAL'
WHEN i.status = 'MOUNTED'
THEN 'MOUNTED_NOT_OPEN'
ELSE 'ISSUE_DETECTED'
END as overall_status
FROM v$instance i, v$database d;
#!/bin/bash
# Database state monitor
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
ORACLE_SID=ORCL
export ORACLE_HOME ORACLE_SID
STATUS=$($ORACLE_HOME/bin/sqlplus -s / as sysdba << EOF
SET PAGESIZE 0 FEEDBACK OFF HEADING OFF
SELECT open_mode FROM v\$database;
EXIT;
EOF
)
if [[ "$STATUS" != "READ WRITE" ]]; then
echo "Database not in READ-write mode: $STATUS"
echo "Attempting to open database..."
$ORACLE_HOME/bin/sqlplus -s / as sysdba << EOF
ALTER DATABASE OPEN;
EXIT;
EOF
# Send alert
echo "Database state issue detected and resolved" | \
mail -s "Oracle Database State Alert" [email protected]
fi
CREATE OR REPLACE PROCEDURE check_database_health AS
BEGIN
-- Check database status
FOR rec IN (
SELECT open_mode, database_status
FROM v$database
) LOOP
IF rec.open_mode != 'READ_WRITE' THEN
DBMS_OUTPUT.PUT_LINE('WARNING: Database not in read-write mode: ' || rec.open_mode);
END IF;
END LOOP;
-- Check for recovery needs
FOR rec IN (
SELECT COUNT(*) as count FROM v$recover_file
) LOOP
IF rec.count > 0 THEN
DBMS_OUTPUT.PUT_LINE('WARNING: Files need recovery: ' || rec.count);
END IF;
END LOOP;
-- Check datafile status
FOR rec IN (
SELECT COUNT(*) as count
FROM v$datafile
WHERE status != 'ONLINE'
) LOOP
IF rec.count > 0 THEN
DBMS_OUTPUT.PUT_LINE('WARNING: Offline datafiles: ' || rec.count);
END IF;
END LOOP;
END;
/
-- Emergency open procedure
BEGIN
-- Try normal open first
BEGIN
EXECUTE IMMEDIATE 'ALTER DATABASE OPEN';
DBMS_OUTPUT.PUT_LINE('Database opened successfully');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Normal open failed: ' || SQLERRM);
-- Try recovery and open
BEGIN
EXECUTE IMMEDIATE 'RECOVER DATABASE';
EXECUTE IMMEDIATE 'ALTER DATABASE OPEN';
DBMS_OUTPUT.PUT_LINE('Database recovered and opened');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Recovery failed: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('Manual intervention required');
END;
END;
END;
/
-- Recovery decision procedure
CREATE OR REPLACE PROCEDURE recovery_decision AS
v_recover_count NUMBER;
v_datafile_issues NUMBER;
BEGIN
-- Check if recovery needed
SELECT COUNT(*) INTO v_recover_count FROM v$recover_file;
-- Check datafile issues
SELECT COUNT(*) INTO v_datafile_issues
FROM v$datafile WHERE status != 'ONLINE';
IF v_recover_count > 0 THEN
DBMS_OUTPUT.PUT_LINE('Media recovery required for ' || v_recover_count || ' files');
DBMS_OUTPUT.PUT_LINE('Run: RECOVER DATABASE;');
ELSIF v_datafile_issues > 0 THEN
DBMS_OUTPUT.PUT_LINE('Datafile issues detected: ' || v_datafile_issues);
DBMS_OUTPUT.PUT_LINE('Check v$datafile for details');
ELSE
DBMS_OUTPUT.PUT_LINE('No obvious issues - try: ALTER DATABASE OPEN;');
END IF;
END;
/
  • ORA-01033: Oracle initialization or shutdown in progress
  • ORA-01034: Oracle not available
  • ORA-01113: File needs media recovery
  • ORA-01122: Database file failed verification
  1. Monitor database state continuously
  2. Implement automated recovery procedures
  3. Regular backup and recovery testing
  4. Document recovery procedures
  5. Set up alerting for state changes
  6. Maintain current backup strategy
  • Check current database status
  • Review alert log for errors
  • Verify datafile status
  • Check for recovery requirements
  • Attempt normal database open
  • Apply recovery if needed
  • Verify post-open database health
  • Document resolution steps