Recovering From Loss Of Datafile

  • Uploaded by: SHAHID FAROOQ
  • 0
  • 0
  • May 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Recovering From Loss Of Datafile as PDF for free.

More details

  • Words: 1,282
  • Pages: 5
Recovering From Loss of Datafile We know that in Oracle, certain things are and can be done at certain times. One of those operations pertains to adding or creating datafiles. One operation where adding datafiles to a database is common is within or during the CREATE DATABASE-related statements. Even if using Oracle managed files and accepting defaults, datafiles will be created. Creating tablespaces also includes a provision for adding datafiles. Yet another add/create datafile event takes place when altering a tablespace for growth-related purposes (altering a tablespace by adding a datafile). In all of these scenarios, there is one thing in common: when the datafile is added, it is associated with a tablespace you have named or identified in the DDL statement. To categorize the commands or operations being used, we can identify them as CREATE or ALTER operations. Is it possible to add (by creating) a datafile to the database without specifying the tablespace to which it belongs? That is, can you issue an ALTER DATABASE CREATE DATAFILE ‘<path/name>’; and expect Oracle to know what to do with this file? If so, does this work for any datafile? And, why would you do this in the first place? After you alter the structure of a database (e.g., add a new datafile for whatever reason, add a new tablespace, or add another file to an existing tablespace), what is a best practice to follow? That’s right, take a backup. The Administrator’s Guide (10gR2) states the following no less than five times: After making any structural changes to a database, always perform an immediate and complete backup. Let’s suppose that sometime after having added a datafile (or before having a backup) and data manipulation operations have been applied to objects whose tablespace owns the datafile of interest, you lose the datafile. Media recovery is now required. Can the data be recovered? Don’t you need a backup of the datafile to which archived redo logs are applied in order to perform media recovery? Almost every example of media recovery seems to include that part – restore a backed up copy of the datafile and then apply archived redo logs to bring the tablespace to a more current point in time. This scenario is different – there is no backed up copy of the datafile to start with, so how can recovery be used here? The file existed once and now it does not. The control file still knows about the file, which is why you may or may not be able to open the database, or keep the database in an open state. This is where the ALTER DATABASE CREATE DATAFILE statement comes into play. You do not explicitly state the tablespace to which the datafile belongs because Oracle already knows this bit of information. Your task (one of two) in this scenario is to create a replacement file (same name or rename it, to include using a different path). Do you have to specify the size of the file? No, again, Oracle already knows this. Your other mission (two of two) is to apply archived redo logs against this filler/placeholder file. To reiterate what must be done: create a new datafile and apply archived redo logs (using RECOVER DATAFILE). Does this work for any datafile? It does not, specifically; you cannot use this technique to recover SYSTEM tablespace datafiles. Does this work for any DML-without-a-backed-up-copy scenario? No, it does not. If the DML was not logged, then there is nothing to recover from the archived redo logs. When is, or when can it be, DML not logged? That’s a different

topic (covered here), so for the point of this scenario, we assume that normal logging has taken place. Seeing is believing, so let’s prove that recovery can take place with an example. Create a test database (one you can afford to trash) and make the files as small as practical (we don’t care about the size; it’s just the fact that they exist). The database will need to be in archivelog mode. Once the database is open for business, create a new tablespace or add a datafile to an existing tablespace AND have the file location in a place where you can replicate media failure. A flash drive is handy for this; just pull the drive when ready to simulate loss of the datafile. Another way is to shutdown the database and rename the target/now missing file. After adding the datafile, create a table, add some data to it, ensure the redo logs rotate through at least once, and then pull the drive. In the recovery scenario, pretending that the flash drive location is no longer available, the CREATE DATAFILE statement will use syntax like so: ALTER DATABASE CREATE DATAFILE ‘the old path/name’ AS ‘use a new path/name’; The media recovery step is then applied against the new datafile via: RECOVER DATAFILE ‘the new path/name’; Assuming this all goes well, what should you do when recovery is complete? That’s right – take a backup. If you can recover (so easily?) this way, then why is a backup after adding a new file such a big deal? Going back to the NOLOGGING option, what if a table had been created via NOLOGGING? Or an index? Or lots and lots of each? At least with the backed up datafile, you will have captured the structure of those objects. Without the file, you would have to re-create them, which, in a recovery scenario, could add extra time you don’t really want to be spending given the possible/potential high degree of visibility or scrutiny you may be experiencing (ignoring the obvious question about why there wasn’t a backed up copy of the file in the first place). The figures and pictures below show the scenario of losing a datafile (I did a shutdown and deleted the file after the service was stopped). Starting Files FILE_NAME MB ----------------------------------------------------- ----C:\ORACLE\PRODUCT\10.2.0\ORADATA\DEMO\USERS01.DBF 5 C:\ORACLE\PRODUCT\10.2.0\ORADATA\DEMO\SYSAUX01.DBF 240 C:\ORACLE\PRODUCT\10.2.0\ORADATA\DEMO\UNDOTBS01.DBF 25 C:\ORACLE\PRODUCT\10.2.0\ORADATA\DEMO\SYSTEM01.DBF 470 Add a datafile SQL> alter tablespace users 2 add datafile 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\DEMO\USERS02.DBF' 3 size 5M; Tablespace altered.

User DML SQL> alter tablespace users SQL> conn scott/tiger@demo Connected. SQL> create table lost 2 as select * from all_objects; Table created. SQL> delete from lost; 40768 rows deleted. SQL> commit; Commit complete. SQL> insert into lost select * from all_objects; 40768 rows created. SQL> commit; Commit complete. Switch logfiles SQL> conn system/oracle@demo Connected. SQL> alter system switch logfile; System altered. SQL> / System altered. SQL> /

System altered.

Shutdown, and startup. Check the alert log.

Alert Log - file is missing Errors in file c:\oracle\product\10.2.0\admin\demo\bdump\demo_dbw0_3512.trc: ORA-01157: cannot identify/lock data file 5 - see DBWR trace file ORA-01110: data file 5: 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\DEMO\USERS02.DBF' ORA-27041: unable to open file OSD-04002: unable to open file O/S-Error: (OS 2) The system cannot find the file specified. Perform Recovery SQL> conn / as sysdba Connected. SQL> select status from v$instance; STATUS -----------MOUNTED SQL> alter database create datafile 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\DEMO\USERS02.DBF'; Database altered. SQL> recover datafile 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\DEMO\USERS02.DBF'; ORA-00279: change 548985 generated at 07/01/2008 21:52:32 needed for thread 1 ORA-00289: suggestion : C:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\DEMO\ARCHIVELOG\2008_07 _01\O1_MF_1_ 2_%U_.ARC ORA-00280: change 548985 for thread 1 is in sequence #2

Specify log: {=suggested | filename | AUTO | CANCEL} Log applied. Media recovery complete. SQL> alter database open; Database altered. Back to normal SQL> conn scott/tiger@demo Connected. SQL> select count(*) from lost; COUNT(*) ---------40768

In Closing This is actually pretty easy to practice and demonstrate, and it offers a little twist on the usual “how and when” you add datafiles to the database operation. As an alternative demonstration, create a table using the NOLOGGING option (can you identify one way how?) and then apply DML, rotate the logs, and induce media failure. Without re-creating the table, can you recover now?

Related Documents


More Documents from ""