恢复丢失的控制文件
对于控制文件的介质失败,如果只是其中一个丢失的话,可以通过复制其它好的控制文件进行恢复。如果是全部控制文件全部丢失的话,就只能通过重建控制文件来恢复。下面是具体的一些操作过程。
1、单个控制文件介质失败
SQL> conn sys/sys as sysdba;
已连接。
SQL> alter database backup controlfile to trace;
数据库已更改。
SQL> select name from v$controlfile;
NAME
------------------------------------------------------
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL01.CTL
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL02.CTL
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL03.CTL
SQL> host del G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL01.CTL;
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL01.CTL
另一个程序正在使用此文件,进程无法访问。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host del G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL01.CTL;
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 88081764 bytes
Database Buffers 75497472 bytes
Redo Buffers 2945024 bytes
ORA-00205: ?????????, ??????, ???????
此时复制一个控制文件到丢失控制文件的所在位置,然后把名字修改为control01.ctl,重新启动数据库。
SQL> startup
ORA-01081: ????????? ORACLE - ??????
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01507: ??????
SQL> startup force
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 88081764 bytes
Database Buffers 75497472 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
数据库已经打开。
当丢失的控制文件所在的磁盘坏了的话,可以修改初始化参数control_files。具体操作如下:
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host del G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL01.CTL;
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 88081764 bytes
Database Buffers 75497472 bytes
Redo Buffers 2945024 bytes
ORA-00205: ?????????, ??????, ???????
此时复制好的控制文件到其它磁盘,然后修改初始化参数。
SQL> alter system set control_files=('D:\ control01.ctl','G:\
ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL02.CTL','G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL03.CTL') scope=both;
alter system set control_files=('D:\control01.ctl','G:\ORACL
E\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL02.CTL','G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL03.CTL') scope=both
*
第 1 行出现错误:
ORA-02095: ????????????
此时是不能用ALTER SYSTEM的。通过SPFILE创建一个新的PFILE,然后修改PFILE。
SQL> create pfile='G:\oracle\product\10.2.0\admin\ora10g\pfileora10g.ora' from s
pfile;
文件已创建。
修改PFILE:
control_files='D:\control01.ctl','g:\oracle\product\10.2.0/oradata/ora10g/\control02.ctl','g:\oracle\product\10.2.0/oradata/ora10g/\control03.ctl'
使用PFILE来启动数据库:
SQL> startup force pfile=G:\oracle\product\10.2.0\admin\ora10g\pfileora10g.ora;
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 88081764 bytes
Database Buffers 75497472 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
数据库已经打开。
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------
D:\CONTROL01.CTL
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL02.CTL
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL03.CTL
SQL> create spfile from pfile='G:\oracle\product\10.2.0\admin\ora10g\pfileora10g
.ora';
文件已创建。
2、所有控制文件介质失败
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 88081764 bytes
Database Buffers 75497472 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
数据库已经打开。
SQL> alter database backup controlfile to trace;
数据库已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host del D:\CONTROL01.CTL
SQL> host del G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL02.CTL
SQL> host del G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL03.CTL
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 88081764 bytes
Database Buffers 75497472 bytes
Redo Buffers 2945024 bytes
ORA-00205: ?????????, ??????, ???????
SQL> shutdown immediate
ORA-01507: ??????
ORACLE 例程已经关闭。
此时把跟踪文件里创建控制文件的语句放到一个文件里,然后运行,语句如下:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORA10G" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\REDO01.LOG' SIZE 50M,
GROUP 2 'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\REDO02.LOG' SIZE 50M,
GROUP 3 'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\REDO03.LOG' SIZE 50M,
GROUP 4 'G:\ORACLE\REDOLOG\ORA10G\ONLINELOG\O1_MF_4_326VGXVC_.LOG' SIZE 100M
DATAFILE
'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSTEM01.DBF',
'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\UNDOTBS01.DBF',
'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSAUX01.DBF',
'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\USERS01.DBF'
CHARACTER SET ZHS16GBK;
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE
AUTOBACKUP','ON');
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE
'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\TEMP01.DBF'
SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
SQL> @d:\create_control.sql
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 88081764 bytes
Database Buffers 75497472 bytes
Redo Buffers 2945024 bytes
控制文件已创建。
PL/SQL 过程已成功完成。
ORA-00283: ??????????
ORA-00264: ?????
系统已更改。
数据库已更改。
表空间已更改。
SQL> select open_mode from v$database;
OPEN_MODE
----------
READ WRITE
SQL> select name from v$controlfile;
NAME
------------------------------------------------------
D:\CONTROL01.CTL
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL02.CTL
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\CONTROL03.CTL