We faced below interesting issue in one of our test environments, I call it SPICE19 here. One of the datafile was deleted with the intent to recreate it. Unfortunately, database was up and running at that moment when the datafile was deleted at OS level.
Observations
-
1. Database SPICE19 was in
noarchivelog mode.
2. No backups were available for
restoration.
3. Datafile
'/u02/oracle/oradata/SPICE19/users06' was created accidentally with a wrong name
(should have been /u02/oracle/oradata/SPICE19/users06.dbf)
4. It was then removed using
(rm) at OS level.
5. A new datafile was added with
the name - /u02/oracle/oradata/SPICE19/users06.dbf
6. Database got crashed searching for datafile - /u02/oracle/oradata/SPICE19/users06
7. Database complained for
missing datafile - /u02/oracle/oradata/SPICE19/users06 as the information was in
controlfile.
Troubleshooting
Steps -
1. Missing datafile id was found
below -
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME CON_ID
---------- ------- ------- ------------------------------------------ --------- ----------
18 ONLINE ONLINE FILE NOT FOUND 0 0
2. Second step was to recreate
missing datafile with a different name-
SQL> alter database create datafile
'/u02/oracle/oradata/SPICE19/users06' as
'/u02/oracle/oradata/SPICE19/users06_new.dbf' reuse;
Database altered.
3. As the database was in
norachivelog mode, recovery
is not possible UNLESS complete information is present in the REDO logs and
they are not overwritten.
4. We have 3 redo logs here,
/u02/oracle/oradata/SPICE19/redo03.log
/u02/oracle/oradata/SPICE19/redo02.log
/u02/oracle/oradata/SPICE19/redo01.log
5. Tried applying them in the
following sequence with incomplete recovery -
SQL> recover database using backup controlfile until cancel;
/u02/oracle/oradata/SPICE19/redo01.log
/u02/oracle/oradata/SPICE19/redo02.log
Log applied.
Media recovery complete.
6. Opened the database with
resetlogs option
Correct
Approach -
We must rename datafile with
below 2 steps.
1. Tablespace must be offline
(no users can access the data during this period)
alter tablespace USERS offline immediate;
2. Rename the datafile at OS
level using mv command for Linux OS.
mv /u02/oracle/oradata/SPICE19/users06
/u02/oracle/oradata/SPICE19/users06.dbf
2. Rename the datafile using
below command to update the controlfile at database level -
ALTER TABLESPACE users rename datafile '/u02/oracle/oradata/SPICE19/users06'
to '/u02/oracle/oradata/SPICE19/users06.dbf';
Conclusion-
We were lucky to have the redo
information in the redo logs and they were not overwritten. This was a rare case where
recovery of a datafile was possible with database in noarchivelog mode and with
no backups available.
Comments
Post a Comment