ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle备份与恢复测试(五)

oracle备份与恢复测试(五)

原创 Linux操作系统 作者:wangkxxe 时间:2009-03-20 16:23:37 0 删除 编辑
####################################################
# [测试2] shutdown abort,resetlog的trace,
#         有数据文件备份,当前在线日志损坏,控制文件损坏,有trace
####################################################
SQL> create table arch (status varchar(2)) tablespace users;
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'ok' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已创建6166行。
SQL> /
已创建12332行。
SQL> /
已创建24664行。
SQL> /
已创建49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'no' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
 10    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
 11  -- STANDBY LOGFILE
 12  DATAFILE
 13    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
 14    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
 15    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
 16    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
 17    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
 18  CHARACTER SET ZHS16GBK
 19  ;
CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01192: ??????????
~~~~~~~~~~~~~~~~~~~~~~
如果是NORESETLOGS,那么他要检查当前的在线日志,而现在没有了
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
 10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
 11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
 12  -- STANDBY LOGFILE
 13  DATAFILE
 14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
 15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
 16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
 17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
 18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
 19  CHARACTER SET ZHS16GBK
 20  ;
CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01565: ????'C:\ORACLE\ORADATA\testdb\REDO01.LOG'???  -->>这个文件不在了
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
 10    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
 11  -- STANDBY LOGFILE
 12  DATAFILE
 13    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
 14    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
 15    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
 16    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
 17    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
 18  CHARACTER SET ZHS16GBK
 19  ;
CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
*
ERROR 位于第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-00200: ????????
ORA-00202: ????: 'C:\oracle\oradata\testdb\control01.ctl'  --这个文件不能被覆盖,删除三个控制文件
ORA-27086: skgfglk: ?????? - ?????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 5) >\>x7CNJ!#

SQL> shutdown
ORA-01507: ??????

ORACLE 例程已经关闭。
SQL> startup nomount
ORACLE 例程已经启动。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
 10    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
 11  -- STANDBY LOGFILE
 12  DATAFILE
 13    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
 14    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
 15    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
 16    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
 17    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
 18  CHARACTER SET ZHS16GBK
 19  ;
