Wednesday, December 27, 2017

How to recover a corrupted/damaged/lost/canceled NONSYSTEM datafile

How to recover a corrupted/damaged/lost/canceled NONSYSTEM datafile (database in ARCHIVELOG mode)

 
The following scenario describes what happens when a nonsystem datafile is lost. Before proceeding be sure to have a complete backup of your test database and be sure your database is in ARCHIVELOG mode. 


[oracle@localhost orcl]$ sqlplus / as sysdba
SQL> startup
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     1
Next log sequence to archive   2
Current log sequence           2

 rman target /
RMAN> report schema;

Report of database schema for database with db_unique_name ORCL

List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    790      SYSTEM               YES     /u01/app/oracle/oradata/orcl/system01.dbf
3    620      SYSAUX               NO      /u01/app/oracle/oradata/orcl/sysaux01.dbf
4    75       UNDOTBS1             YES     /u01/app/oracle/oradata/orcl/undotbs01.dbf
5    1243     EXAMPLE              NO      /u01/app/oracle/oradata/orcl/example01.dbf
6    5        USERS                NO      /u01/app/oracle/oradata/orcl/users01.dbf

List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    60       TEMP                 32767       /u01/app/oracle/oradata/orcl/temp01.dbf

SQL> set pagesize 999
SQL> set linesize 180
SQL> select OWNER, TABLE_NAME, TABLESPACE_NAME from dba_tables
2  where owner = 'HR';

OWNER                          TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ -----------------------
HR                             REGIONS                    EXAMPLE
HR                             LOCATIONS                     EXAMPLE
HR                             DEPARTMENTS                    EXAMPLE
HR                             JOBS                          EXAMPLE
HR                             EMPLOYEES                   EXAMPLE
HR                             JOB_HISTORY                    EXAMPLE
HR                             COUNTRIES                      EXAMPLE

What does it happens when I delete the datafile where EXAMPLE tablespace is based on.All the tables which is belong to EXAMPLE  tablespace is also deleted.

 I am moving my EXAMPLE datafile in different name.

[oracle@localhost orcl]$ mv /home/oracle/app/oracle/oradata/orcl/users01.dbf /home/oracle/app/oracle/oradata/orcl/users01_damaged.dbf

I'm still able to query the dictionary tables for example but...

SQL> select count(*) from dba_tables;                 

COUNT(*)
----------
3013

I obtain an error when I try to select some rows from the HR.EMPLOYEES table.

SQL> select count(*) from hr.EMPLOYEES;
select count(*) from hr.EMPLOYEES  *
                       
ERROR at line 1:
ORA-01116: error in opening database file 5
ORA-01110: data file 5: '/u01/app/oracle/oradata/orcl/example01.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3


Now Check Alert Log file..

Looking at the  same clear error: the systen is not able to obtain status information on file '/u01/app/oracle/oradata/orcl/example01.dbf'


[oracle@localhost orcl]$ tail -f /home/oracle/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log 
...
Thu Jul 19 07:07:49 2012
Errors in file
/home/oracle/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_m000_7476.trc:
ORA-01116: error in opening database file 5
ORA-01110:data file 5: '/u01/app/oracle/oradata/orcl/example01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
...
If you try to connect with RMAN the REPORT SCHEMA command is now unable to correctly size the EXAMPLE tablespace. RMAN says its size is 0.

 rman target /
RMAN> report schema;

Report of database schema for database with db_unique_name ORCL

List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    831      SYSTEM               *** /home/oracle/app/oracle/oradata/orcl/system01.dbf
2    1105     SYSAUX               *** /home/oracle/app/oracle/oradata/orcl/sysaux01.dbf
3    40       UNDOTBS1             *** /home/oracle/app/oracle/oradata/orcl/undotbs01.dbf
4    1325        USERS                *** /home/oracle/app/oracle/oradata/orcl/users01.dbf
5  0      EXAMPLE              *** /home/oracle/app/oracle/oradata/orcl/example01.dbf
6    7        APEX_1930613455248703 *** /home/oracle/app/oracle/oradata/orcl/APEX_1930613455248703.dbf

