控制文件管理(重建、备份、恢复、增加,减少)

来源:互联网 发布:云数据库怎么用 编辑:程序博客网 时间:2024/06/06 00:25

1、控制文件的个数与位置管理

因为控制文件时在参数文件定义的,所以可以直接修改参数文件

SPfile修改的步骤:

    修改SPFILE参数control_files

    一致性关闭数据库

    增加或减少控制文件

    启动数据库使用SPFILE

    验证结果

1)、减少控制文件:

SQL> show parameter control_f;Sql>alter system set control_files='/oracle/oradata/oracleto/control01.ctl' scope=spfile;Shutdown immediateStartup  完成


 

2)、增加控制文件:

 sql>show parameter control_f;  确认控制文件的路径等相关信息。    Sql>alter system set control_files='/oracle/oradata/oracleto/control01.ctl' ,'/oracle/oradata/oracleto/control02.ctl','/oracle/oradata/oracleto/control03.ctl' scope=spfile;    Shutdown immediate;    Startup 此时会报版本号错误,那么需要从高版本的拷贝至低版本。ORA-00214: control file '/oracle/oradata/oracleto/control01.ctl' version 771 inconsistent with file '/oracle/oradata/oracleto/control02.ctl' version 762    sql>show parameter control_f;  确认控制文件的路径等相关信息。    SQL> ho cp /oracle/oradata/oracleto/control01.ctl /oracle/oradata/oracleto/control02.ctl    SQL> ho cp /oracle/oradata/oracleto/control01.ctl /oracle/oradata/oracleto/control03.ctl     Alter database mount;  检查是否解决问题。    Startup   完成。



Pfile修改的步骤:

    一致性关闭数据库

    修改Pfile参数

    增加或减少控制文件

    启动数据库使用PFILE

    验证结果

    

3)状态管理:

目的是看数据库使用的控制文件与参数定义控制文件是否吻合。

文件。每到数据库启动到mount都读控制文件并把数据库的结构对应到实际的文件上去才能启动。

存在状态:

    找位置和个数  show parameter control_f查处的结果在通过操作系统来对比

    Ho ll -h /路径 

    需要查看磁盘空间使用情况 sql>ho df -H

    查看文件的大小 sql>ho ls -lh /oracle/oradata/ora<sid>.ctl 

       控制文件尽量控制在100M以内,如果超过了,那么需要尽快采取措施,一般情况下需要重建控制文件。

 

  4)控制文件备份。

       Sql>alter database backup controlfile to '/oracle/bakcup/control20120522.bak';    归档模式下这样备份才有作用 ,当控制文件出现问题是,可以直接在操作系统下拷贝过去就行。    Sql>alter database backup controlfile to trace as '/oracle/....txt'  这样就得到一个重建控制文件的脚本。    通过rman备份  也需要归档模式才能使用rman     Rman>backup current controlfile;  自动就在闪回目录下。    或者rman>backup database include current controlfile; 备份数据库的同时也备份控制文件    


  

2、重建控制文件原则

恢复管理:

    如果控制文件丢失和不一致了,需要DBA处理,首先确认控制文件交易号码那个比较新那个比较旧。复制新的给旧的或者直接更改参数文件control_file使用新的

    

3、几种丢失情况的解决:

 1)确认数据库是否处于归档模式,不是归档,则先全备,然后建立新的控制文件即可。

 解决办法:

•确认数据文件,默认的数据文件保存在$ORACLE_BASE/oradata/<sid>/xxxx.dbf 文件。•查看告警日志  vi $ORACLE_BASE/admin/$ORACLE_SID/bdump/alter_orcl.log•建立控制文件(有些相关的文件可以通过ALTER日志查询到相关的数据,数据文件,日志文件个数、路径、大小很重要,一定要搞清楚)CREATE CONTROLFILE REUSE DATABASE "ORACLETO" NORESETLOGS  NOARCHIVELOG ---不要把日志文件重置了,方便后面的recover    MAXLOGFILES 16    MAXLOGMEMBERS 3    MAXDATAFILES 100    MAXINSTANCES 8    MAXLOGHISTORY 292LOGFILE  GROUP 1 '/oracle/oradata/oracleto/redo01.log'  SIZE 50M,  GROUP 2 '/oracle/oradata/oracleto/redo02.log'  SIZE 50M,  GROUP 3 '/oracle/oradata/oracleto/redo03.log'  SIZE 50M-- STANDBY LOGFILEDATAFILE  '/oracle/oradata/oracleto/system01.dbf',  '/oracle/oradata/oracleto/undotbs01.dbf',  '/oracle/oradata/oracleto/sysaux01.dbf',  '/oracle/oradata/oracleto/users01.dbf',  '/oracle/oradata/oracleto/example01.dbf'CHARACTER SET WE8ISO8859P1执行这个sql语句  控制文件就会建立•Sql>alter database open;    这里会提示数据库中有一个文件需要恢复•Sql>recover database;  一定要执行这条语句 ,如果需要恢复的内容能在日志文件能找到,那么就可以恢复,如果不能恢复,那么就需要你加隐藏参数让数据库不进行一致性认证。(下面的情况就用到了)•Sql>alter databas open;这样就可以打开数据了。


    2)归档和日志都在;先全备,然后再使用备份的控制文件恢复即可

    在所有操作之前要做全备,很重要

    同样查看警告日志 vi $ORACLE_BASE/admin/$ORACLE_SID/bdump/alter_orcl.log,确认问题所在

    确认控制文件时候在,show parameter control_f查路径,ls -l查看

    确定不在之后,那么就可以从备份文件恢复

    

