Oracle控制文件删除一个如何恢复,删除所有控制文件如何恢复

少了一个控制文件如何恢复
SQL> show parameter control;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string /u01/app/oracle/oradata/PROD/d
isk1/control01.ctl, /u01/app/o
racle/oradata/PROD/disk2/contr
ol01.ctl, /u01/app/oracle/orad
ata/PROD/disk3/control01.ctl
SQL> select name from v$controlfile;

NAME
--------------------------------------------------
/u01/app/oracle/oradata/PROD/disk1/control01.ctl
/u01/app/oracle/oradata/PROD/disk2/control01.ctl
/u01/app/oracle/oradata/PROD/disk3/control01.ctl

SQL> alter system set control_files='/u01/app/oracle/oradata/PROD/disk1/control01.ctl','/u01/app/oracle/oradata/PROD/disk2/control01.ctl','/u01/app/oracle/oradata/PROD/disk3/control01.ctl' scope=spfile...
2
SQL>
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 419430400 bytes
Fixed Size 1219760 bytes
Variable Size 121635664 bytes
Database Buffers 293601280 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SQL> show parameter control;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string /u01/app/oracle/oradata/PROD/d
isk1/control01.ctl, /u01/app/o
racle/oradata/PROD/disk2/contr
ol01.ctl, /u01/app/oracle/orad
ata/PROD/disk3/control01.ctl,
/u01/app/oracle/oradata/PROD/d
isk4/control01.ctl
SQL> select name from v$controlfile;

NAME
--------------------------------------------------
/u01/app/oracle/oradata/PROD/disk1/control01.ctl
/u01/app/oracle/oradata/PROD/disk2/control01.ctl
/u01/app/oracle/oradata/PROD/disk3/control01.ctl
/u01/app/oracle/oradata/PROD/disk4/control01.ctl

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 419430400 bytes
Fixed Size 1219760 bytes
Variable Size 121635664 bytes
Database Buffers 293601280 bytes
Redo Buffers 2973696 bytes
ORA-00205: error in identifying control file, check alert log for more info


SQL> select instance_name,status from v$instance;

INSTANCE_NAME STATUS
---------------- ------------
PROD STARTED

SQL> alter database mount;

Database altered.

SQL> alter database open;

Database altered.

SQL> select name from v$controlfile;

NAME
--------------------------------------------------
/u01/app/oracle/oradata/PROD/disk1/control01.ctl
/u01/app/oracle/oradata/PROD/disk2/control01.ctl
/u01/app/oracle/oradata/PROD/disk3/control01.ctl
/u01/app/oracle/oradata/PROD/disk4/control01.ctl
删除所有控制文件恢复(1)
恢复控制文件里的内容只有恢复了,日志文件,数据文件字符集,没写临时表空间信息,
SQL> alter database backup controlfile to trace;(一定要有之前打过这句话才能恢复所有的4控制文件)

Database altered.

SQL> alter database backup controlfile to '/home/oracle/control.bak';

Database altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 419430400 bytes
Fixed Size 1219760 bytes
Variable Size 121635664 bytes
Database Buffers 293601280 bytes
Redo Buffers 2973696 bytes
ORA-00205: error in identifying control file, check alert log for more info

这里用NORESETLOGS,如果用RESETLOGS语句会重做日志,出问题

SQL> oradebug setmypid;
Statement processed.
SQL> oradebug tracefile_name;
/oracle/app/oracle/diag/rdbms/db01/db01/trace/db01_ora_3611.trc

[oracle@db01 ~]$ more /oracle/app/oracle/diag/rdbms/db01/db01/trace/db01_ora_3611.trc

截取下面的话 到sqlplus里面操作进行重新创建控制文件


SQL> CREATE CONTROLFILE REUSE DATABASE "DB01" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 4096
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/oracle/oradata/db01/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/oracle/oradata/db01/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/oracle/oradata/db01/redo03.log' SIZE 50M BLOCKSIZE 512,
GROUP 4 '/oracle/oradata/db01/redo04.log' SIZE 50M BLOCKSIZE 512,
GROUP 5 '/oracle/oradata/db01/redo05.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/oracle/oradata/db01/system01.dbf',
'/oracle/oradata/db01/sysaux01.dbf',
'/oracle/oradata/db01/undotbs01.dbf',
'/oracle/oradata/db01/users01.dbf',
'/oracle/oradata/db01/example01.dbf'
CHARACTER SET ZHS16GBK
;

Control file created.

SQL> select instance_name,status from v$instance;

INSTANCE_NAME STATUS
---------------- ------------
PROD MOUNTED

SQL> alter database open;

Database altered.

SQL> select name from v$controlfile;

NAME
--------------------------------------------------
/u01/app/oracle/oradata/PROD/disk1/control01.ctl
/u01/app/oracle/oradata/PROD/disk2/control01.ctl
/u01/app/oracle/oradata/PROD/disk3/control01.ctl
/u01/app/oracle/oradata/PROD/disk4/control01.ctl
再恢复临时表空间信息,trace文件里有,可以查找一下

删除所有控制文件恢复(2)
假如有个旧的控制文件恢复所有控制文件,先把这个文件拷贝到控制文件的相关目录下,把数据库骗到mount状态下,去跑trace的语句(SQL> alter database backup controlfile to trace;只能在mount底下执行),让trace的文件内生成创建控制文件的语句,
SQL> alter database backup controlfile to '/home/oracle/control.bak';
[oracle@db01 ~]$ cp control.bak /u01/app/oracle/oradata/PROD/disk1/control01.ctl
[oracle@db01 ~]$ cp control.bak /u01/app/oracle/oradata/PROD/disk2/control01.ctl
[oracle@db01 ~]$ cp control.bak /u01/app/oracle/oradata/PROD/disk3/control01.ctl
[oracle@db01 ~]$ cp control.bak /u01/app/oracle/oradata/PROD/disk4/control01.ctl
然后mount数据库,再跑trace语句生成创建控制文件的语句
alter database backup controlfile to trace
这个时候的控制文件是旧的,先删除旧的控制文件
然后关闭数据库再启动数据库,这个时候会发现数据库没有控制文件起不来,然后我们通过tarce文件里的创建控制文件的语句进行创建控制文件恢复,恢复的时候先核对语句内的文件路径是否正确
alter database backup controlfile to trace
[oracle@db01 ~]$ more /oracle/app/oracle/diag/rdbms/db01/db01/trace/db01_ora_3611.trc

这里用NORESETLOGS,如果用RESETLOGS语句,需要在数据库坏了,做不完全的时候用这个。
这时候演示了 RESETLOGS,发现了一下的情况正常打开数据库没反应,所以要用 open resetlogs;
看到open resetlogs。有两种情况,一种是恢复控制文件的时候使用,另一种是做不完全备份恢复的时候会用到。
控制文件恢复会遇到以下几种情况

用着4种情况试一下开库,能解决99%的shutdown abort
不能开库的问题

然后我打开了跟踪,想跟踪其他表的信息,发现临时表坏了
再恢复临时表空间信息,trace文件里有,可以查找一下



猜你喜欢

转载自blog.csdn.net/qq_24073707/article/details/80051662