Skip to main content

What will happen if dbf file accidentally deleted when database is still open and how to recover it?


What will happen if dbf file (non system) accidentally deleted when database is still open? Only for Unix and Linux platforms if accidentally deleted dbf file OS will not delete it, OS will rename it. Also be aware that process (pid) will goes on and use deleted file. You can find deleted file under /proc/<pid>/...

Let`s check.

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL>  

SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
EXAMPLE

6 rows selected.

SQL> 

SQL> select file_id, file_name from dba_data_files order by 1;

   FILE_ID  FILE_NAME
------------  -------------------------------------------------------------------
         1 /oracle/product/11.2.0/oradata/testdb/system01.dbf

         2 /oracle/product/11.2.0/oradata/testdb/sysaux01.dbf

         3 /oracle/product/11.2.0/oradata/testdb/undotbs01.dbf

         4 /oracle/product/11.2.0/oradata/testdb/users01.dbf

         5 /oracle/product/11.2.0/oradata/testdb/example01.dbf


SQL>  

We will simulate on USERS tablespace`s datafile.

Now we will create new user (Ulfet), grant to him necessary privileges.  

SQL> create user ulfet identified by ulfet default tablespace users;

User created.

SQL> grant connect, resource to ulfet;

Grant succeeded.

SQL> conn ulfet/ulfet
Connected.

--Now create table and insert a record, after recover we will check data.
SQL> create table test (id number);

Table created.

SQL> insert into test values(1);

1 row created.

SQL> commit;

Commit complete.

SQL>  

Now, delete /oracle/product/11.2.0/oradata/testdb/users01.dbf data file.

[oracle@db-server testdb]$ pwd
/oracle/product/11.2.0/oradata/testdb
[oracle@db-server testdb]$ ls -l
total 1533652
-rw-r----- 1 oracle oinstall   9748480 Oct 21 14:17 control01.ctl
-rw-r----- 1 oracle oinstall 104865792 Oct 21 14:02 example01.dbf
-rw-r----- 1 oracle oinstall  52429312 Oct 21 13:57 redo01.log
-rw-r----- 1 oracle oinstall  52429312 Oct 21 14:17 redo02.log
-rw-r----- 1 oracle oinstall  52429312 Oct 21 13:53 redo03.log
-rw-r----- 1 oracle oinstall 513810432 Oct 21 14:17 sysaux01.dbf
-rw-r----- 1 oracle oinstall 713039872 Oct 21 14:17 system01.dbf
-rw-r----- 1 oracle oinstall  20979712 Oct 21 13:58 temp01.dbf
-rw-r----- 1 oracle oinstall  62922752 Oct 21 14:17 undotbs01.dbf
-rw-r----- 1 oracle oinstall   5251072 Oct 21 14:02 users01.dbf
[oracle@db-server testdb]$ rm users01.dbf
[oracle@db-server testdb]$

Now check to be sure file not exists:

[oracle@db-server testdb]$ ls -lrt users01.dbf
ls: users01.dbf: No such file or directory


[oracle@db-server testdb]$

There is no any such file...
Also check table is acceptable 

SQL> conn ulfet/ulfet
Connected.
SQL> select * from test;

        ID
----------
         1

SQL> select table_name, tablespace_name from user_tables;

TABLE_NAME                             TABLESPACE_NAME
------------------------------        ------------------------------
TEST                                                 USERS

SQL>

Hmmm, table acceptable yet, need to flush buffer cache or restart db.

SQL> conn /as sysdba
Connected.

SQL> alter system flush buffer_cache;

System altered.

--Check again
SQL> conn ulfet/ulfet
Connected.
SQL> select * from test;
select * from test
              *
ERROR at line 1:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/oracle/product/11.2.0/oradata/testdb/users01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3


SQL> 

Oracle retrieve information about that users01.dbf is missing...

However, the datafile is missing, dbwriter backgound process still works.

Check dbwr process: 
[oracle@db-server testdb]$ ps -ef | grep dbw
oracle    3482     1  0 13:53 ?        00:00:04 ora_dbw0_testdb
oracle    4675  3296  0 14:25 pts/3    00:00:00 grep dbw
[oracle@db-server testdb]$

[oracle@db-server testdb]$ ls -lrt /proc/3482/fd/ | grep users
lrwx------ 1 oracle oinstall 64 Oct 21 14:28 23 -> /oracle/product/11.2.0/oradata/testdb/users01.dbf (deleted)


