小e随笔:今天帮导员跑到小区监控室搞了半多天,查看10月1日到2日的录像,原因是导员的车停在小区里被什么东西给刮了,想从监控录像里查出什么,看了半天只发现了一些可疑的地方,还有一些不得不提,中国的社会啊,看那些警察。。。唉!!!
案例 2:控制文件的损坏
方案(1):利用脚本重建控制文件
(1)创建脚本
a.默认目录
SQL> alter database backup controlfile to trace;
Database altered.
目录可以从告警日志文件中读取到如下:
Tue Oct 09 19:11:39 2012
alter database backup controlfile to trace
Backup controlfile written to trace file /u01/oracle/diag/rdbms/elvis/elvis/trace/elvis_ora_4541.trc
Completed: alter database backup controlfile to trace
b.也可以 指定目录指定文件名字
SQL> alter database backup controlfile to trace as '/u01/createctl.trc';
Database altered.
里面即包含resetlogs和noresetlogs两种模式
c.也可以指定生成什么模式的,比如这样
SQL> alter database backup controlfile to trace as '/u01/createctl.trc' resetlogs;
Database altered.
当然如果需要noresetlogs一样的格式,不在演示,我都已经够菜了,相信大虾们会说,哎呀!早懂了,赶紧进行下一步,好的好的,小鸟马上下一步。。。
在补充一句哈,其实生成那种模式都可以,就是在脚本代码里改下resetlogs变为noresetlogs就OK了。
d.也可以直接拷贝一份,当然即可以用OS复制也可以,但复制数据库要是关闭的情况,如果开启的时候复制数据很不安全,数据库在线可以使用下面命令复制
SQL> alter database backup controlfile to '/u01/createctl1.ctl';
Database altered.
脚本范例(noresetlogs):
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ELVIS" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oracle/oradata/elvis/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/oracle/oradata/elvis/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/oracle/oradata/elvis/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/u01/oracle/oradata/elvis/system01.dbf',
'/u01/oracle/oradata/elvis/sysaux01.dbf',
'/u01/oracle/oradata/elvis/undotbs01.dbf',
'/u01/oracle/oradata/elvis/users01.dbf',
'/u01/oracle/oradata/elvis/test01.dbf'
CHARACTER SET ZHS16GBK
;
大家仔细看看这些代码,其实很简单不是么?你完全可以根据模板,在你了解你数据库文件数量,日志文件的路径,等一些参数的值,自己改写一个适合自己库的控制文件,当然还是这样比较安全,毕竟如果库的文件多了,工作量还是很大的。。。
(2)创建一个sql脚本
[oracle@elvis u01]$ cat createctl.sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ELVIS" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oracle/oradata/elvis/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/oracle/oradata/elvis/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/oracle/oradata/elvis/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/u01/oracle/oradata/elvis/system01.dbf',
'/u01/oracle/oradata/elvis/sysaux01.dbf',
'/u01/oracle/oradata/elvis/undotbs01.dbf',
'/u01/oracle/oradata/elvis/users01.dbf',
'/u01/oracle/oradata/elvis/test01.dbf'
CHARACTER SET ZHS16GBK
;
(3)关闭数据库&损坏控制文件
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
[oracle@elvis elvis]$ rm -f control01.ctl
[oracle@elvis elvis]$ ll
total 1789008
drwxr-xr-x 2 oracle oinstall 4096 Oct 8 08:58 bak
-rw-r----- 1 oracle oinstall 52429312 Oct 9 19:51 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Oct 9 18:58 redo02.log
-rw-r----- 1 oracle oinstall 52429312 Oct 9 18:58 redo03.log
-rw-r----- 1 oracle oinstall 629153792 Oct 9 19:51 sysaux01.dbf
-rw-r----- 1 oracle oinstall 734011392 Oct 9 19:51 system01.dbf
-rw-r----- 1 oracle oinstall 71311360 Oct 8 08:50 temp01.dbf
-rw-r----- 1 oracle oinstall 52436992 Oct 9 19:51 test01.dbf
-rw-r----- 1 oracle oinstall 235937792 Oct 9 19:51 undotbs01.dbf
-rw-r----- 1 oracle oinstall 5251072 Oct 9 19:51 users01.dbf
SQL> startup
ORACLE instance started.
Total System Global Area 598437888 bytes
Fixed Size 1338140 bytes
Variable Size 394265828 bytes
Database Buffers 197132288 bytes
Redo Buffers 5701632 bytes
ORA-00205: error in identifying control file, check alert log for more info
(4)创建控制文件
[oracle@elvis u01]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Tue Oct 9 20:08:13 2012
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to an idle instance.
SQL> @createctl.sql
ORACLE instance started.
Total System Global Area 598437888 bytes
Fixed Size 1338140 bytes
Variable Size 394265828 bytes
Database Buffers 197132288 bytes
Redo Buffers 5701632 bytes
Control file created.
SQL> alter database open;
Database altered.
总结:控制文件对数据库的重要性就不用说了,很关键,最后冗余几个,而且放在不同的磁盘上。有人会问数据会不会有丢失,当然没有啦,你的其他数据文件都没丢,如果你具体了解控制文件对数据库的作用你肯定一下子就明白了,这个是备份恢复的笔记,不会对体系结构和基础讲的太细,小e正在策划要记这部分的笔记,了解Oracle的原理是很有必要的,但简单的说一下吧,控制文件是一个相当小的文件(最多能增长到64MB左右),其中包含Oracle需要的其他文件的一个目录。参数文件告知实例控制文件的位置,控制文件则告知实例数据库和在线重做日志文件的位置。控制文件还告知了Oracle其他一些事情,如。。。不行了,说多了,总之以后小e基础笔记中会有详细记录。。。
方案2:有catalog的控制文件的恢复,这个放在以后一步一步学习RMAN讲解,敬请期待,哇哈哈~~~
elvis