List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    20       TEMP                 32767 /home/oracle/app/oracle/oradata/orcl/temp01.dbf

Because theEXAMPLE  tablespace is not a system tablespace, we can recover it just putting it in 
offline mode.

RMAN> sql 'alter database datafile 5 offline';

sql statement: alter database datafile 5 offline

RMAN> restore datafile 5;

Starting restore at 27-DEC-17
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=265 device type=DISK

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00005 to /u01/app/oracle/oradata/orcl/example01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/oracle/fast_recovery_area/ORCL/backupset/2017_12_27/o1_mf_nnndf_TAG20171227T122203_f46jrmy0_.bkp
channel ORA_DISK_1: piece handle=/u01/app/oracle/fast_recovery_area/ORCL/backupset/2017_12_27/o1_mf_nnndf_TAG20171227T122203_f46jrmy0_.bkp tag=TAG20171227T122203
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:45
Finished restore at 27-DEC-17


RMAN> recover datafile 5;

Starting recover at 27-DEC-17
using channel ORA_DISK_1

starting media recovery
media recovery complete, elapsed time: 00:00:00

Finished recover at 27-DEC-17


RMAN> sql 'alter database datafile 5 online';

sql statement: alter database datafile 5 online

Now Again Check Alert log file

In the alert log you can see how the recovery process proceeded

tail -f /home/oracle/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
...
Thu Jul 19 07:30:01 2012
alter database datafile 5 offline
Completed: alter database datafile 5 offline
Thu Jul 19 07:30:01 2012
Starting background process SMCO
Thu Jul 19 07:30:02 2012
SMCO started with pid=46, OS id=8257 
Thu Jul 19 07:31:03 2012
Full restore complete of datafile 5
/home/oracle/app/oracle/oradata/orcl/users01.dbf.  Elapsed time: 0:00:47 
checkpoint is 13569948
last deallocation scn is 13511135
Thu Jul 19 07:31:21 2012
alter database recover datafile list clear
Completed: alter database recover datafile list clear
alter database recover if needed
datafile 5
Media Recovery Start
Serial Media Recovery started
Recovery of Online Redo Log: Thread 1 Group 1 Seq 1 Reading mem 0
Mem# 0: /home/oracle/app/oracle/oradata/orcl/redo01.log
Recovery of Online Redo Log: Thread 1 Group 2 Seq 2 Reading mem 0
Mem# 0: /home/oracle/app/oracle/oradata/orcl/redo02.log
Media Recovery Complete (orcl)
Completed: alter database recover if needed
datafile 5
Thu Jul 19 07:31:35 2012
alter database datafile 5 online
Completed: alter database datafile 5 online
...
 Now I'm able to query again my hr.employees table

SQL> select count(*) from hr.employees;

COUNT(*)
----------
107

and even RMAN is able to size correctly the EXAMPLE tablespace

RMAN> report schema;

Report of database schema for database with db_unique_name ORCL

=====================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    790      SYSTEM               YES     /u01/app/oracle/oradata/orcl/system01.dbf
3    620      SYSAUX               NO      /u01/app/oracle/oradata/orcl/sysaux01.dbf
4    75       UNDOTBS1             YES     /u01/app/oracle/oradata/orcl/undotbs01.dbf
5    1243     EXAMPLE              NO      /u01/app/oracle/oradata/orcl/example01.dbf
6    5        USERS                NO      /u01/app/oracle/oradata/orcl/users01.dbf

List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    60       TEMP                 32767       /u01/app/oracle/oradata/orcl/temp01.dbf

No comments:

Post a Comment

How to create user in MY SQL

Create  a new MySQL user Account mysql > CREATE USER ' newuser '@'localhost' IDENTIFIED BY ' password '...