- 浏览: 54575 次
- 性别:
- 来自: 北京
最近访客 更多访客>>
最新评论
-
yvonxiao:
这个的确好用,我记得我以前是自己写了个存储过程来解决这种递归问 ...
Oracle Start With Connect By
概要
1.1. 本文的目的
为了模拟测试oracle热备份的各种恢复情况,同时给以后工程人员一些实施借鉴,特地整理了本文档,在其中记录各种恢复的情况,以方便恢复时使用。
1.2. 系统概况
系统环境:hp unix11 oracle 9201
数据情况:一个系统文件、3个联机日志、一个回滚段表空、一个undo表空间、其他的数据文件,数据库当前使用undo。
备份方式:热备份
备份文件:数据文件、归档日志、控制文件、初始化文件。
2. 恢复情况介绍
2.1. 模拟回滚表空间损坏丢失
当初设计时系统就同时并存了两种回滚段管理模式,目的就是当其中的一个出现问题的话,就可以立刻恢复。Undo与8i时回滚段比,它的优势是自动管理回滚段,简化了管理工作。
下面介绍回滚表空间数据文件损坏时的恢复方式:
假设在undo表空间数据文件损坏时拥有所有的备份,系统存在回滚段表空间。
在数据库运行状态下删除undo表空间数据文件。
此时如果向数据库中写入数据,会出现如下错误:
SQL> exec sp_insert_del;
BEGIN sp_insert_del; END;
*
ERROR at line 1:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/opt/oradata/openview/RBS2_1.dbf'
ORA-27041: unable to open file
HP-UX Error: 2: No such file or directory
Additional information: 3
ORA-06512: at "DBBACKUP.SP_INSERT_DEL", line 9
ORA-06512: at line 1
此时需要作的是修改数据库初始化参数,将他修改成为使用rollback_segment,同时将数据库加载,
SQL>startup mount pfile='/opt/oracle/admin/openview/initopenview.ora'
然后删除回滚表空间的数据文件
SQL>alter database defile 4 offline off;
SQL>alter database open;
但是数据库启动后,察看如下信息,发现有大量属于回滚表空间的回滚段
SQL>select * from dba_rollback_segs;
此时如果想恢复原来的回滚表空间,需要修改初始化文件,在其中加入隐含参数_CORRUPTED_ROLLBACK_SEGMENTS,在其中加入回滚表空间的回滚段后,重新启动数据库,然后删除回滚表空间
SQL>drop tablespace undo2 INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
重新创建回滚表空间后,修改初始化参数后,然后重新启动数据库即可。
总结:当回滚表空间发生损坏时,需要将系统重新启动,这是必须的,对于24小时系统来说,这无疑是极为不利的一种情况,在这种情况下,需要的是双机热备的系统来保证系统24小时不间断运行。当出现系统崩溃的情况时,毫无疑问,需要备份机立即切换来保证系统运行,然后及时恢复生产系统。
2.2. 模拟非系统数据文件丢失
当非系统数据文件损坏时,有三种恢复方式,一种是拥有数据文件备份、归档日志备份以及其他的相关文件,此时可以做到的是完全的恢复;一种是有数据文件备份,但是归档日志不全;一种是没有数据文件备份,此时就需要将系统down下,然后恢复。
下面介绍第一种情况的恢复:
在数据库运行状态下删除数据文件,如果此时系统没有down机,那么采用以下方式恢复
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' offline;
Database altered.
将备份文件拷贝回来,将数据文件online,提示需要恢复数据文件。
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online;
alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online
*
ERROR at line 1:
ORA-01113: file 19 needs media recovery
ORA-01110: data file 19: '/opt/oradata/openview/ts_iptool_1.dbf'
执行媒体恢复,可以将数据文件online,由于有所有的归档日志和联机日志都存在,因此没有数据丢失。
SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf';
Media recovery complete.
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online;
Database altered.
总结:在数据库运行状态下,如果有数据文件损坏不能读取时,数据库不至于down下,此时如果发现的话,在拥有所有备份和归档日志、联机日志的情况下,可以及时恢复。
当数据库已经宕下时,需要在数据加载时恢复,将数据文件拷贝到正确的位置后,恢复步骤如下:
SQL> startup mount
SQL> recover database;
SQL>alter database open;
总结:在这种情况下,对于24小时系统来说是一个损失,为了保证系统的正确运行,需要双机备份来保证系统的高可用性。
仅仅拥有数据文件和部分归档日志的恢复:
如果数据库处于打开状态时,先将数据文件offline
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' offline;
Database altered.
将备份文件拷贝回来,执行媒体恢复
SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;
选择auto,尽量多的实施归档日志。
然后再次执行以下语句,选择cancel,然后将数据文件online
SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;
Media recovery complete.
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online;
Database altered.
当数据库crash时,将
没有任何备份的恢复:备份文件拷贝回来,执行媒体恢复,
SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;
选择auto,尽量多的实施归档日志。
然后再次执行以下语句,选择cancel
SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;
Media recovery complete.
总结:将数据库打开后,最好作一个数据库全备份。
当系统没有备份时发生数据文件损坏的情况时,不可避免的会丢失数据,它的恢复比较简单,但是必须要将系统down下,将数据库启动到mount时,进行恢复。
SQL> startup mount
SQL> alter database datafile 6 offline drop;
SQL>alter database open;
此时在系统中还保留有丢失数据文件的字典信息,系统处于不一致状态。如果数据文件表空间的表remove到其他表空,可以将表空间删除重建,并将表再次move回来。
总结:这种情况下不可避免的会丢失数据,可能会丢失重要的数据文件,如果拥有备份,最多只能恢复到备份那一时刻的数据。
2.3. 模拟系统数据文件丢失
在数据库运行状态下删除系统数据文件,系统崩溃了,当拥有所有的备份时,系统是可以恢复的,恢复得步骤和2.2的第一种情况一样。
2.4. 模拟非当前联机日志文件丢失
如果丢失的联机日志不是当前的文件,那么他的恢复比较简单,只需要将日志清除即可。有两种情况,如果当联机日志已经归档,在数据库打开状态下删除不活动的联机日志时,可以用以下方式恢复。
SQL> alter database clear logfile group groupnumber;
或者在数据库加载时运行以上sql,系统会自动生成一个日志文件。
下面是一个恢复的例子:
SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- ---------- --- ----------------
4 209715200 YES INACTIVE
5 209715200 YES INACTIVE
6 209715200 NO CURRENT
SQL> !
$ mv log4.log log.log
$ exit
SQL> alter system switch logfile;
alter system switch logfile
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
当删除一个非当前的日志文件后系统切换到此文件时,不能读取次文件时,系统crash.将系统重新启动,发现系统不能打开。此时数据库处于mount状态
SQL> startup
ORACLE instance started.
Total System Global Area 267479512 bytes
Fixed Size 735704 bytes
Variable Size 184549376 bytes
Database Buffers 81920000 bytes
Redo Buffers 274432 bytes
Database mounted.
ORA-00313: open failed for members of log group 4 of thread 1
ORA-00312: online log 4 thread 1: '/opt/oradata/openview/log4.log'
修改数据库,清除归档的日志,然后将数据库打开。
SQL> alter database clear logfile group 4;
Database altered.
SQL> alter database open;
Database altered.
察看联机日志文件
SQL> !
$ ls *.log
log4.log log5.log log6.log
察看日志文件,发现日志组4 已经可以使用。
SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- ---------- ----------------
4 209715200 NO CURRENT
5 209715200 YES INACTIVE
6 209715200 YES INACTIVE
假如在丢失已归档的联机日志时能够及时发现,那么就可以在数据库打开状态下清除日志,自动生成一个日志文件,保证数据库正常运行。
$ rm log6.log
$ exit
SQL> alter database clear logfile group 6;
Database altered.
$ ls log*.*
log4.log log5.log log6.log
总结:在恢复完成后,由于有一个日志文件没有归档,因此需要立即进行数据库全备份。
2.5. 模拟当前联机日志文件丢失
如果丢失的联机日志是当前的日志文件,如果数据库以及crash,那么需要在mount下进行恢复,恢复步骤也比较复杂。可以通过以下命令来恢复.
SQL>recover database until cancel;
恢复完成后还需要重新设置log来打开数据库.
如果数据库还处于打开状态,那么恢复比较简单,只要执行以下语句就可以恢复
SQL> alter database clear unarchived logfile group groupnumber;
以下举例说明在数据打开状态下,恢复需要执行的步骤。
SQL> !
$ ls log*.log
log4.log log5.log log6.log
$ mv log4.log log.log
$ exit
SQL> create table iptpa_test1 (n1 date) tablespace ts_iptool;
Table created.
SQL> insert into iptpa_test1 select sysdate from dual;
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
从数据字典中可以看出日志4处于未归档状态,但是此时它已经被删除了。
SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- ---------- ----------------
4 209715200 NO ACTIVE
5 209715200 YES INACTIVE
6 209715200 NO CURRENT
重新切换日志,到日志4
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
此时由于找不到日志组4 系统处于悬挂状态。因为此时数据库处于打开状态,可以执行以下命令进行日志清除并重建。
SQL> alter database clear unarchived logfile group 4;
Database altered.
$ ls log*.*
log4.log log5.log log6.log
$exit
此时日志组4的序号是0,日志会在循环到大于系统当前最大的SEQUENCE#才会被使用。
SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
4 0 YES UNUSED
5 7 NO CURRENT
6 6 YES INACTIVE
总结:我们知道数据库应该归档的日志没有归档后,需要做的第一件事就是做一个数据库的全备份。
当数据库以及crash,需要恢复的步骤如下:
$ mv log6.log log.bak
$ exit
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 267479512 bytes
Fixed Size 735704 bytes
Variable Size 184549376 bytes
Database Buffers 81920000 bytes
Redo Buffers 274432 bytes
Database mounted.
ORA-00313: open failed for members of log group 6 of thread 1
ORA-00312: online log 6 thread 1: '/opt/oradata/openview/log6.log'
SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
4 8 YES INACTIVE
5 7 YES INACTIVE
6 9 NO CURRENT
此时数据库处于mount状态,日志组6处于当前状态,执行清除未归档日志时会出现如下错误。
SQL> alter database clear unarchived logfile group 6;
alter database clear unarchived logfile group 6
*
ERROR at line 1:
ORA-00313: open failed for members of log group 6 of thread 1
ORA-00312: online log 6 thread 1: '/opt/oradata/openview/log6.log'
ORA-27037: unable to obtain file status
HP-UX Error: 2: No such file or directory
Additional information: 3
此时需要执行以下语句恢复数据库,在恢复时为了尽量多的使用归档日志恢复,先选择auto,最后才使用cancel选项。
SQL> recover database until cancel;
Media recovery complete.
SQL> alter database open resetlogs;
Database altered.
SQL> ho ls log*.log
log4.log log5.log log6.log
此时系统已经重新生成了日志,但是由于是以resetlogs方式打开的数据库,因此最好进行一下数据库的全备份。
总结:当丢失当前联机日志文件后,肯定会丢失数据,同时丢失归档日志,为了保证恢复的准确性,最好完成恢复后做一个数据库的全备份。
2.6. 模拟控制文件丢失
一般来说一个系统控制文件都有3个一样的互为备份的控制文件。如果仅仅是一个控制文件损坏或者丢失,可以将控制文件拷贝即可。但是由于现在的系统大多上都只有一个硬盘,因此当硬盘坏了的话,控制文件肯定就丢失了。现在就讨论如果控制文件全部丢失时如何恢复系统。
如果有备份的控制文件,注意,必须是使用以下语句生成的:
alter database BACKUP CONTROLFILE TO TRACE as 'crontrolfile.txt' reuse RESETLOGS ;
红色字体是可以备份的控制文件的路径和名称,最好写上绝对路径。
生成的控制文件,事实上是一组sql语句,功能是将数据库启动到nomount下,然后创建控制文件,然后将数据库加载,然后使用备份文件恢复,最后再将数据库以resetlogs方式打开,不过这个文件的注释是shell的注释,需要修改。以下是我做的一个例子。
1. 备份控制文件
alter database BACKUP CONTROLFILE TO TRACE as '/opt/oradata/openview/cf.txt' reuse RESETLOGS ;
2. 删除控制文件
rm control01.ctl control02.ctl control03.ctl
3. 当数据库的控制文件全部丢失时,是必须用shutdown abort将数据库down下来
SQL> shutdown immeidate
SP2-0717: illegal SHUTDOWN option
SQL> shutdown immediate
ORA-00210: cannot open the specified controlfile
ORA-00202: controlfile: '/opt/oradata/openview/control01.ctl'
ORA-27041: unable to open file
HP-UX Error: 2: No such file or directory
Additional information: 3
SQL> shutdown abort
ORACLE instance shut down.
4. 使用sqlplus "/as sysdba"连接到数据库
5. 将数据库启动到nomount下
SQL> startup nomount
ORACLE instance started.
Total System Global Area 267479512 bytes
Fixed Size 735704 bytes
Variable Size 184549376 bytes
Database Buffers 81920000 bytes
Redo Buffers 274432 bytes
6. 创建控制文件,完成后数据库已经处于mount状态
SQL> CREATE CONTROLFILE REUSE DATABASE "OPENVIEW" RESETLOGS ARCHIVELOG
MAXLOGFILES 128
MAXLOGMEMBERS 5
MAXDATAFILES 500
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 '/opt/oradata/openview/redo01.log' SIZE 20M,
GROUP 2 '/opt/oradata/openview/redo02.log' SIZE 20M,
GROUP 3 '/opt/oradata/openview/redo03.log' SIZE 20M
DATAFILE
'/opt/oradata/openview/system_1.dbf',
'/opt/oradata/openview/temp_1.dbf',
'/opt/oradata/openview/RBS1_1.dbf',
'/opt/oradata/openview/tools_1.dbf',
'/opt/oradata/openview/OV_DATA.dbf',
'/opt/oradata/openview/OV_INDEX.dbf',
'/opt/oradata/openview/OPC_1_1.dbf',
'/opt/oradata/openview/OPC_2_1.dbf',
'/opt/oradata/openview/OPC_3_1.dbf',
'/opt/oradata/openview/OPC_4_1.dbf',
'/opt/oradata/openview/OPC_5_1.dbf',
'/opt/oradata/openview/OPC_6_1.dbf',
'/opt/oradata/openview/OPC_7_1.dbf',
'/opt/oradata/openview/OPC_8_1.dbf',
'/opt/oradata/openview/OPC_9_1.dbf',
'/opt/oradata/openview/OPC_10_1.dbf',
'/opt/oradata/openview/OPC_INDEX1_1.dbf',
'/opt/oradata/openview/OPC_INDEX2_1.dbf',
'/opt/oradata/openview/OPC_INDEX3_1.dbf',
'/opt/oradata/openview/TS_CM_1.dbf',
'/opt/oradata/openview/TS_CM_IND_1.dbf',
'/opt/oradata/openview/TS_PM_1.dbf',
'/opt/oradata/openview/TS_PM_IND_1.dbf',
'/opt/oradata/openview/TS_PMTMP_1.dbf',
'/opt/oradata/openview/TS_TOOL_1.dbf',
'/opt/oradata/openview/TS_SM_1.dbf',
'/opt/oradata/openview/TS_FM_PT1_1.dbf',
'/opt/oradata/openview/TS_FM_PT2_1.dbf',
'/opt/oradata/openview/TS_FM_PT3_1.dbf',
'/opt/oradata/openview/TS_FM_1.dbf',
'/opt/oradata/openview/TS_FM_IND_1.dbf',
'/opt/oradata/openview/boss_test_ts_1.dbf',
'/opt/oradata/openview/boss_ipnms_ts_1.dbf',
'/opt/oradata/openview/sddb_data.dbf',
'/opt/oradata/openview/sddb_index.dbf',
'/opt/oradata/openview/sddb_temp.dbf'
CHARACTER SET ZHS16CGB231280;
7. 执行数据库恢复
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
ORA-00279: change 488461 generated at 12/23/2005 08:11:35 needed for thread 1
ORA-00289: suggestion : /opt/oracle/admin/openview/arch/T0001S0000000002.ARC
ORA-00280: change 488461 for thread 1 is in sequence #2
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/opt/oracle/admin/openview/arch/T0001S0000000002.ARC
ORA-00308: cannot open archived log
'/opt/oracle/admin/openview/arch/T0001S0000000002.ARC'
ORA-27037: unable to obtain file status
HP-UX Error: 2: No such file or directory
Additional information: 3
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.
由于数据库是abort方式down的,因此T0001S0000000002.ARC没有正常归档,系统不存在这个日志文件。所以,选择cancel方式取消恢复。
8. 恢复完成后,需要以resetlogs方式打开数据库。
SQL> ALTER DATABASE OPEN RESETLOGS;
总结:由于控制文件丢失时,系统丢失所有的关键信息,归档日志号也需要重新计数,因此最好做一个全库备份。
1.1. 本文的目的
为了模拟测试oracle热备份的各种恢复情况,同时给以后工程人员一些实施借鉴,特地整理了本文档,在其中记录各种恢复的情况,以方便恢复时使用。
1.2. 系统概况
系统环境:hp unix11 oracle 9201
数据情况:一个系统文件、3个联机日志、一个回滚段表空、一个undo表空间、其他的数据文件,数据库当前使用undo。
备份方式:热备份
备份文件:数据文件、归档日志、控制文件、初始化文件。
2. 恢复情况介绍
2.1. 模拟回滚表空间损坏丢失
当初设计时系统就同时并存了两种回滚段管理模式,目的就是当其中的一个出现问题的话,就可以立刻恢复。Undo与8i时回滚段比,它的优势是自动管理回滚段,简化了管理工作。
下面介绍回滚表空间数据文件损坏时的恢复方式:
假设在undo表空间数据文件损坏时拥有所有的备份,系统存在回滚段表空间。
在数据库运行状态下删除undo表空间数据文件。
此时如果向数据库中写入数据,会出现如下错误:
SQL> exec sp_insert_del;
BEGIN sp_insert_del; END;
*
ERROR at line 1:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/opt/oradata/openview/RBS2_1.dbf'
ORA-27041: unable to open file
HP-UX Error: 2: No such file or directory
Additional information: 3
ORA-06512: at "DBBACKUP.SP_INSERT_DEL", line 9
ORA-06512: at line 1
此时需要作的是修改数据库初始化参数,将他修改成为使用rollback_segment,同时将数据库加载,
SQL>startup mount pfile='/opt/oracle/admin/openview/initopenview.ora'
然后删除回滚表空间的数据文件
SQL>alter database defile 4 offline off;
SQL>alter database open;
但是数据库启动后,察看如下信息,发现有大量属于回滚表空间的回滚段
SQL>select * from dba_rollback_segs;
此时如果想恢复原来的回滚表空间,需要修改初始化文件,在其中加入隐含参数_CORRUPTED_ROLLBACK_SEGMENTS,在其中加入回滚表空间的回滚段后,重新启动数据库,然后删除回滚表空间
SQL>drop tablespace undo2 INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
重新创建回滚表空间后,修改初始化参数后,然后重新启动数据库即可。
总结:当回滚表空间发生损坏时,需要将系统重新启动,这是必须的,对于24小时系统来说,这无疑是极为不利的一种情况,在这种情况下,需要的是双机热备的系统来保证系统24小时不间断运行。当出现系统崩溃的情况时,毫无疑问,需要备份机立即切换来保证系统运行,然后及时恢复生产系统。
2.2. 模拟非系统数据文件丢失
当非系统数据文件损坏时,有三种恢复方式,一种是拥有数据文件备份、归档日志备份以及其他的相关文件,此时可以做到的是完全的恢复;一种是有数据文件备份,但是归档日志不全;一种是没有数据文件备份,此时就需要将系统down下,然后恢复。
下面介绍第一种情况的恢复:
在数据库运行状态下删除数据文件,如果此时系统没有down机,那么采用以下方式恢复
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' offline;
Database altered.
将备份文件拷贝回来,将数据文件online,提示需要恢复数据文件。
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online;
alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online
*
ERROR at line 1:
ORA-01113: file 19 needs media recovery
ORA-01110: data file 19: '/opt/oradata/openview/ts_iptool_1.dbf'
执行媒体恢复,可以将数据文件online,由于有所有的归档日志和联机日志都存在,因此没有数据丢失。
SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf';
Media recovery complete.
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online;
Database altered.
总结:在数据库运行状态下,如果有数据文件损坏不能读取时,数据库不至于down下,此时如果发现的话,在拥有所有备份和归档日志、联机日志的情况下,可以及时恢复。
当数据库已经宕下时,需要在数据加载时恢复,将数据文件拷贝到正确的位置后,恢复步骤如下:
SQL> startup mount
SQL> recover database;
SQL>alter database open;
总结:在这种情况下,对于24小时系统来说是一个损失,为了保证系统的正确运行,需要双机备份来保证系统的高可用性。
仅仅拥有数据文件和部分归档日志的恢复:
如果数据库处于打开状态时,先将数据文件offline
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' offline;
Database altered.
将备份文件拷贝回来,执行媒体恢复
SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;
选择auto,尽量多的实施归档日志。
然后再次执行以下语句,选择cancel,然后将数据文件online
SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;
Media recovery complete.
SQL> alter database datafile '/opt/oradata/openview/ts_iptool_1.dbf' online;
Database altered.
当数据库crash时,将
没有任何备份的恢复:备份文件拷贝回来,执行媒体恢复,
SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;
选择auto,尽量多的实施归档日志。
然后再次执行以下语句,选择cancel
SQL> recover datafile '/opt/oradata/openview/ts_iptool_1.dbf' until cancel;
Media recovery complete.
总结:将数据库打开后,最好作一个数据库全备份。
当系统没有备份时发生数据文件损坏的情况时,不可避免的会丢失数据,它的恢复比较简单,但是必须要将系统down下,将数据库启动到mount时,进行恢复。
SQL> startup mount
SQL> alter database datafile 6 offline drop;
SQL>alter database open;
此时在系统中还保留有丢失数据文件的字典信息,系统处于不一致状态。如果数据文件表空间的表remove到其他表空,可以将表空间删除重建,并将表再次move回来。
总结:这种情况下不可避免的会丢失数据,可能会丢失重要的数据文件,如果拥有备份,最多只能恢复到备份那一时刻的数据。
2.3. 模拟系统数据文件丢失
在数据库运行状态下删除系统数据文件,系统崩溃了,当拥有所有的备份时,系统是可以恢复的,恢复得步骤和2.2的第一种情况一样。
2.4. 模拟非当前联机日志文件丢失
如果丢失的联机日志不是当前的文件,那么他的恢复比较简单,只需要将日志清除即可。有两种情况,如果当联机日志已经归档,在数据库打开状态下删除不活动的联机日志时,可以用以下方式恢复。
SQL> alter database clear logfile group groupnumber;
或者在数据库加载时运行以上sql,系统会自动生成一个日志文件。
下面是一个恢复的例子:
SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- ---------- --- ----------------
4 209715200 YES INACTIVE
5 209715200 YES INACTIVE
6 209715200 NO CURRENT
SQL> !
$ mv log4.log log.log
$ exit
SQL> alter system switch logfile;
alter system switch logfile
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
当删除一个非当前的日志文件后系统切换到此文件时,不能读取次文件时,系统crash.将系统重新启动,发现系统不能打开。此时数据库处于mount状态
SQL> startup
ORACLE instance started.
Total System Global Area 267479512 bytes
Fixed Size 735704 bytes
Variable Size 184549376 bytes
Database Buffers 81920000 bytes
Redo Buffers 274432 bytes
Database mounted.
ORA-00313: open failed for members of log group 4 of thread 1
ORA-00312: online log 4 thread 1: '/opt/oradata/openview/log4.log'
修改数据库,清除归档的日志,然后将数据库打开。
SQL> alter database clear logfile group 4;
Database altered.
SQL> alter database open;
Database altered.
察看联机日志文件
SQL> !
$ ls *.log
log4.log log5.log log6.log
察看日志文件,发现日志组4 已经可以使用。
SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- ---------- ----------------
4 209715200 NO CURRENT
5 209715200 YES INACTIVE
6 209715200 YES INACTIVE
假如在丢失已归档的联机日志时能够及时发现,那么就可以在数据库打开状态下清除日志,自动生成一个日志文件,保证数据库正常运行。
$ rm log6.log
$ exit
SQL> alter database clear logfile group 6;
Database altered.
$ ls log*.*
log4.log log5.log log6.log
总结:在恢复完成后,由于有一个日志文件没有归档,因此需要立即进行数据库全备份。
2.5. 模拟当前联机日志文件丢失
如果丢失的联机日志是当前的日志文件,如果数据库以及crash,那么需要在mount下进行恢复,恢复步骤也比较复杂。可以通过以下命令来恢复.
SQL>recover database until cancel;
恢复完成后还需要重新设置log来打开数据库.
如果数据库还处于打开状态,那么恢复比较简单,只要执行以下语句就可以恢复
SQL> alter database clear unarchived logfile group groupnumber;
以下举例说明在数据打开状态下,恢复需要执行的步骤。
SQL> !
$ ls log*.log
log4.log log5.log log6.log
$ mv log4.log log.log
$ exit
SQL> create table iptpa_test1 (n1 date) tablespace ts_iptool;
Table created.
SQL> insert into iptpa_test1 select sysdate from dual;
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
从数据字典中可以看出日志4处于未归档状态,但是此时它已经被删除了。
SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- ---------- ----------------
4 209715200 NO ACTIVE
5 209715200 YES INACTIVE
6 209715200 NO CURRENT
重新切换日志,到日志4
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
此时由于找不到日志组4 系统处于悬挂状态。因为此时数据库处于打开状态,可以执行以下命令进行日志清除并重建。
SQL> alter database clear unarchived logfile group 4;
Database altered.
$ ls log*.*
log4.log log5.log log6.log
$exit
此时日志组4的序号是0,日志会在循环到大于系统当前最大的SEQUENCE#才会被使用。
SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
4 0 YES UNUSED
5 7 NO CURRENT
6 6 YES INACTIVE
总结:我们知道数据库应该归档的日志没有归档后,需要做的第一件事就是做一个数据库的全备份。
当数据库以及crash,需要恢复的步骤如下:
$ mv log6.log log.bak
$ exit
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 267479512 bytes
Fixed Size 735704 bytes
Variable Size 184549376 bytes
Database Buffers 81920000 bytes
Redo Buffers 274432 bytes
Database mounted.
ORA-00313: open failed for members of log group 6 of thread 1
ORA-00312: online log 6 thread 1: '/opt/oradata/openview/log6.log'
SQL> select GROUP#, SEQUENCE#, ARCHIVED,STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
4 8 YES INACTIVE
5 7 YES INACTIVE
6 9 NO CURRENT
此时数据库处于mount状态,日志组6处于当前状态,执行清除未归档日志时会出现如下错误。
SQL> alter database clear unarchived logfile group 6;
alter database clear unarchived logfile group 6
*
ERROR at line 1:
ORA-00313: open failed for members of log group 6 of thread 1
ORA-00312: online log 6 thread 1: '/opt/oradata/openview/log6.log'
ORA-27037: unable to obtain file status
HP-UX Error: 2: No such file or directory
Additional information: 3
此时需要执行以下语句恢复数据库,在恢复时为了尽量多的使用归档日志恢复,先选择auto,最后才使用cancel选项。
SQL> recover database until cancel;
Media recovery complete.
SQL> alter database open resetlogs;
Database altered.
SQL> ho ls log*.log
log4.log log5.log log6.log
此时系统已经重新生成了日志,但是由于是以resetlogs方式打开的数据库,因此最好进行一下数据库的全备份。
总结:当丢失当前联机日志文件后,肯定会丢失数据,同时丢失归档日志,为了保证恢复的准确性,最好完成恢复后做一个数据库的全备份。
2.6. 模拟控制文件丢失
一般来说一个系统控制文件都有3个一样的互为备份的控制文件。如果仅仅是一个控制文件损坏或者丢失,可以将控制文件拷贝即可。但是由于现在的系统大多上都只有一个硬盘,因此当硬盘坏了的话,控制文件肯定就丢失了。现在就讨论如果控制文件全部丢失时如何恢复系统。
如果有备份的控制文件,注意,必须是使用以下语句生成的:
alter database BACKUP CONTROLFILE TO TRACE as 'crontrolfile.txt' reuse RESETLOGS ;
红色字体是可以备份的控制文件的路径和名称,最好写上绝对路径。
生成的控制文件,事实上是一组sql语句,功能是将数据库启动到nomount下,然后创建控制文件,然后将数据库加载,然后使用备份文件恢复,最后再将数据库以resetlogs方式打开,不过这个文件的注释是shell的注释,需要修改。以下是我做的一个例子。
1. 备份控制文件
alter database BACKUP CONTROLFILE TO TRACE as '/opt/oradata/openview/cf.txt' reuse RESETLOGS ;
2. 删除控制文件
rm control01.ctl control02.ctl control03.ctl
3. 当数据库的控制文件全部丢失时,是必须用shutdown abort将数据库down下来
SQL> shutdown immeidate
SP2-0717: illegal SHUTDOWN option
SQL> shutdown immediate
ORA-00210: cannot open the specified controlfile
ORA-00202: controlfile: '/opt/oradata/openview/control01.ctl'
ORA-27041: unable to open file
HP-UX Error: 2: No such file or directory
Additional information: 3
SQL> shutdown abort
ORACLE instance shut down.
4. 使用sqlplus "/as sysdba"连接到数据库
5. 将数据库启动到nomount下
SQL> startup nomount
ORACLE instance started.
Total System Global Area 267479512 bytes
Fixed Size 735704 bytes
Variable Size 184549376 bytes
Database Buffers 81920000 bytes
Redo Buffers 274432 bytes
6. 创建控制文件,完成后数据库已经处于mount状态
SQL> CREATE CONTROLFILE REUSE DATABASE "OPENVIEW" RESETLOGS ARCHIVELOG
MAXLOGFILES 128
MAXLOGMEMBERS 5
MAXDATAFILES 500
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 '/opt/oradata/openview/redo01.log' SIZE 20M,
GROUP 2 '/opt/oradata/openview/redo02.log' SIZE 20M,
GROUP 3 '/opt/oradata/openview/redo03.log' SIZE 20M
DATAFILE
'/opt/oradata/openview/system_1.dbf',
'/opt/oradata/openview/temp_1.dbf',
'/opt/oradata/openview/RBS1_1.dbf',
'/opt/oradata/openview/tools_1.dbf',
'/opt/oradata/openview/OV_DATA.dbf',
'/opt/oradata/openview/OV_INDEX.dbf',
'/opt/oradata/openview/OPC_1_1.dbf',
'/opt/oradata/openview/OPC_2_1.dbf',
'/opt/oradata/openview/OPC_3_1.dbf',
'/opt/oradata/openview/OPC_4_1.dbf',
'/opt/oradata/openview/OPC_5_1.dbf',
'/opt/oradata/openview/OPC_6_1.dbf',
'/opt/oradata/openview/OPC_7_1.dbf',
'/opt/oradata/openview/OPC_8_1.dbf',
'/opt/oradata/openview/OPC_9_1.dbf',
'/opt/oradata/openview/OPC_10_1.dbf',
'/opt/oradata/openview/OPC_INDEX1_1.dbf',
'/opt/oradata/openview/OPC_INDEX2_1.dbf',
'/opt/oradata/openview/OPC_INDEX3_1.dbf',
'/opt/oradata/openview/TS_CM_1.dbf',
'/opt/oradata/openview/TS_CM_IND_1.dbf',
'/opt/oradata/openview/TS_PM_1.dbf',
'/opt/oradata/openview/TS_PM_IND_1.dbf',
'/opt/oradata/openview/TS_PMTMP_1.dbf',
'/opt/oradata/openview/TS_TOOL_1.dbf',
'/opt/oradata/openview/TS_SM_1.dbf',
'/opt/oradata/openview/TS_FM_PT1_1.dbf',
'/opt/oradata/openview/TS_FM_PT2_1.dbf',
'/opt/oradata/openview/TS_FM_PT3_1.dbf',
'/opt/oradata/openview/TS_FM_1.dbf',
'/opt/oradata/openview/TS_FM_IND_1.dbf',
'/opt/oradata/openview/boss_test_ts_1.dbf',
'/opt/oradata/openview/boss_ipnms_ts_1.dbf',
'/opt/oradata/openview/sddb_data.dbf',
'/opt/oradata/openview/sddb_index.dbf',
'/opt/oradata/openview/sddb_temp.dbf'
CHARACTER SET ZHS16CGB231280;
7. 执行数据库恢复
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
ORA-00279: change 488461 generated at 12/23/2005 08:11:35 needed for thread 1
ORA-00289: suggestion : /opt/oracle/admin/openview/arch/T0001S0000000002.ARC
ORA-00280: change 488461 for thread 1 is in sequence #2
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/opt/oracle/admin/openview/arch/T0001S0000000002.ARC
ORA-00308: cannot open archived log
'/opt/oracle/admin/openview/arch/T0001S0000000002.ARC'
ORA-27037: unable to obtain file status
HP-UX Error: 2: No such file or directory
Additional information: 3
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.
由于数据库是abort方式down的,因此T0001S0000000002.ARC没有正常归档,系统不存在这个日志文件。所以,选择cancel方式取消恢复。
8. 恢复完成后,需要以resetlogs方式打开数据库。
SQL> ALTER DATABASE OPEN RESETLOGS;
总结:由于控制文件丢失时,系统丢失所有的关键信息,归档日志号也需要重新计数,因此最好做一个全库备份。
发表评论
-
oracle 命令
2009-02-05 20:30 933一、ORACLE的启动和关闭 ... -
通过dbms_flashback找回误删除的数据收藏
2009-01-21 11:35 1316在使用DBMS_FLASHBACK时要首先注意以下几个事项: ... -
优化Oracle数据库性能收藏
2009-01-21 11:35 827优化策略 为了保 ... -
Oracle Start With Connect By
2009-01-21 11:33 1527Start With Connect By 是用来实现在一个 ... -
Oracle 表空间操作收藏
2009-01-21 11:32 968创建表空间: 1、递增 ... -
移动数据文件收藏
2009-01-21 11:32 689移动数据文件: 1、首先使要移动数据文件的表空间离线. ... -
Oracle 死锁会话处理收藏
2009-01-21 11:31 1089--查询所有的死锁: SELECT * FROM V$LOCK ... -
Oracle 9i 打开autotrace on 查看执行计划收藏
2009-01-21 11:31 12881.创建表,通过utlxplan脚本 SQL> @? ... -
如何启用sqlplus的AutoTrace功能收藏
2009-01-21 11:31 806通过以下方法可以把Autotrace的权限授予Everyone ... -
user和schema的区别:
2009-01-21 11:30 967说穿了其实user是控制权限的,而schema是个容器,非所有 ... -
解决Oracle数据文件和日志文件丢失的问题收藏
2009-01-21 11:29 2031今天不小心误删除了数据库的数据文件和日志文件,在启动数据库时报 ... -
Oracle表段中的高水位线HWM收藏
2009-01-21 11:28 2553在Oracle数据的存储中, ... -
深入了解oracle的高水位(HWM)收藏
2009-01-21 11:26 2234说到HWM,我们首先要简要的谈谈ORACLE的逻辑存储管理.我 ... -
ORACLE 日志文件相关查询收藏
2009-01-21 11:25 11531.查询系统使用的是哪一组日志文件: select * fro ... -
(转)windows命令行下启动oracle
2009-01-21 09:56 1463--总结启动命令如下: lsnrctl [start|stop ... -
小议分析函数中排序对结果的影响(一)
2009-01-12 13:24 830分析函数中经常会包括O ... -
ORACLE10g新特性——全局HASH分区索引
2009-01-12 13:23 1703在10g以前,Oracle的全局索引分区方法只有一种,即范围分 ... -
深入认识Oracle Supplemental logging
2008-12-22 18:35 3105对于有过逻辑standby,streams搭建体验的朋友,肯定 ... -
深入分析Oracle数据库日志文件
2008-12-22 15:19 951深入分析Oracle数据库日志文件 作者:程永新 发文时间: ... -
oracle 介绍
2008-09-20 21:04 1093第二章 架构 ORACLE架构由3部分组成: 文件, 内存结 ...
相关推荐
ORACLE热备份恢复手册 为了模拟测试oracle热备份的各种恢复情况,同时给以后工程人员一些实施借鉴,记录各种恢复的情况;
Oracle数据库备份与恢复操作手册,主要介绍oracle数据库冷备份和恢复,热备份和恢复以及rman备份和恢复.
Oracle 8i 备份恢复手册
为了模拟测试oracle热备份的各种恢复情况,同时给以后工程人员一些实施借鉴,特地整理了本文档,在其中记录各种恢复的情况,以方便恢复时使用。
Oracle 12c备份恢复-RMAN工具技术手册
Oracle 12c 数据库备份和恢复概述.pdf Oracle 12c 用户管理的备份和恢复.pdf Oracle 12c SCN详解.pdf Oracle 12c RMAN备份与恢复数据库.pdf Oracle 12c EXPDP和IMPDP指令详解.pdf Oracle 12c EXP和IMP指令详解.pdf
oracle恢复与备份的基础实例讲解。 用户管理的备份和恢复 rman管理的备份与恢复
Oracle 备份与恢复Oracle 备份与恢复Oracle 备份与恢复Oracle 备份与恢复Oracle 备份与恢复Oracle 备份与恢复Oracle 备份与恢复Oracle 备份与恢复
Oracle 11g 备份与恢复最佳手册
oracle热备份原理分析介绍了备份的基本理论及在备份进行时的详细说明以及介绍了备份的几种方式。
Oracle 19c 备份恢复-导入导出
HP小机oracle数据库备份恢复手册v0.3
ORACLE经典备份手册,通过该手册能很好的掌握Oracle备份和恢复的方式方法
Oracle数据库热备份脚本, 可以备份dbf, ora, ctl文件. bat批处理文件, 适用于windows系统, oracle11g测试有效.
oracle备份和恢复方案
oracle RMAN 备份恢复总结 oracle RMAN 备份恢复总结 oracle RMAN 备份恢复总结
所以,如果你有昨天夜里的一个冷备份而且又有今天的热备份文件,在发生问题时,就可以利用这些资料恢复更多的信息。热备份要求数据库在Archivelog方式下操作,并需要大量的档案空间。一旦数据库运行在archivelog状态...
Oracle备份和恢复实例Oracle备份和恢复实例Oracle备份和恢复实例Oracle备份和恢复实例
1、制作日志镜像,以备还原 2、control_files加镜像 3、冷备份(数据会丢失,目录结构也需相同) 4、热备份(前提,开启日志模式)
oracle 的备份和 冷备份 热备份, 数据库