Oracle—用户管理的完全恢复(三)
来源:互联网 发布:vb中ascii码 编辑:程序博客网 时间:2024/06/06 15:03
在用户管理的恢复(二)中对归档模式的恢复进行了说明,但是都是在控制文件没有损坏的情况下,下面说明一下,当控制文件损坏了怎么恢复。
一.控制文件的相关说明
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,然后备份控制文件,
怎么备份控制文件,请参照:Oracle—用户管理的备份(一)
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.备份控制文件,这里不是上面的备份控制文件的脚本,而是备份二进制控制文件。
SQL> alter database backup controlfile to '/tmp/w1.bin';
Database altered.
2.创建表空间和数据文件,
SQL> create tablespace app3 datafile '/u01/oradata/wilson/app3_01.dbf' size 100m;
Tablespace created.
在Dave用户下,
SQL> create table t4 (id int,name char(10)) tablespace app3;
Table created.
SQL> insert into t4 values (0,'jack');
1 row created.
3.现在把控制文件都删除了,模拟控制文件损坏,然后关闭数据库。
[oracle@oracle11g wilson]$ rm -f control0*
关闭数据库,
SQL> shutdown abort;
ORACLE instance shut down.
4.还原控制文件,然后打开数据库进入mount状态,这时还不能打开数据库,
[racle@oracle11g wilson]$ cp /tmp/w1.bin /u01/oradata/wilson/control01.ctl
[oracle@oracle11g wilson]$ cp /tmp/w1.bin /u01/oradata/wilson/control02.ctl
[oracle@oracle11g wilson]$ cp /tmp/w1.bin /u01/oradata/wilson/control03.ctl
进入mount 状态,
SQL> startup mount;
5.恢复控制文件,命令如下,
(1)开始输入恢复命令,会发现出现问题,
SQL> recover database using backup controlfile;
ORA-00279: change 3105228 generated at 09/01/2013 01:22:03 needed for thread 1
ORA-00289: suggestion : /u01/oradata/wilson/arch/sun_1_0000000014_824777760.arc
ORA-00280: change 3105228 for thread 1 is in sequence #14
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
可以看到它需要归档文件sun_1_0000000014_824777760.arc,通过查看归档文件发现最大的是13,
[oracle@oracle11g arch]$ ll
total 228556
-rw-r----- 1 oracle oinstall 6060544 Sep 1 01:21 sun_1_0000000011_824777760.arc
-rw-r----- 1 oracle oinstall 522240 Sep 1 01:21 sun_1_0000000012_824777760.arc
-rw-r----- 1 oracle oinstall 65536 Sep 1 01:21 sun_1_0000000013_824777760.arc
那么14号归档文件即在联机重做日志文件中,那么是哪个重做日志文件,可以通过查看视图v$log,或者把每个重做日志都试一次即可。
SQL> select group#,status,members from v$log;
GROUP# STATUS MEMBERS
---------- ---------------- ----------
1 INACTIVE 1
3 INACTIVE 1
2 CURRENT 1
所以把redo02.log输入进去,
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/oradata/wilson/redo02.log
ORA-00283: recovery session canceled due to errors
ORA-01244: unnamed datafile(s) added to control file by media recovery
ORA-01110: data file 7: '/u01/oradata/wilson/app3_01.dbf'
可以看到有一个数据文件没有办法识别,因为这个控制文件是旧的。
(2)查看视图来找到要修改的数据文件,查看视图v$recover_file和v$datafile,
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- ------------------ ---------- ---------
7 ONLINE ONLINE FILE MISSING 0
SQL> select file#,name from v$datafile;
FILE# NAME
---------- -----------------------------------
1 /u01/oradata/wilson/system01.dbf
2 /u01/oradata/wilson/sysaux01.dbf
3 /u01/oradata/wilson/undotbs01.dbf
4 /u01/oradata/wilson/users01.dbf
5 /u01/oradata/wilson/example01.dbf
6 /u01/oradata/wilson/app2_01.dbf
7 /u01/oracle/dbs/UNNAMED00007
8 /u01/oradata/wilson/smallundo1.dbf
12 /u01/oradata/wilson/app1_01.dbf
9 rows selected.
可以看到7号文件名称发生了变化,修改这个文件的名称并加入控制文件中,
SQL> alter database rename file '/u01/oracle/dbs/UNNAMED00007' to '/u01/oradata/wilson/app3_01.dbf';
Database altered.
怎么辨别它正好对应着这个文件,可以去查看警报日志。
(3)再进行恢复,命令如下,
SQL> recover database using backup controlfile;
ORA-00279: change 3106444 generated at 09/01/2013 01:41:19 needed for thread 1
ORA-00289: suggestion : /u01/oradata/wilson/arch/sun_1_0000000014_824777760.arc
ORA-00280: change 3106444 for thread 1 is in sequence #14
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/oradata/wilson/redo02.log
Log applied.
Media recovery complete.
现在打开数据库,检查一下数据,
SQL> alter database open resetlogs;
Database altered.
SQL> select * from Dave.t4;
ID NAME
---------- -----------------------------------
0 jack
可以看到数据还在,恢复成功。
- Oracle—用户管理的完全恢复(三)
- Oracle—用户管理的完全恢复(一)
- Oracle—用户管理的完全恢复(二)
- Oracle—用户管理的完全恢复(四)
- 用户管理的完全恢复
- 用户管理的完全恢复
- ARCHIVELOG模式下用户管理的完全恢复(1)——恢复关闭的数据库!
- ARCHIVELOG模式下用户管理的完全恢复—总结
- 5. 用户管理的完全恢复
- ARCHIVELOG模式下用户管理的完全恢复(5)——总结!
- Oracle备份与恢复总结之三:OS备份/用户管理的备份与恢复
- Oracle备份与恢复总结之三:OS备份/用户管理的备份与恢复
- 用户管理的完全恢复机制+数据库完全恢复步骤+完全恢复机制+完全数据库恢复命令
- ARCHIVELOG模式下用户管理的完全恢复—恢复关闭的数据库
- oracle数据库完全恢复和不完全恢复以及执行用户管理辈分恢复
- Oracle 基于用户管理恢复的处理
- -- Oracle 基于用户管理恢复的处理
- Oracle 基于用户管理的不完全恢复
- 增强for循环
- RMAN 备份与恢复 实例 .
- 策略模式
- Oracle Rman 命令详解(List report backup configure) .
- DM6467T移植图像算法
- Oracle—用户管理的完全恢复(三)
- ORACLE EXP/IMP 说明 .
- 学习计划战略纲领
- sysdba,sysoper,normal 以及sys,sysdba,dba概念区别 .
- 响应者链
- 自己写Lucene分词器原理篇——ChineseAnalyzer简单讲解
- 拿来主义之游戏开发引擎Unity
- 同步代码块同步函数实例
- Linux如何安装rpm格式的文件?