[oracle@db-server testdb]$ ls -lrt /proc/3482/fd/23
lrwx------ 1 oracle oinstall 64 Oct 21 14:28 /proc/3482/fd/23 -> /oracle/product/11.2.0/oradata/testdb/users01.dbf (deleted)


first we set a symbolic link so that oracle can see it as it was before the delete:

ln -s /proc/3482/fd/23 /oracle/product/11.2.0/oradata/testdb/users01.dbf

Switch tablespace to read only before restoring data file.

SQL> conn /as sysdba
Connected.

SQL> alter tablespace users read only;

Tablespace altered.

SQL>


We drop the symbolic link: 

[oracle@db-server testdb]$ rm users01.dbf

Copy the file to there where it was deleted.

cp -p /proc/3482/fd/23 /oracle/product/11.2.0/oradata/testdb/users01.dbf
[oracle@db-server testdb]$ ls -lrt users01.dbf
-rw-r----- 1 oracle oinstall 5251072 Oct 21 16:09 users01.dbf

So, datafile is available and time to take tablespace back to read write.


SQL> alter tablespace users read write;

Tablespace altered.

SQL>

Check Ulfet`s table is available ?

SQL> conn ulfet/ulfet
Connected.

SQL> select * from test;

        ID
----------
         1

SQL> 

Yes, we did it.


P.S: This is not acceptable for Windows.

Comments

Post a Comment

Popular posts from this blog

Fix ORA-01139: RESETLOGS option only valid after an incomplete database recovery

While shutting down my TEST database process was hanged. Then I had to use shutdown abort. But when I wanted to start database it did not open. SQL> select name from v$database; NAME --------- TEST SQL> shut abort; ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 6597406720 bytes Fixed Size 2265664 bytes Variable Size 3204451776 bytes Database Buffers 3372220416 bytes Redo Buffers 18468864 bytes Database mounted. SQL> alter database open; alter database open * ERROR at line 1: ORA-03113: end-of-file on communication channel Process ID: 6552 Session ID: 191 Serial number: 3  What`s wrong?  SQL> alter database open resetlogs; ERROR:    ORA-03114: not connected to ORACLE    SQL> exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Pr...

Fix: ORA-13639: The current operation was interrupted because it timed out.

Sometimes SQL Tuning Advisor interrupts cause time limit took more than defined. You have to analyze it or increase value. Here you can see increasing of value. Example result of sql select                  execution_name, advisor_name,                  to_char(execution_start,'dd-mon-yy hh:mi:ss') execution_start,                  to_char(execution_end,'dd-mon-yy hh:mi:ss') execution_end, status,error_message from dba_advisor_executions where task_name = 'SYS_AUTO_SQL_TUNING_TASK' order by execution_start; Check value of TIME_LIMIT`s parameter : SQL> column parameter_value for A35 SQL> select parameter_name, parameter_value from dba_advisor_parameters where task_name = 'SYS_AUTO_SQL_TUNING_TASK' and parameter_name in ('TIME_LIMIT', 'DEFAULT_EXECUTION_TYP...

How to fix ORA-26040: Data block was loaded using the NOLOGGING option

Today I faced with new ORA error. After solving I want to share this experience with yours. So, today 5`th datafile of my database was corrupted (/u01/app/oracle/oradata/ulfet_db/example01.dbf). After recover via RMAN I saw strange error. RMAN> recover datafile 5 block 443; Starting recover at 24-MAR-13 using channel ORA_DISK_1 channel ORA_DISK_1: restoring block(s) channel ORA_DISK_1: specifying block(s) to restore from backup set restoring blocks of datafile 00005 channel ORA_DISK_1: reading from backup piece /u01/app/oracle/flash_recovery_area/ULFET_DB/backupset/2013_03_24/o1_mf_nnndf_TAG20130324T223233_8nykp220_.bkp channel ORA_DISK_1: piece handle=/u01/app/oracle/flash_recovery_area/ULFET_DB/backupset/2013_03_24/o1_mf_nnndf_TAG20130324T223233_8nykp220_.bkp tag=TAG20130324T223233 channel ORA_DISK_1: restored block(s) from backup piece 1 channel ORA_DISK_1: block restore complete, elapsed time: 00:00:03 starting media recovery media recovery complete, elapsed ti...