z7369 发表于 2018-9-23 14:26:16

oracle控制文件的恢复

  oracle控制文件的恢复
  控制文件包含数据库的结构信息,这些文件对数据库而言至关重要。如若丢失控制文件,则不能打开数据库。
  控制文件的丢失分两种。第一种是部分控制文件丢失(只丢失了1个或者2个);另外一种是所有控制文件都丢失。
  默认情况下,数据库会自动生成3个控制文件,但是会在同一目录下,本着数据安全的需求,强烈建议将3个控制文件放在不同的磁盘里。
  移动控制文件的方法为:

  SQL>>  'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL',
  'd:\ORACLE\ORCL\CONTROL02.CTL',
  'e:\ORACLE\ORCL\CONTROL03.CTL'
  scope=spfile;
  因为控制文件和数据且文件一样,不能再联机状态下移动。故需要先shutdown 数据库,然后进行移动,最后Startup即可。
  1.部分控制文件丢失后的恢复
  同样的,先shutdown,然后删除一个控制文件CONTROL03.CTL ,重启数据库报错。
  SQL> startup
  ORA-32004: obsolete or deprecatedparameter(s) specified for RDBMS instance
  ORACLE 例程已经启动。
  Total System Global Area778387456 bytes

  Fixed>
  Variable>  Database Buffers          511705088 bytes
  Redo Buffers                5259264 bytes
  ORA-00205: ?????????, ??????, ???????
  首先要解决的问题是ORA-00205:?????????, ??????, ???????
  ?表明字符集除了问题。解决方法如下:

  SQL>>
  Session>
  SQL>>  alter database mount
  ERROR at line 1:

  ORA-00205: error in>  隐刀数据库进入mount状态,报不能识别控制文件的错误。将现有的控制文件CONTROL01.CTL复制一份改名为CONTROL03.CTL。
  对恢复数据库提示没有进行mount状态。
  SQL> recover database;
  ORA-01507: database not mounte
  启动数据库到mount状态下

  SQL>>
  Database>  然后对恢复数据库
  SQL> recover database;
  ORA-00283: recovery session canceled due toerrors
  ORA-00264: no recovery required
  由于是正常关闭数据库进行的测试,数据库不需要执行恢复。
  SQL> conn sys/oracle as sysdba;
  已连接。

  SQL>>  数据库已更改。
  SQL> select * from global_name;
  GLOBAL_NAME
  -----------------------------------------------------------------------------
  ORCL
  2.所有控制文件丢失后的恢复
  2.1方法一:重新创建控制文件来恢复
  用这种方法也有2种方式来实现,第一种是直接自己手动编写脚本来创建控制文件,但前提是对数据库的重做日志、数据文件的目录要非常清楚;另外一种方式是在数据库正常状态时,备份一下创建控制文件脚本到跟踪文件,这样创建控制文件的所有脚本信息都会很完整,就无需手工编写了,但前提自然是管理员要有觉悟,提前备份一份创建控制文件到trance文件。
  我们直接测试第二种方式:
  我们查看一下生成的trace文件的目录。
  SQL> show parameteruser_dump_dest;
  NAME            TYPE      VALUE
  ------------------------ -----------   ----------------------
  user_dump_dest   string   c:\app\administrator\diag\rdbms\orcl\orcl\trace
  然后是备份创建控制文件的脚本到跟踪文件中

  SQL>>  数据库已更改。
  我们关闭数据库,然后删除所有的控制文件。
  然后是到c:\app\administrator\diag\rdbms\orcl\orcl\trace目录中寻找刚才生成有创建控制文件脚本的跟踪文件。经过一一寻找验证之后,发现是orcl_ora_3696.trc这个文件。(此处要注意:在实际环境下,应该是执行上述命令之后,立即保存到特定目录中已被恢复使用)。
  接下来我们打开这个trace文件,可以找到相关的脚本信息:
  STARTUP NOMOUNT
  CREATE CONTROLFILE REUSEDATABASE "ORCL" NORESETLOGS ARCHIVELOG
  MAXLOGFILES 16
  MAXLOGMEMBERS 3
  MAXDATAFILES 100
  MAXINSTANCES 8
  MAXLOGHISTORY 292
  LOGFILE
  GROUP 1 (
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG',
  'C:\APP\ADMINISTRATOR\ORADATA\XC2\REDO01.LOG'

  )>  GROUP 2 (
  'C:\APP\ADMINISTRATOR\ORADATA\XC2\REDO02.LOG',
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG'

  )>  GROUP 3 (
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG',
  'C:\APP\ADMINISTRATOR\ORADATA\XC2\REDO03.LOG'

  )>  DATAFILE
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF',
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF',
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF',
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF',
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM02.DBF',
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX02.DBF',
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS02.DBF',
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS02.DBF',
  'C:\APP\ADMINISTRATOR\ORADATA\ORCL\EXAMPLE01.DBF'
  CHARACTER SET ZHS16GBK;
  执行之后会提示:控制文件已创建。此脚本还需注意开头部分的STARTUP NOMOUNT 命令,必须在nomount状态执行才能创建控制文件。
  SQL> VARIABLE RECNO NUMBER;
  SQL> EXECUTE :RECNO :=SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP
  ','ON');
  PL/SQL 过程已成功完成。
  此处是执行一个PL/SQL 的存储过程,目的是执行DBMS_BACKUP_RESTORE.DBMS_BACKUP_RESTORE包,让RMAN自动备份控制文件。
  当然此处我们是手工备份与恢复,所以不进行如上操作也可以。
  接下来我们就开始恢复数据库
  SQL> recover database;
  ORA-00283: recovery session canceled due toerrors
  ORA-00264: no recovery required
  此时根据提示可知,数据库无需恢复。

  SQL>>
  Database>  SQL> conn sys/oracle as sysdba;
  已连接。
  SQL> select * from global_name;
  GLOBAL_NAME
  -------------------------------------------------------------------------------
  ORCL
  目前已是正常状态了。
  方法二:通过备份的控制文件进行恢复
  同样的,先shutdown,然后删除所有的控制文件,重启数据库报错。
  SQL> startup
  ORA-32004: obsolete or deprecatedparameter(s) specified for RDBMS instance
  ORACLE 例程已经启动。
  Total System Global Area778387456 bytes

  Fixed>
  Variable>  Database Buffers          511705088 bytes
  Redo Buffers                5259264 bytes
  ORA-00205: ?????????, ??????, ???????
  先修改字符集的回话语言。

  SQL>>
  Session>
  SQL>>  alter database mount
  ERROR at line 1:

  ORA-00205: error in>  提示不能识别控制文件,这时所有的控制文件都已丢失,只能依靠备份的控制文件,将之前备份的控制文件CONTROL02.BAK改名复制到控制文件原目录中。
  如若不知道3个控制文件的原目录,可以通过警告日志alertORCL.log来查看。
  执行命令show parameter background_dump_dest,查看警告日志的目录。
  SQL>show parameter background_dump_dest;
  NAME                                 TYPE
  ----------------------------------------------------------
  VALUE
  ------------------------------
  background_dump_dest               string
  c:\app\administrator\diag\rdbm
  s\orcl\orcl\trace
  打开警告日志,在最后看到如下信息:
  Thu May23 17:12:21 2013
  ORA-00210:cannot open the specified control file
  ORA-00202:control file: 'C:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL'
  ORA-27041:unable to open file
  OSD-04002:无法打开文件
  O/S-Error:(OS 2) 系统找不到指定的文件。
  ORA-00210:cannot open the specified control file
  ORA-00202:control file: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL03.CTL'
  ORA-27041:unable to open file
  OSD-04002:无法打开文件
  O/S-Error:(OS 2) 系统找不到指定的文件。
  ORA-00210:cannot open the specified control file
  ORA-00202:control file: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL'
  ORA-27041:unable to open file
  OSD-04002:无法打开文件
  O/S-Error:(OS 2) 系统找不到指定的文件。

  ORA-205signalled during:>  由此可知;3个控制文件的目录。
  改名复制完控制文件之后,启动数据库到mount状态,如后恢复。
  SQL> recover database using backupcontrolfile;
  ORA-00911: invalid character
  出现上述问题:原因是controlfile后面的分号是中文模式下输入导致的,千万注意!
  恢复数据库
  SQL> recover database;
  ORA-00283: recovery session canceled due toerrors
  ORA-01610: recovery using the BACKUPCONTROLFILE option must be done
  由上可知必须使用控制文件恢复。
  SQL> recover database using backupcontrolfile;
  ORA-00279: change 2426235 generated at05/23/2013 14:31:12 needed for thread 1
  ORA-00289: suggestion :C:\ORACLE\ORCL\ARCH\ARC0000000068_0806146542.0001
  ORA-00280: change 2426235 for thread 1 isin sequence #68
  Specify log: {=suggested |filename | AUTO | CANCEL}
  Auto(此处可选择自动寻找归档日志)
  ORA-00279: change 2433122 generated at05/24/2013 10:38:10 needed for thread 1
  ORA-00289: suggestion :C:\ORACLE\ORCL\ARCH\ARC0000000069_0806146542.0001
  ORA-00280: change 2433122 for thread 1 isin sequence #69
  ORA-00278: log file'C:\ORACLE\ORCL\ARCH\ARC0000000068_0806146542.0001' no
  longer needed for this recovery
  ORA-00279: change 2435842 generated at05/24/2013 13:14:00 needed for thread 1
  ORA-00289: suggestion :C:\ORACLE\ORCL\ARCH\ARC0000000070_0806146542.0001
  ORA-00280: change 2435842 for thread 1 isin sequence #70
  ORA-00278: log file'C:\ORACLE\ORCL\ARCH\ARC0000000069_0806146542.0001' no
  longer needed for this recovery
  再执行一次恢复命令
  SQL> recover database using backupcontrolfile;
  ORA-00279: change 2459108 generated at05/24/2013 13:50:09 needed for thread 1
  ORA-00289: suggestion :C:\ORACLE\ORCL\ARCH\ARC0000000071_0806146542.0001
  ORA-00280: change 2459108 for thread 1 isin sequence #71
  Specify log: {=suggested |filename | AUTO | CANCEL}
  C:\app\Administrator\oradata\orcl\REDO01.LOG(此处是提示要寻找标号为71的归档日志,但是打开归档日志目录发现最大的编号才是70,说明编号为71的归档信息还在redolog里面,指定正在使用的redolog目录即可。又因为目前不知道正在使用的redolog是哪个文件,此处是先从REDO01.LOG开始尝试)
  ORA-00310: archived log contains sequence70; sequence 71 required
  ORA-00334: archived log:'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG'
  SQL> recover database using backupcontrolfile;
  ORA-00279: change 2459108 generated at05/24/2013 13:50:09 needed for thread 1
  ORA-00289: suggestion :C:\ORACLE\ORCL\ARCH\ARC0000000071_0806146542.0001
  ORA-00280: change 2459108 for thread 1 isin sequence #71
  Specify log: {=suggested |filename | AUTO | CANCEL}
  C:\app\Administrator\oradata\orcl\REDO02.LOG(尝试失败之后,换2号重做日志,提示成功)
  Log applied.
  Media recovery complete.
  改变数据库为open状态:

  SQL>>  alter database open
  *
  ERROR at line 1:
  ORA-01589: must use RESETLOGS or NORESETLOGSoption for database open
  提示错误:启动open状态必须设置参数RESETLOGS or NORESETLOGS。
  使用resetlogs 会导致归档日志的编号归零,重新从1开始编号。使用noresetlogs则不会打断原有的归档日志编号的顺序而继续编号。

  SQL>>  alter database open noresetlogs
  ERROR at line 1:
  ORA-01588: must use RESETLOGS option fordatabase open

  SQL>>
  Database>  经过测试发现,数据库恢复之后,只能通过resetlogs;启动数据库到open状态。
  SQL> shutdown immediate
  Database closed.
  Database dismounted.
  ORACLE instance shut down.
  SQL> startup
  ORA-32004: obsolete or deprecatedparameter(s) specified for RDBMS instance
  ORACLE instance started.
  Total System Global Area778387456 bytes

  Fixed>
  Variable>  Database Buffers          511705088 bytes
  Redo Buffers                5259264 bytes
  数据库装载完毕。
  数据库已经打开。
  SQL> archive log list;
  数据库日志模式存档模式
  自动存档启用
  存档终点            c:\oracle\orcl\arch
  最早的联机日志序列   1
  下一个存档日志序列   1
  当前日志序列         1
  通过查看归档信息,发现归档日志编号确实已归零。

页: [1]
查看完整版本: oracle控制文件的恢复