SQL> show parameter control_    NAME                                 TYPE                   VALUE    ------------------------------------ ---------------------- ------------------------------    control_file_record_keep_time        integer                7    control_files                        string                 /oracle/oradata/oracleto/contr                                                                ol01.ctl, /oracle/oradata/orac                                                         leto/control02.ctl, /oracle/or                                                              adata/oracleto/control03.ctl        SQL> ho cp /oracle/controlbak.ctl /oracle/oradata/oracleto/control01.ctl    SQL> ho cp /oracle/controlbak.ctl /oracle/oradata/oracleto/control02.ctl    SQL> ho cp /oracle/controlbak.ctl /oracle/oradata/oracleto/control03.ctl    SQL> ho ls /oracle/oradata/oracleto/     SQL> alter database mount;    Database altered.    SQL> alter database open;                  ------------恢复失败    alter database open    *    ERROR at line 1:    ORA-01589: must use RESETLOGS or NORESETLOGS option for database open      SQL> alter database recover database using backup controlfile;  用备份的控制文件恢复    alter database recover database using backup controlfile    *    ERROR at line 1:    ORA-00279: change 792378 generated at 05/24/2012 07:32:41 needed for thread 1    ORA-00289: suggestion : /oracle/flash_recovery_area/ORACLETONY/archivelog/2012_05_26/o1_mf_1_13_%u_.arc    ORA-00280: change 792378 for thread 1 is in sequence #13        SQL> shutdwon immediate       SQL> startup    ORACLE instance started.        Total System Global Area  167772160 bytes    Fixed Size                  1218316 bytes    Variable Size             130025716 bytes    Database Buffers           33554432 bytes    Redo Buffers                2973696 bytes    Database mounted.   -----------仍然不能恢复    ORA-01589: must use RESETLOGS or NORESETLOGS option for database open     SQL> shutdonwn immediate    在重做上面一步:    SQL> alter database recover database using backup controlfile; 不行        SQL> alter database recover database using backup controlfile until change 792378; ---------------也不行    alter database recover database using backup controlfile until change 792378    *    ERROR at line 1:    ORA-00275: media recovery has already been started    SQL> alter database open resetlogs;    alter database open resetlogs    *    ERROR at line 1:    ORA-01156: recovery in progress may need access to files        SQL> shutdown immediate;    SQL> startup        SQL> alter database recover database using backup controlfile until change 792378;    SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile; 使用隐藏参数,不让数据库进行一致性验证。    SQL> startup force    SQL> alter database open resetlogs;  可以启动了    Sql>startup     最后要干掉隐藏参数,不然以后系统会出现ORA-600的内部错误。    Sql>show parameter _allow    Sql>alter system reset "_allow_resetlogs_corruption" scope=spfile sid='*';    

    3)归档模式下使用正常的方式来恢复。

       上面那种方法错误的执行 alter database recover database using backup controlfile,最后还使用了不该用的隐藏参数。

    第一种方法

SQL> startup    ORACLE instance started.        Total System Global Area  167772160 bytes    Fixed Size                  1218316 bytes    Variable Size             125831412 bytes    Database Buffers           37748736 bytes    Redo Buffers                2973696 bytes    ORA-00205: error in identifying control file, check alert log for more info查看告警日志。Vi $ORACLE_BASE/admin/alter.....log    SQL> shwo parameter control_f    SQL> ho ls /oracle/oradata/oracleto    SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control01.ctl               SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control02.ctl    SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control03.ctl    SQL> shutdown immediate    SQL> startup    ORACLE instance started.    Total System Global Area  167772160 bytes    Fixed Size                  1218316 bytes    Variable Size             125831412 bytes    Database Buffers           37748736 bytes    Redo Buffers                2973696 bytes    Database mounted.    ORA-01589: must use RESETLOGS or NORESETLOGS option for database open    SQL> alter database open resetlogs;    alter database open resetlogs    *    ERROR at line 1:    ORA-01092: ORACLE instance terminated. Disconnection forced  连接中断    SQL> startup   可以正常启动了    ORACLE instance started.  

    第一种方法出现第二种情况

