April 07, 2009

How to Recover Controlfile

Recover controlfile in Archive log mode:

1. connect the database and verify contfile names
SQL> select name from v$controlfile;
NAME
-------------------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\CONTROL01.CTL
D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\CONTROL02.CTL
D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\CONTROL03.CTL

2. Remove one controlfile: CONTROL01.CTL

3. SQL> startup

ORACLE instance started.
Total System Global Area 432013312 bytes
Fixed Size 1249392 bytes
Variable Size 155193232 bytes
Database Buffers 268435456 bytes
Redo Buffers 7135232 bytes
ORA-00205: error in identifying control file, check alert log for more info

4. Verify in alert log:

ORA-00202: control file: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\CONTROL01.CTL'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) The system cannot find the file specified.

5. Copy other controlfile adn rename is as orignal ,becuase database is using multiple controlfiles.

cp CONTROL02.CTL and rename it to CONTROL01.CTL

6. Create a "create control file script". This can be obtained using "Alter database backup controlfile to trace" command if used some time back. Its a good practice to backup the control file to trace regularly when ever the structure if changed (Example when ever a datafile is added). other waise take from

control_file.sql:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "PRIM" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\REDO01.LOG',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\REDO01B.LOG'
) SIZE 50M,
GROUP 2 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\REDO02.LOG' SIZE 50M,
GROUP 3 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\REDO03.LOG' SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\SYSTEM01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\UNDOTBS01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\SYSAUX01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\USERS01.DBF',
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PRIM\USERS02.DBF'
CHARACTER SET WE8MSWIN1252
;


7. Run the created control_file.sql

SQL> @control_file.sql
ORACLE instance started.
Total System Global Area 432013312 bytes
Fixed Size 1249392 bytes
Variable Size 155193232 bytes
Database Buffers 268435456 bytes
Redo Buffers 7135232 bytes
Control file created.

8. Open the database resetlogs

SQL> ALTER DATABASE OPEN RESETLOGS;
Database altered.

9. The add the tempfile
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\PRODUCT\10.2.0

\ORADATA\PRIM\TEMP01.DBF' SIZE 20971520
REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;

Tablespace altered.

We are done. Database is now up and running. There is no loss of data, because all the data files and redo log files were intact.


Note: if all the controlfiles are corrupted,follow same procedures except step 5.

0 comments: