(四)、回滚表空间 有两种情况: 1、数据库已经完全关闭(使用shutdown immediate或shutdown命令) 1) 确认数据库完全关闭 2) 修改init.ora文件,注释"rollback-segment" 3) svrmgrl> startup restrict mount 4) svrmgrl> alter database datafile filename offline drop; 5) svrmgrl> alter database open; 基于出现的结果:"statement processed" 转(7);"ORA-00604,ORA-00376,ORA-01110"转(6) 6) svrmgrl> shutdown immediate 修改init.ora文件,增加如下一行:_corrupted_rollback_segments = (<roll1>,...<rolln>) svrmgrl> startup restrict 7) svrmgrl> drop tablespace tablespace_name including contents; 8) 重建表空间及回滚段 9) svrmgrl> alter system disable restricted session; 10) 修改init.ora文件 2、数据库未完全关闭(数据库崩溃或使用shutdown abort命令关闭数据库) 1) 恢复备份 2) svrmgrl> startup mount 3) svrmgrl> select file#,name,status from v$datafile; svrmgrl> alter database datafile filename online; 4) svrmgrl> select v1.group#,member,sequence#,first_change# from v$log v1,v$logfile v2 where v1.group#=v2.group#; 5) svrmgrl> select file#,change# from v$recover_file; #参见方案2-4 6) svrmgrl> recover datafile filename; 7) svrmgrl> alter database open; 3、数据库处于打开状态 1) 删除回滚段和表空间 2) 重建表空间和回滚段 (五)、控制文件恢复 1.所有的控制文件均被破坏 将备份的控制文件拷贝至原目录下,对于RAW DEVICE(裸设备),则:dd if='con.bak' of='/dev/rdrd/drd1' seek=128 2.并非所有的控制文件均被破坏,用其他的控制文件启动数据库 (六)、数据块及其中数据的挽救 现象:执行ORACLE操作时出现ORA-01578错误 分析:ORA-1578错误是当ORACLE认为一个数据块可能被破坏而发生的,通常引起该错误的原因有以下几种: I/O的硬件或firmware损坏 操作系统I/O或cache故障 内存或页交换出错 部分数据文件被覆盖 试图访问未格式化块 磁盘修复 其他原因 解决步骤: 查看log以及trace文件,检查是否有其他错误发生 定位错误: sql>select * from v$datafile where file#=<F>; sql>select owner,segment_name,segment_type from dba_extents where file_id=<F> and <B> between block_id and block_id+blocks-1; 基于返回的segment_type: segment类型为temporary或cache或无返回值,检查SQL语句是否正确。 segment类型为rollback segment,则数据块需要恢复。 segment类型为index,检查其所在的表。重建索引即可。 sql> select owner,table_name from dba_tables where cluster_name = name_of_segment 仍然出现1578错误,数据库需要恢复。 segment类型为表,拯救表中的数据。 分析一个实体是否有永久性数据破坏 sql> analyze table table.name validate structure cascade; sql> analyze table clustername validate structure cascade; 硬件错误的恢复 数据库运行在ARCHIVE模式下 OFFLINE相应的数据文件 拷贝备份的数据文件 rename the datafile to new location recover the datafile using archive log online数据文件 数据库运行在非ARCHIVE模式下 OFFLINE相应数据文件 拷贝备份的数据文件,rename the datafile and online it 拯救表中数据 例如:sql>select * from bigemp; ERROR:ORA-01578: ORACLE DATA block corrupted (file#8,block#8147) ORA-00110: data file 8: ‘/oracle/usr714.dbf’ … … corrupt file id : 8=8(hex) corrupt block id : 8147=1fd3(hex) first rowid in the corrupt block: 0000.1fd3.0000.0008 last rowid in the corrupt block: 0000.1fd2.7fff.0008 first rowid affer this block: 0000.1fd4.0000.0008 sql > create table temp as select * from bigemp where 1=2; sql > insert into temp select * from bigemp /*+rowid(bigemp) */ where rowid >=’0000.1fd4.0000.0008’; sql > insert into temp select * from bigemp where rowid <=’0000.1fd2.7fff.0008’; 在ORACLE 7.1以前版本,rowid range scan不存在时,可以通过索引达到以上相同的目的。 四、后记 ORACLE的备份恢复技术可以说是博大精深,我所了解的只是很少的一部分,而且还不是很透彻,希望这几篇文章对大家能有所帮助,也欢迎大家将自己遇到的备份和恢复的问题告诉我,我将它整理起来,发表在这里,供所有有兴趣做的DBA朋友和数据管理员参考,也许您的举手之劳会拯救一个公司! 同时,我还要提醒所有的朋友,备份是非常、非常、非常、非常、非常、非常、非常、非常、非常。。。重要的,有条件的话一定要采用ARCHIVE模式,否则,可能出了问题,哭都哭不出来。 (责任编辑:admin) |