SQL>alter database open resetlogs;    如果这里提示数据库一致性验证错误,那么需要做以下几步操作    Sql>recover database;    提示需要用老的控制文件。    Sql>alter database recover  database using backup controlfile;    还是不行。提示错误    Sql>shutdown immediate    Sql>startup     Sql>alter database open resetlogs;    Sql>recover database 同样提示需要老的控制文件    Sql>recover  database using backup controlfile;    执行之后会提示归档日志找不到,需要从日志文件中找,所以指定日志文件,那么你可以挨个将日志文件的路径输入进去,在这里有可能出现归档日志过旧的问题,还需要将日志文件输入进去找到最近的SCN(当前REDO为归档) $ORACLE_BASE/oradata/.....(需要绝对路径)SQL> recover database using backup controlfile;ORA-00279: change 605460 generated at 07/20/2013 20:42:17 needed for thread 1ORA-00289: suggestion :/oracle/app/oracle/flash_recovery_area/ORCL/archivelog/2013_07_20/o1_mf_1_25_%u_.arcORA-00280: change 605460 for thread 1 is in sequence #25Specify log: {<RET>=suggested | filename | AUTO | CANCEL}/oracle/app/oracle/flash_recovery_area/ORCL/archivelog/2013_07_20/o1_mf_1_24_8yo1fb2g_.arcORA-00328: archived log ends at change 605166, need later change 605460ORA-00334: archived log:'/oracle/app/oracle/flash_recovery_area/ORCL/archivelog/2013_07_20/o1_mf_1_24_8yo1fb2g_.arc'SQL> recover database using backup controlfile;ORA-00279: change 605460 generated at 07/20/2013 20:42:17 needed for thread 1ORA-00289: suggestion :/oracle/app/oracle/flash_recovery_area/ORCL/archivelog/2013_07_20/o1_mf_1_25_%u_.arcORA-00280: change 605460 for thread 1 is in sequence #25Specify log: {<RET>=suggested | filename | AUTO | CANCEL}/oracle/app/oracle/oradata/orcl/redo03.logLog applied.Media recovery complete.SQL> alter database open resetlogs;   ---这样就可以打开了。Database altered.

    第二种方法是用隐藏参数(尽量少用,用完要去掉隐含参数)
SQL> startup    ORACLE instance started.        Total System Global Area  167772160 bytes    Fixed Size                  1218316 bytes    Variable Size             125831412 bytes    Database Buffers           37748736 bytes    Redo Buffers                2973696 bytes    ORA-00205: error in identifying control file, check alert log for more info     查看告警日志。Vi $ORACLE_BASE/admin/alter.....log    SQL> shwo parameter control_f    SQL> ho ls /oracle/oradata/oracleto    SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control01.ctl               SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control02.ctl    SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control03.ctl    SQL> shutdown immediate    SQL> startup    ORACLE instance started.    Total System Global Area  167772160 bytes    Fixed Size                  1218316 bytes    Variable Size             125831412 bytes    Database Buffers           37748736 bytes    Redo Buffers                2973696 bytes    Database mounted.    ORA-01589: must use RESETLOGS or NORESETLOGS option for database open    Sql>recover database;    提示不能恢复,需要是用老的控制文件恢复    Sql>recover  database using backup controlfile; 还是不行    SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile; 使用隐藏参数,不让数据库进行一致性验证。    Sql>start force    Sql>alter database open resetlog;  实例终端    Sql>重新连接,startup    最后去掉隐藏参数    Sql>show parameter _allow    Sql>alter database reset "_allow_resetlogs_corruption" scope=spfile sid='*';    完成。

       4)归档但日志不全;先全备,然后建立新的控制文件。

    参考重建控制文件部分。

4、新建控制文件语句:

    可以在在数据库运行在OPENmount的时候,可以执行alter database backup controlfile to trace as '<dir路径>'得到建立语句;,但要注意[no]archivelog [no]resetlogs 2个参数的区别。

       开启归档模式 (SQL> archive log list 数据库OPEN阶段可以查询)    首先数据库要处于mount阶段才能开启, SQL> alter database archivelog;    然后把数据打开 SQL> archive log list 查询确认。


 

 

原创粉丝点击