控制文件已创建
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01589: ??????????? RESETLOGS ? NORESETLOGS ??

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01152: ?? 1 ????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日志: {=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69616 (? 03/02/2005 16:53:52 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69616 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日志: {=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69661 (? 03/02/2005 16:53:54 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69661 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日志: {=suggested | filename | AUTO | CANCEL}
ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69661 (? 03/02/2005 16:53:54 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69661 ???? 1 ???? # 5 ???

指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
     98656 ok  --还原了部分数据,但不能还原在线日志中的数据

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果数据库是abort或者老的数据文件备份,那么就涉及到控制文件和数据文件不一致,需要恢复,就涉及到当前被破坏的在线日志,
,启动时仍然需要用在线活动日志进行恢复.如果是正常的shutdown,而且没有用老的数据备份,那么控制文件和数据文件是一致的,
不需要当前在线日志.而在abort或者老的数据文件备份在这种情况下,只能用备份的datafile和备份的controlfile来做不完
全恢复,都将造成数据丢失。因此多重controlfile 和 online redo log file 很重要。通常情况下是在正常运行数据库时,
当前在线日志被破坏的,此时马上会数据库不正常DOWN机,也就出现1.5.2的情景
我们知道如果是abort关闭的,那么有些事务是不完整的或者有些事务没有被写到数据文件,在数据文件中有这样的标识,这样,用
create controlfile ... noresetlogs或者resetlogs创建时读取数据文件头信息,该文件在控制文件信息,比如结束SCN设置为无穷大)
打开时就需要当前在线日志恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
####################################################
# [测试3] shutdown abort,控制文件损坏,备份控制文件,
#         当前在线日志损坏,有数据文件备份
####################################################
还原原来备份的数据文件,控制文件
SQL> shutdown
ORA-01109: 数据库未打开
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> recover database using backup controlfile ;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日志: {=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69572 (? 03/02/2005 17:07:43 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69572 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日志: {=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69617 (? 03/02/2005 17:07:44 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69617 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日志: {=suggested | filename | AUTO | CANCEL}
ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69617
SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69617 (? 03/02/2005 17:07:44 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69617 ???? 1 ???? # 5 ???

指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69617
SQL> alter database open resetlogs;
数据库已更改。
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
     98656 ok

######################################################                                               
# [1.5.3]  控制文件损坏,如果trace不是最新的数据库结构,如少了个数据文件
######################################################   
SQL> create table arch (status varchar(2));
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'ok' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> insert into arch select 'ok' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'no' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 NO  ACTIVE
         2          1 YES ACTIVE
         3          3 NO  CURRENT   
SQL> alter tablespace tools add datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf'
size 10m;
表空间已更改。
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
模拟控制文件丢失
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
 10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
 11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
 12  -- STANDBY LOGFILE
 13  DATAFILE
 14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
 15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
 16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
 17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
 18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
 19  CHARACTER SET ZHS16GBK
 20  ;
控制文件已创建
SQL> alter database open;
数据库已更改。
SQL> select name,status from v$datafile;
NAME                                         STATUS
--------------------------------------       -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF        SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF       ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF          ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF         ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF      ONLINE
C:\ORACLE\ORA92\DATABASE\MISSING00006        RECOVER --这个文件现在是recover状态
已选择6行。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们发现C:\ORACLE\ORA92\DATABASE\MISSING00006并不存在,只不过是个标记而已
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> alter database rename file 'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf';  --MISSING00006不要加路径

数据库已更改。
SQL> recover datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf';
完成介质恢复。
SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf' online;
数据库已更改。
~~~~~~~~~~~~~~~~~~~~~~~~~
如果用备份控制文件,且备份
控制文件少了新增加的两个文件
,恢复时会提示错误,我们可以
用rename来解决
~~~~~~~~~~~~~~~~~~~~~~~~~
使用备份控制文件
recover AUTOMATIC   database using backup controlfile until cancel
...      
ORA-00283: recovery session canceled due to errors                  
ORA-01244: unnamed datafile(s) added to controlfile by media recovery
ORA-01110: data file 3: '/oracle/dbs/db2.f'                         
ORA-01110: data file 2: '/oracle/dbs/db3.f'                         
~~~~~~~~~~~~~~~~~~~~
这是因为前滚时发现file#中
有两个文件,但控制文件没有
我们可以在v$datafile中看到
所以恢复中断
~~~~~~~~~~~~~~~~~~~~
SELECT FILE#,NAME
FROM V$DATAFILE;
FILE#           NAME
--------------- ----------------------
1               /oracle/dbs/db1.f
2               /oracle/dbs/UNNAMED00002
3               /oracle/dbs/UNNAMED00003
这时对文件进行改名就可以了
ALTER DATABASE RENAME FILE '/db/UNNAMED00002' TO '/oracle/dbs/db3.f';
ALTER DATABASE RENAME FILE '/db/UNNAMED00003' TO '/oracle/dbs/db2.f';
RECOVER AUTOMATIC DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL
 

######################################################                               
# [1.5.4] 控制文件损坏,如果trace不是最新的数据库结构,如少了个只读数据文件
###################################################### 

SQL> alter tablespace tools add datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf'
size 10m ;
表空间已更改。                 
SQL> alter tablespace tools read only;
表空间已更改。
   
    SQL> select name,ENABLED
  2   from v$datafile;
NAME                                            ENABLED
---------------------------------------         ----------   
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF  READ WRITE
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF  READ WRITE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF  READ WRITE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF  READ ONLY
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF  READ WRITE
C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF  READ ONLY
已选择6行。
SQL> startup nomount
ORACLE 例程已经启动。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
 10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
 11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
 12  -- STANDBY LOGFILE
 13  DATAFILE
 14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
 15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
 16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
 17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
 18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
 19  CHARACTER SET ZHS16GBK
 20  ;
控制文件已创建
SQL> select name from v$datafile;
NAME
---------------------------------------------------------------------------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
SQL> alter database open;
数据库已更改。
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
C:\ORACLE\ORA92\DATABASE\MISSING00006  --OPEN时增加了不认识的文件名
已选择6行。
SQL> alter database rename file 'MISSING00006' to 'C:\ORACLE\ORA92\DATABASE\TOOL
S02.DBF';
alter database rename file 'MISSING00006' to 'C:\ORACLE\ORA92\DATABASE\TOOLS02.D
BF'
*
ERROR 位于第 1 行:
ORA-01511: 重命名日志/数据文件时出错
ORA-01141: 重命名数据文件 6 时出错 - 未找到新文件
'C:\ORACLE\ORA92\DATABASE\TOOLS02.DBF'
ORA-01111: 数据文件 6 名称未知 - 请重命名以更正文件
ORA-01110: 数据文件 6: 'C:\ORACLE\ORA92\DATABASE\MISSING00006'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
*
ERROR 位于第 1 行:
ORA-01113: ?? 4 ??????
ORA-01110: ???? 4: 'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF'

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF' offline;
数据库已更改。
SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF' offline;
alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF' offline
*
ERROR 位于第 1 行:
ORA-01516: ????????, ????????? 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF'

SQL> alter database open ;
数据库已更改。
SQL> alter database datafile 'MISSING00006' offline;  -->>注意只读表空间必须先offline,而且注意MISSING00006不能写全路径
数据库已更改。

SQL> alter database rename file  'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\TOO
LS02.DBF';
数据库已更改。
SQL> alter tablespace tools online;
表空间已更改。
方法2
SQL> SHUTDOWN
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP NOMOUNT
ORACLE 例程已经启动。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
 10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
 11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
 12  -- STANDBY LOGFILE
 13  DATAFILE
 14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
 15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
 16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
 17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
 18    'C:\ORACLE\ORADATA\testdb\TOOLS02.DBF',  --创建语句中加入该数据文件
 19    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
 20  CHARACTER SET ZHS16GBK
 21  ;
控制文件已创建
SQL> SELECT NAME FROM V$DATAFILE;
NAME
---------------------------------------------------------------------------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF
已选择6行。
SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR 位于第 1 行:
ORA-01113: ?? 4 ??????
ORA-01110: ???? 4: 'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF'

SQL> RECOVER TABLESPACE TOOLS;
完成介质恢复。
SQL> ALTER DATABASE OPEN;
数据库已更改。
 
##################################             
# [1.6] 使用备份的控制文件进行恢复
#                    
##################################
前面有很多例子
 
 
################################################                                                    
# [1.7] 数据文件损坏,且没有备份,没有备份控制文件,
#       且其他数据文件备份中都是在该数据文件创建后
#       的备份
################################################                                                            
################################################                                                    
# [测试1](resetlogs前创建的数据文件),数据文件丢失,没有备份,控制文件损坏,有备份控制文件,但备份控制文件后于该文件重建日期
#         使用resetlogs打开数据库,所以没有数据文件自创建以来所有的日志,
#         因为前面的日志被截取了,(所以resetlog后必须要有备份,
#         除非是resetlogs后创建的数据文件,可以通过create datafile来恢复)
#         当然如果有resetlogs后的控制文件及相关的数据,也可以完全恢复,参见1.12
#################################################
还原原来的数据文件和控制文件
然后SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。  
 
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 1069386 (在 02/25/2005 15:47:59 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORA92\RDBMS\ARC00013.001
ORA-00280: 更改 1069386 对于线程 1 是按序列 # 13 进行的
 
 
指定日志: {=suggested | filename | AUTO | CANCEL}
auto -->>使用auto恢复也是成功
ORA-00308: 无法打开存档日志 'C:\ORACLE\ORA92\RDBMS\ARC00013.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-00308: 无法打开存档日志 'C:\ORACLE\ORA92\RDBMS\ARC00013.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> recover database using backup controlfile until cancel; -->>这个cancel是表示每次应用一个日志时都提示一下,直到输入cancel后结束
ORA-00279: 更改 1069386 (在 02/25/2005 15:47:59 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORA92\RDBMS\ARC00013.001
ORA-00280: 更改 1069386 对于线程 1 是按序列 # 13 进行的

指定日志: {=suggested | filename | AUTO | CANCEL} 
cancel  --输入cancel恢复成功 -->>cancel选项允许每次前滚一个日志文件,当需要停止恢复时,输入cancel
                                 ,在这种方式下不会自动运用联机日志文件.
介质恢复已取消。
SQL> alter database open resetlogs;
数据库已更改。

SQL> select name,status from v$datafile;
NAME                                                         STATUS
------------------------------------------------------------ -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF                        SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF                       ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                          ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF                         ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF                         ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF                         ONLINE
已选择6行。
SQL> create table arch (status varchar(2)) tablespace users;
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'ok' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> insert into arch select 'ok' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'no' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
在数据库打开的状况下用ULTRAEDIT破坏文件USERS01.DBF
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF' offline;
数据库已更改。
SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF' ;
alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
*
ERROR 位于第 1 行:
ORA-01181: ??5????? RESETLOGS ???????????
ORA-01110: ???? 5: 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
因为使用resetlogs打开数据库,所以没有数据文件自创建以来所有的日志,因为前面的日志被截取了
(所以resetlog后必须要有备份,除非是resetlogs后创建的数据文件,可以通过create datafile来恢复)
换句话说,因为数据文件在创建的时候的创建时间点和相关信息保存在控制文件中!控制文件丢失的话
数据文件的创建时候的信息丢失,则数据库无从知道要 从创建文件创建时候开始recover datafile
需要从哪个归档日志开始。也就无法知道该数据文件是否可以从现有归档日志恢复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
################################################                                                    
# (resetlog是在数据文件创建前或者控制文件包含了创建该数据文件的起始信息)
          那我们测试resetlogs后创建的数据文件被丢失,没有备份的恢复方法
          假设前面的users01没有破坏,数据库被打开
################################################         
 分两种
#####################################################################################################
# [测试2] 控制文件正常,数据文件丢失,数据文件丢失没有备份,
#         也就说丢失的数据文件创建在该控制文件中的,该控制文件也没有被trace刷新,那控制文件就包含了该数据文件自创建以来的所有信息
#####################################################################################################
SQL> shutdown
ORA-01109: ??????
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;
数据库已更改。
SQL>
SQL>
SQL> alter tablespace users add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
size 25M;
表空间已更改。
SQL> create table arch (status varchar(2)) tablespace users;
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'ok' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已创建6166行。
SQL> /
已创建12332行。
SQL> /
已创建24664行。
SQL> /
已创建49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'no' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES INACTIVE
         3          4 YES ACTIVE
SQL> select file# ,name from v$datafile;
     FILE#     NAME
---------- ---------------------------------
         1 C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
         2 C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
         3 C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
         4 C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
  5 C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
         6 C:\ORACLE\ORADATA\TESTDB\USERS02.DBF
已选择6行。
SQL> select segment_name from dba_extents where FILE_ID=6;
SEGMENT_NAME
--------------------------------------------------------------------------------
ARCH
SQL> shutdown abort
ORACLE 例程已经关闭。
用ultraedit编辑文件USERS02.DBF
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> select name ,status from v$datafile;
NAME                                         STATUS
---------------------------------------      -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF  SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF  ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF  ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF  ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF  ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS02.DBF  ONLINE
已选择6行。
SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'; --online也可以create
数据库已更改。 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
system tablespace 的第一个datafile 是不能用 alter database create datafile 命令
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> recover datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF';
完成介质恢复。
SQL> alter database open;
数据库已更改。
SQL> select count(*) ,status from arch group by status;
  COUNT(*) ST
---------- --
      6166 no
     98656 ok

完全恢复了

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12801008/viewspace-573241/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-02-25

  • 博文量
    68
  • 访问量
    94400