当前位置:数据库 > Oracle >>

Oracle—用户管理的完全恢复(三)

Oracle—用户管理的完全恢复(三)
 
一.控制文件的相关说明
1.控制文件一般会多路复用,控制文件更新时则每个文件同时更新。 
 
2.多个控制文件,如果有一个损坏则数据库不能工作,这点和联机重做日志文件不同。
 
3.在每次打开数据库时,数据库会自动检查控制文件和数据文件的SCN是否一致。
 
在视图v$datafile可以看到控制文件的SCN号,视图v$datafile是从控制文件中读取SCN号的。在视图v$datafile_header中读取数据文件头上的SCN号。
 
查看这两视图,
 
SQL> select file#,checkpoint_change# from v$datafile;
     FILE#        CHECKPOINT_CHANGE#
     ----------        ------------------
         1            3016606
         2            3016606
         3            3016606
         4            3016606
         5            3016606
         6            3016606
         8            3016606
        12            3016606
8 rows selected.
 
 
SQL> select file#,checkpoint_change# from v$datafile_header;
     FILE#      CHECKPOINT_CHANGE#
     ----------         ------------------
         1            3016606
         2            3016606
         3            3016606
         4            3016606
         5            3016606
         6            3016606
         8            3016606
        12            3016606
8 rows selected.
比较这两个SCN号,
(1)若控制文件中的SCN号小于数据文件中的SCN号,那么控制文件是旧的,要重建一个新的控制文件。
(2)若控制文件中的SCN号大于数据文件中的SCN号,那么说明数据文件要恢复。
(3)若控制文件的SCN号和数据文件的SCN号相同,那么数据库可以正常打开。
 
 
二.恢复控制文件
由于控制文件是多路复用的,所以控制文件损坏有两种情况,
 
1.控制文件没有全部损坏,则可以把控制文件直接复制到原来的位置或者把spfile中的控制文件位置修改一下。
 
(1)打开数据库,删除一个控制文件,模拟某个控制文件损坏,
[oracle@oracle11g wilson]$ rm -f control01.ctl 
 
正常关闭数据库时会出现错误,
 
SQL> shutdown immediate
Database closed.
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/u01/oradata/wilson/control01.ctl'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
 
现在无法正常打开数据库了,查看警报日志文件alert.wilson_log文件,可以看到控制文件丢失的信息,
 
(2)还原数据文件,命令如下,
 
在/u01/oradata/wilson
[oracle@oracle11g wilson]$ cp  control02.ctl  control01.ctl
然后即可打开数据库。
 
2.如果所有的控制文件都丢失了,怎么进行恢复。
 
(1)在/u01目录下新建个目录backupcf,然后备份控制文件
 
SQL> alter database backup controlfile to trace as '/u01/backupcf/c.trc';
这里备份的是一个创建控制文件的脚本。
 
(2)在数据库打开状态,删除所有控制文件,
[oracle@oracle11g wilson]$ rm  -f   control0*
 
然后关闭数据库,不能正常关闭,使用如下命令,
SQL> shutdown abort;
ORACLE instance shut down.
 
(3)使用备份的脚本来恢复控制文件,
 
在脚本中有两组恢复方法:a.在联机重做日志正常的情况下,
                                           b.在联机重做日志不正常的情况下,
在这个例子中选择a。
 
将c.trc复制另一个副本,命令如下,
 
[oracle@oracle11g backupcf]$ cp  c.trc   c1.sql
 
修改c1.sql脚本,还有b方法全部删除,只留下方法a,在方法a中把一些注释删除了,特别是这个注释- STANDBY LOGFILE  它在中间会影响到脚本的执行,还有一点就是下面这段代码中行与行之间不能有空格,不然不能执行。
 
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "WILSON" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/oradata/wilson/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/u01/oradata/wilson/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/u01/oradata/wilson/redo03.log'  SIZE 50M BLOCKSIZE 512
DATAFILE
  '/u01/oradata/wilson/system01.dbf',
  '/u01/oradata/wilson/sysaux01.dbf',
  '/u01/oradata/wilson/undotbs01.dbf',
  '/u01/oradata/wilson/users01.dbf',
  '/u01/oradata/wilson/example01.dbf',
  '/u01/oradata/wilson/app2_01.dbf',
  '/u01/oradata/wilson/smallundo1.dbf',
  '/u01/oradata/wilson/app1_01.dbf'
CHARACTER SET AL32UTF8
;
..................................
 
(4)执行脚本来恢复,所有控制文件既可以全部还原了。
 
SQL> @/u01/backupcf/c1.sql
ORACLE instance started.
Total System Global Area  146472960 bytes
Fixed Size                  1335080 bytes
Variable Size              92274904 bytes
Database Buffers           50331648 bytes
Redo Buffers                2531328 bytes
Control file created.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
Media recovery complete.
System altered.
Database altered.
Tablespace altered.
Tablespace altered.
 
三.实验
来操作一个复杂点的例子,先备份控制文件,然后增加表空间(这样数据库的结构就会发生变化,同样的控制文件也会发生变化),再删除现在所有的控制文件,最后用备份的控制文件进行恢复。
 
1.备份控制文件,这里不是上面的备份控制文件的脚本,而是备份二进制控制文件
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,