ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
Oracle 11gR2
SQL> alter database open;
ERROR at line 1:
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1:
'/home/oracle/u01/app/oracle/oradata/IAT11F/system01.dbf'
In fase di start di un db il control file contiene indicazione a datafile presenti in un altro path.
'/home/oracle/u01/app/oracle/oradata/IAT11F/system01.dbf'
I datafile sono invece presente nel seguente path
/u01/app/oracle/oradata/IAT11F/
Una soluzione è modificare il control file.
La seguente istruzione crea un backup del control file in sql che può essere modificato a mano.
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
Database altered.
Visualizzare l' Alert log per individuare il nome e la location del trace file.
Nel file alert_<SID>.log troviamo questo
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
Backup controlfile written to trace file /u01/app/oracle/diag/rdbms/iat11f/IAT11F/trace/IAT11F_ora_2425.trc
Completed: ALTER DATABASE BACKUP CONTROLFILE TO TRACE
Modificare il file facendolo puntare al nuovo path che contiene i datafile e rinominarlo come file control01.sql
vi IAT11F_ora_2425.trc
......
...
DATAFILE
'/home/oracle/u01/app/oracle/oradata/SIAT11F/system01.dbf',
.........
Diventa così:
CREATE CONTROLFILE REUSE DATABASE "SIAT11F" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/IAT11F/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/IAT11F/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/IAT11F/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/u01/app/oracle/oradata/IAT11F/system01.dbf',
'/u01/app/oracle/oradata/IAT11F/sysaux01.dbf',
..............................
'/u01/app/oracle/oradata/SIAT11F/ts_pluto_data02.dbf'
CHARACTER SET WE8ISO8859P1;
Conservare gli script di creazione dei file temp da usare dopo lo start del db.
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/SIAT11F/temp01.dbf'
Spegnere il db e fare una copia dei vecchi controlfile
SQL> shutdown immediate;
[oracle@coslab02 IAT11F]$ cp control01.ctl control02.ctl
Dopodiché riavviare il db
SQL>startup nomount;
SQL>@/<path>/control01.sql
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/SIAT11F/control01.ctl
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '/u01/app/oracle/oradata/SIAT11F/system01.dbf'
SQL> recover database
Media recovery complete.
SQL> alter database open;
Database altered.
Scambia i file di log tre (3) volte per assicurarti che il database funzioni correttamente. Assicurati di controllare il registro degli allarmi.
SQL> alter system switch logfile;
Creare il datafile temp
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/SIAT11F/temp01.dbf'
SIZE 73M AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED;
SQL> alter database open;
ERROR at line 1:
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1:
'/home/oracle/u01/app/oracle/oradata/IAT11F/system01.dbf'
In fase di start di un db il control file contiene indicazione a datafile presenti in un altro path.
'/home/oracle/u01/app/oracle/oradata/IAT11F/system01.dbf'
I datafile sono invece presente nel seguente path
/u01/app/oracle/oradata/IAT11F/
Una soluzione è modificare il control file.
La seguente istruzione crea un backup del control file in sql che può essere modificato a mano.
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
Database altered.
Visualizzare l' Alert log per individuare il nome e la location del trace file.
Nel file alert_<SID>.log troviamo questo
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
Backup controlfile written to trace file /u01/app/oracle/diag/rdbms/iat11f/IAT11F/trace/IAT11F_ora_2425.trc
Completed: ALTER DATABASE BACKUP CONTROLFILE TO TRACE
Modificare il file facendolo puntare al nuovo path che contiene i datafile e rinominarlo come file control01.sql
vi IAT11F_ora_2425.trc
......
...
DATAFILE
'/home/oracle/u01/app/oracle/oradata/SIAT11F/system01.dbf',
.........
Diventa così:
CREATE CONTROLFILE REUSE DATABASE "SIAT11F" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/IAT11F/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/IAT11F/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/IAT11F/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/u01/app/oracle/oradata/IAT11F/system01.dbf',
'/u01/app/oracle/oradata/IAT11F/sysaux01.dbf',
..............................
'/u01/app/oracle/oradata/SIAT11F/ts_pluto_data02.dbf'
CHARACTER SET WE8ISO8859P1;
Conservare gli script di creazione dei file temp da usare dopo lo start del db.
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/SIAT11F/temp01.dbf'
Spegnere il db e fare una copia dei vecchi controlfile
SQL> shutdown immediate;
[oracle@coslab02 IAT11F]$ cp control01.ctl control02.ctl
Dopodiché riavviare il db
SQL>startup nomount;
SQL>@/<path>/control01.sql
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/SIAT11F/control01.ctl
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '/u01/app/oracle/oradata/SIAT11F/system01.dbf'
SQL> recover database
Media recovery complete.
SQL> alter database open;
Database altered.
Scambia i file di log tre (3) volte per assicurarti che il database funzioni correttamente. Assicurati di controllare il registro degli allarmi.
SQL> alter system switch logfile;
Creare il datafile temp
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/SIAT11F/temp01.dbf'
SIZE 73M AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED;