Oracle恢复试验
=================
分析:
控制文件丢失,必须重建控制文件,重建控制文件可以利用备份的控制文件
使用备份的控制文件试图去打开数据库
恢复步骤:
1):还原备份的控制文件,由于控制文件不是当前的,所有试图启动数据库时失败!
2):SQL>startup
ORACLE 例程已经启动
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-01122: 数据库文件 1 验证失败
ORA-01110: 数据文件 1: 'D:ORACLEORADATACSSSYSTEM01.DBF'
ORA-01207: 文件比控制文件更新 - 旧的控制文件
3):关闭数据库
SQL>shutdown immediate
4):将数据库启动到mount状态
SQL>startup mount
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
5):使用TO TRACE备份控制文件(目的为了重建控制文件)
SQL> alter database backup controlfile to trace;
数据库已更改。
6):找到备份的文本文件(假设修改后改名为 rebuild_controlfile.sql),并修改其中内容,只留下如下内容:
如果数据库是shutdown abort,则需要recover database,
如果数据库是shutdown immediate,则不需要recover database;
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "CSS" NORESETLOGS ARCHIVELOG
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 113
LOGFILE
GROUP 1 'D:ORACLEORADATACSSREDO01.LOG' SIZE 100M,
GROUP 2 'D:ORACLEORADATACSSREDO02.LOG' SIZE 100M,
GROUP 3 'D:ORACLEORADATACSSREDO03.LOG' SIZE 100M
DATAFILE
'D:ORACLEORADATACSSSYSTEM01.DBF',
'D:ORACLEORADATACSSUNDOTBS01.DBF',
'D:ORACLEORADATACSSDRSYS01.DBF',
'D:ORACLEORADATACSSEXAMPLE01.DBF',
'D:ORACLEORADATACSSINDX01.DBF',
'D:ORACLEORADATACSSODM01.DBF',
'D:ORACLEORADATACSSTOOLS01.DBF',
'D:ORACLEORADATACSSUSERS01.DBF',
'D:ORACLEORADATACSSXDB01.DBF',
'D:ORACLEORADATACSSSERVICE_DATA.ORA',
'D:ORACLEORADATACSSSERVICE_IDX.ORA'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
7):再关闭数据库
SQL>shutdown immediate
8: 执行 rebuild_controlfile.sql
SQL>@d:rebuild_controlfile.sql
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
控制文件已创建
ORA-00283: ??????????
ORA-00264: ?????
系统已更改。
数据库已更改。
9):由于系统正常关闭,故不需要介质恢复,所有第8步恢复数据库报错
总结:恢复丢失的所有控制文件(完全恢复)
1):还原控制文件到原位置
2):mount数据库
3):用TO TRACE备份控制文件
4):修改备份处理的TO TRACE 文件
5):关闭数据库
6):重建控制文件(用修改后的TO TRACE 备份)
7):恢复数据库
8):打开数据库
=================
SHUTDOWN IMMEDIATE所有联机日志丢失,如果
方法1):由于数据库是正常关闭,所有数据库处于一致状态,可以强行恢复而不会丢失任何已经写入数据文件的已经提交的事务
SQL>startup mount restrict
SQL>recover database until cancel
SQL>alter database open resetlogs
SQL>alter system disable restricted session
总结:
正常关闭数据库(shutdown immediate shutdown normal ),数据库处于一致状态,可以强行恢复,而不会丢失已经提交的事务.
(1) mount数据库
(2) 使用until cancel恢复数据库
(3) 用resetlogs打开数据库
方法2):使用备份恢复
SQL>select group#,sequence#,archived,status from v$log;
(1) 1 No CURRENT
(2) 2 YES INACTIVE
(3) 3 YES INACHIVE
SQL>alter database clear unarchived logfile group 1;
ERROR 位于第 1 行:
ORA-00313: 无法打开日志组 1 (线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: 'D:ORACLEORADATACSSREDO01.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
还原最近一次备份的全部数据文件(控制文件不要还原,保留最新的)
SQL>recover database
选择 auto,尽量恢复可以利用的归档日志,然后再:
recover database until cancel
这次输入cancel,完成不完全恢复,也就是说恢复两次
SQL>recover database until cancel
cancel
利用alter database open resetlogs打开数据库
总结:使用备份恢复会丢失所有未归档的事务,是一个不完全恢复,如果通过方法一恢复数据库失败,可以通过该方法恢复!
1):还原所有的数据文件,控制文件保持最新
2):利用归档日志恢复数据库,(尽量恢复可以利用的归档日志)
3):再用until cancel恢复,选择cancel做不完全恢复
4):用resetlogs打开数据库
注意:由于丢失了日志文件,不能通过重建控制文件来恢复,可以使用当前系统最新的控制文件.
1 SQL>startup nomount
2 SQL>alter database backup controlfile to trace
3 重建控制文件
CREATE CONTROLFILE REUSE DATABASE "CSS" NORESETLOGS ARCHIVELOG
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01565: ????'D:ORACLEORADATACSSREDO01.LOG'???
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#
由于丢失了日志文件,重建控制文件失败.
SHUTDOWN ABORT所有联机日志丢失
模拟步骤:
SQL>insert into TEST values(1);
SQL>commit
SQL>insert into TEST values(2);
再起一个连接,执行
SQL>shutdown abort
1:通过上面的方法2可以做数据库不完全恢复.
2:强制恢复
启动数据库,会发现一个类似的错误
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 2 (线程 1) 的成员
ORA-00312: 联机日志 2 线程 1: 'D:ORACLEORADATACSSREDO02.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
关闭数据库
SQL> shutdown immediate
mount数据库
SQL> startup nomount
恢复数据库
SQL> recover database until cancel
cancel
打开数据库
SQL> alter database open resetlogs
数据库没有响应,数据库实例崩溃!
---------------------------------------------------------------------------
重复以上的步骤,在恢复时选择
SQL> shutdown immediate
SQL> startup nomount
SQL> recover database until cancel
auto
SQL> alter database open resetlogs
同样,数据库没有响应,数据库实例崩溃!
总结:如果丢失的联机重做日志中还有未提交的事务,也就是如果还有事务来不及提交,数据库就shutdown abort
这样只能通过备份进行不完全恢复了.这样所有未归档的事务都会丢失
=================
故,只需重建该日志文件即可
SQL>select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- --- ----
1 0 YES UNUSED
2 1 NO CURRENT
3 0 YES UNUSED
SQL>alter database clear logfile group 1 [unrecoverable datafile];
如果该日志组还没有归档,则需要用
SQL>alter database clear unarchived logfile group 1 [unrecoverable datafile];
打开数据库,重新备份数据库
SQL>alter database open;
说明:
1 如果丢失的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库
处于归档状态但该日志还没有归档,就需要强行clear.
2 建议clear,特别是强行clear后做一次数据库的全备份
3 此方法适用归档和非归档数据库
=================
分析
丢失未归档的联机非当前日志,必须重建该日志文件,并且需要在重建后做一个数据库全备份.
SQL>select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- --- ----
1 0 YES UNUSED
2 1 NO CURRENT
3 0 YES UNUSED
SQL>alter database clear unarchived logfile group 1 [unrecoverable datafile];
如果丢失的是日志组的一个文件,也可以通过这样的方法来重建
删掉日志组成员文件
SQL> alter database drop logfile menber 'logfileName';
重建日志组成员文件
SQL> alter database add logfile menber 'logfileName' to group n;
=================
=================
分析:由于丢失了所有的联机重做日志文件,所以可以用最近的一次有效备份和归档日志来恢复,但这样会丢失所有未被归档的事务.
1)还原最近一次备份的所有数据文件和控制文件
2)mount数据库
SQL>startup mount
3) 使用using backup controlfile选择做不完全恢复
SQL>alter database recover until cancel using backup controlfile;
4) 选择auto,尽可能多的使用归档日志文件
auto
5) 用resetlogs打开数据库
SQL> alter database open resetlogs;
6) 重新做一次数据库的全备份.
(2)只丢失未提交的事务的数据
1)备份所有的数据文件
2)还原最近数据库结构改变后的最新备份控制文件和数据文件,主要是为了生成TO TRACE控制文件备份
如果已经有最近一次的控制文件的TO TRACE备份,则直接跳到4
2)启动数据库到mount状态,生成控制文件的备份
SQL>startup mount
SQL>alter dababase backup controlfile to trace;
3)关闭数据库
SQL>shutdown immediate
4)修改生成的控制文件的备份,保留一下内容,注意RESETLOGS,文件名称为 rebuild_control.sql
CREATE CONTROLFILE REUSE DATABASE "CSS" RESETLOGS ARCHIVELOG
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 113
LOGFILE
GROUP 1 'D:ORACLEORADATACSSREDO01.LOG' SIZE 10M,
GROUP 2 'D:ORACLEORADATACSSREDO02.LOG' SIZE 10M,
GROUP 3 'D:ORACLEORADATACSSREDO03.LOG' SIZE 10M
DATAFILE
'D:ORACLEORADATACSSSYSTEM01.DBF',
'D:ORACLEORADATACSSUNDOTBS01.DBF',
'D:ORACLEORADATACSSDRSYS01.DBF',
'D:ORACLEORADATACSSEXAMPLE01.DBF',
'D:ORACLEORADATACSSINDX01.DBF',
'D:ORACLEORADATACSSODM01.DBF',
'D:ORACLEORADATACSSTOOLS01.DBF',
'D:ORACLEORADATACSSUSERS01.DBF',
'D:ORACLEORADATACSSXDB01.DBF',
'D:ORACLEORADATACSSSERVICE_DATA.ORA',
'D:ORACLEORADATACSSSERVICE_IDX.ORA'
CHARACTER SET ZHS16GBK;
5)生成控制文件
SQL>startup nomount
SQL>@rebuild_control.sql
6)用生成的控制文件恢复数据库
SQL>recover database until cancel using backup controlfile;
7)取消恢复(目的是可以使用resetlogs打开数据库,生成重做日志文件)
cancel
8)用resetlogs打开数据库
SQL>alter database open resetlogs;
数据库异常关闭(shutdown abort )
只能用第一种方法恢复
=================
由于归档日志文件和联机重做日志文件没有丢失,故可以做完全恢复,任何已经提交的事务的数据都不会丢失.
方法一:使用using backup controlfile做不完全恢复,这样所有未归档的事务都会丢数。
1)还原最近一次备份的所有数据文件和控制文件
2)mount 起数据库
SQL>startup mount
3)恢复数据库
SQL>recover database until cancel using backup controlfile;
4)打开数据库
SQL>alter database open resetlogs
方法二:重建控制文件
1)还原最近一次备份的所有数据文件和控制文件
2)mount 起数据库
SQL> startup mount
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
ORA-01991: ???????'D:oracleora92DATABASEPWDcss.ORA'
3)根据提示修改密码文件,然后关闭重新mount数据库
SQL>host
Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.
找到密码文件的位置,重建它
D:> cd D:oracleora92DATABASE
D:oracleora92DATABASE>del PWDcss.ORA
D:oracleora92DATABASE>orapwd file=PWDcss.ORA password=1234
D:oracleora92DATABASE>exit
SQL>shutdown immediate
SQL>startup mount
4)备份控制文件TO TRACE
SQL>alter database backup controlfile to trace
5)关闭数据库
SQL>shutdown immediate
6)修改备份出来的控制文件,只留下如下内容
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "CSS" NORESETLOGS ARCHIVELOG
-- SET STANDBY TO MAXIMIZE PERFORMANCE
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 113
LOGFILE
GROUP 1 'D:ORACLEORADATACSSREDO01.LOG' SIZE 100M,
GROUP 2 'D:ORACLEORADATACSSREDO02.LOG' SIZE 100M,
GROUP 3 'D:ORACLEORADATACSSREDO03.LOG' SIZE 100M
-- STANDBY LOGFILE
DATAFILE
'D:ORACLEORADATACSSSYSTEM01.DBF',
'D:ORACLEORADATACSSUNDOTBS01.DBF',
'D:ORACLEORADATACSSDRSYS01.DBF',
'D:ORACLEORADATACSSEXAMPLE01.DBF',
'D:ORACLEORADATACSSINDX01.DBF',
'D:ORACLEORADATACSSODM01.DBF',
'D:ORACLEORADATACSSTOOLS01.DBF',
'D:ORACLEORADATACSSUSERS01.DBF',
'D:ORACLEORADATACSSXDB01.DBF',
'D:ORACLEORADATACSSSERVICE_DATA.ORA',
'D:ORACLEORADATACSSSERVICE_IDX.ORA'
CHARACTER SET ZHS16GBK
;
recover database
alter database Open;
7)运行该文件
SQL>@rebuild_control.sql
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
控制文件已创建
完成介质恢复。
数据库已更改。
1. 拷贝所有的控制文件和数据文件(不包括redo)
2. mount数据库,按照提示重建口令文件
3. 这时,试图完全恢复数据库是不成功的
4. 用to trace备份控制文件
5. 找到并且编辑控制文件
6. 重建控制文件
7. shutdown immediate,然后重新恢复数据库
8. 完全恢复数据库
9. 打开数据库
=================
1)还原所有的数据文件
2)mount数据库
SQL>startup mount
3)根据提示重建密码口令文件,然后重新mount起数据库
4)恢复数据库
SQL>recover database until cancel
auto
5)用resetlogs打开数据库
SQL>alter database open resetlogs
=================
分析:由于只有归档日志文件和数据文件的备份,故所有未归档的事务数据都会丢失。
1)还原控制文件和全部数据文件
2)mount数据库
SQL>startup mount
3)根据提示重建密码口令文件,然后重新mount起数据库
4) 用using backup controlfile 恢复数据库
SQL>recover database until cancel using backup controlfile;
auto
5)用resetlogs打开数据库
SQL>alter database open resetlogs
也可以通过重建控制文件来恢复,不过重建控制文件需要使用RESETLOGS选项
=================
1)还原丢失的文件
2)mount数据库
SQL>startup mount
3)做完全恢复
SQL>recover tablespace system;
或者
SQL>recover database;
或者
SQL>recover datafile '还原文件物理位置'
=================
B:联机恢复
分析:需要恢复的数据库文件必须处于脱机状态
方法1:直接操作数据文件
SQL>alter database datafile '文件名称' offline;
SQL>recover datafile '文件名称';
SQL>alter database datafile '文件名称' online;
方法2:通过数据文件所属的表空间操作
SQL>alter tablespace xxxx offline;
SQL>recover tablespace xxxx;
SQL>alter tablespace xxxx online;
=================
B:联机恢复(使需要恢复的回滚段表空间/数据文件脱机(只适用于数据库正常关闭的情况shutdown immediate))
分析:在正常关系的情况下,回滚段里没有活动事务,故数据库在使丢失的文件脱机后可以正常打开
如果是使用shutdown abort关闭,则回滚段中还会有活动事务,数据库在打开是要先做一个崩溃恢复,这时候
需要使用回滚段,但是,这时的回滚段是不能访问的,故恢复失败!
1)还原该文件的备份
2)修改init.ora中有关回滚段设置的参数,将参数undo_management设置未manual
SQL>create pfile='pfile_new.ora' from spfile;
修改pfile_new.ora文件,将参数undo_management设置未manual,同时去掉参数
undo_retention=900
undo_tablespace='UNDOTBS1'
3)重建spfile文件(先备份spfile)
SQL>create spfile from pfile='pfile_new.ora'
4)mount起数据库
SQL>startup mount
5)使丢失的数据文件脱机
SQL>alter database datafile 'd:oracleoradatatesttbsl.ora' offline;
6)打开数据库
SQL>alter database open;
7)联机恢复丢失的数据文件
SQL>recover datafile 'd:oracleoradatatesttbsl.ora' offline;
8) 使文件联机
SQL>alter database datafile 'd:oracleoradatatesttbsl.ora' online;
9)关闭数据库
SQL>shutdown immediate
10)恢复备份的spfile成为当前spfile
11)重新启动数据库
SQL>startup
2)没有备份的强制恢复
1)修改init.ora中有关回滚段设置的参数,将参数undo_management设置未manual
SQL>create pfile='pfile_new.ora' from spfile;
修改pfile_new.ora文件,将参数undo_management设置未manual,同时去掉参数
undo_retention=900
undo_tablespace='UNDOTBS1'
2)重建spfile文件(先备份spfile)
SQL>create spfile from pfile='pfile_new.ora'
3)mount起数据库
SQL>startup mount
4)使丢失的数据文件脱机
SQL>alter database datafile 'd:oracleoradatatesttbsl.ora' offline drop;
5)打开数据库
SQL>alter database open;
6)删除数据文件所在的表空间
SQL>drop tablespace xxxx including contents;
7)重建该表空间
SQL>create tablespace xxxx datafile 'datafilename' size 50M;
=================
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 D:oracleoradatacssarchive
最早的概要日志序列 16
下一个存档日志序列 18
当前日志序列 18
SQL> alter system switch logfile;
系统已更改。
SQL> alter tablespace users add datafile 'd:oracleoradatacssuser_add.ora' size 10M;
表空间已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host
Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.
E:>d:
D:>cd d:oracleoradatacss
D:oracleoradatacss>dir
驱动器 D 中的卷是 应用程序
卷的序列号是 C954-72C9
D:oracleoradatacss 的目录
2005-09-08 10:40 <DIR> .
2005-09-08 10:40 <DIR> ..
2005-11-25 14:02 2,002,944 CONTROL01.CTL
2005-11-25 14:02 2,002,944 CONTROL02.CTL
2005-11-25 14:02 2,002,944 CONTROL03.CTL
2005-11-25 14:02 20,975,616 DRSYS01.DBF
2005-11-25 14:02 152,702,976 EXAMPLE01.DBF
2005-11-25 14:02 26,218,496 INDX01.DBF
2005-11-25 14:02 20,975,616 ODM01.DBF
2005-11-25 14:02 104,858,112 REDO01.LOG
2005-11-25 14:02 104,858,112 REDO02.LOG
2005-11-25 13:58 104,858,112 REDO03.LOG
2005-11-25 14:02 209,719,296 SERVICE_DATA.ORA
2005-11-25 14:02 209,719,296 SERVICE_IDX.ORA
2005-11-25 14:02 356,519,936 SYSTEM01.DBF
2005-11-17 17:16 97,521,664 TEMP01.DBF
2005-11-25 14:02 10,489,856 TOOLS01.DBF
2005-11-25 14:02 209,719,296 UNDOTBS01.DBF
2005-11-25 14:02 32,772,096 USERS01.DBF
2005-11-25 14:02 39,981,056 XDB01.DBF
2005-11-25 14:02 10,489,856 USER_ADD.ORA
2005-10-18 15:34 <DIR> archive
2005-11-17 13:37 <DIR> back
2005-11-18 14:27 <DIR> back_new
19 个文件 1,718,388,224 字节
5 个目录 8,426,979,328 可用字节
D:oracleoradatacss>del USER_ADD.ORA
D:oracleoradatacss>exit
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 143727516 bytes
Fixed Size 453532 bytes
Variable Size 109051904 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> alter database create datafile 'd:oracleoradatacssuser_add.ora' as 'd:oracleoradatacssuser_add.ora';
数据库已更改。
SQL> recover datafile 'd:oracleoradatacssuser_add.ora';
完成介质恢复。
SQL> alter database open;
数据库已更改。
SQL>
说明:alter database create datafile 命令可以用来创建丢失的数据文件
增加数据文件是使用命令
alter tablespace add datafile