Oracle 故障恢复

Download Report

Transcript Oracle 故障恢复

Oracle 故障恢复
故障恢复策略
• 确定影响恢复的因素
•数据库的大小
•系统的复杂性
•数据库结构
•应用结构(对数据库恢复影响最大)
• 缩短平均恢复时间的方法
•缩小所需要恢复的成员的大小
•使用ORACLE表分区和索引分区技术
•保证最新的备份能够被尽快获得
•经常性测试备份的拷贝以保证备份的可用性
•保证你熟悉各种各样的恢复手段,可以将经验性的技术用脚本记录下来
•合理地设计易于维护的数据库对象
各种故障恢复策略的比较
技术
用法
优点
缺点
Export,Import,
SQL*Loader
用Export/ Import
速度快
实施难度大,很难确
定数据的关系
硬件冗余备份
使用备份节点
数据丢失少
昂贵
备用数据库
用主数据库的REDO
LOG更新备用数据库
快速恢复,可恢复故
障
数据可能丢失,设置
和维护复杂
数据库对称复制
使用ORACLE的复制
功能
OPS
三倍镜像
无数据丢失,可恢复, 系统开销比较大,为
两个数据库可以同时 了保持数据的一致性
使用
所进行的恢复缓慢
使 用 CLUSTER 技 术 , 可快速恢复,负载均 性能调整十分困难,
存活的节点接管失败 衡
应用设计的好坏确定
节点
了系统性能的好坏
三倍读写开销
采用三套硬件进行镜 快速备份快速恢复
像
EMC SRDF 工具
物理I/O备份
快速同步备份,恢复
迅速,无数据丢失
存在数据库复制冲突
的可能
客户化的存储转发
使 用 O8 的 功 能 : 高
级对列或基于触发器
的复制
无数据丢失,恢复快
速
复杂,开销大
故障恢复的步骤
•
发现故障
•
分析故障
•
查找需要恢复的部件
•
分析需要恢复的部件的关联性
•
确定恢复策略
•
从备份环境恢复系统
•
重演REDO LOG,使系统恢复到最新的点
•
检查
分析故障,确定恢复方法
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
alert log是否有报警
是否生成了traces
是否使用OPS
是否进行了恢复尝试,如果做了,做了哪些步骤
确定备份策略
如果你做了冷备份,冷备份的时候数据库是如何关闭的
是否使用归档日志
归档日志是否完整
在线日志是否有镜像
控制文件是否有镜像
是否有最近的全EXPORT
数据库故障的时候有什么非常规的工作正在做
能够启动INSTANCE吗
能不能MOUNT、OPEN数据库
数据库大小是多少
是否使用裸设备
有多少个回滚段
数据库文件故障的恢复(1)
•
•
故障ORA-1157, ORA-1110 ,或ORA-1116,ORA-1110
从冷备份恢复(采用NOARCHIVELOG方式 )
•
•
•
•
•
•
•
•
关闭数据库
恢复冷备份的文件
重新启动数据库
执行下列脚本,确认所有的REDO LOG文件的各自的流水号和FCN
(first change numbers)
SELECT X.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#
FROM V$LOG X, V$LOGILE Y WHERE X.GROUP# = Y.GROUP#;
查找要恢复文件的CHANGE#
SELECT FILE#, CHANGE#FROM V$RECOVER_FILE;
如果CHANGE#大于最小的REDO LOG FIRST_CHANGE# ,那么这个文件是可
以恢复的
用ONLINE REDO LOG恢复数据文件
RECOVER DATAFILE 'fullpath of the datafile'
打开数据库
ALTER DATABASE OPEN ;
数据库文件故障的恢复(2)
•
从热备份恢复(使用ARCHIVELOG 模式)
•
•
•
•
•
•
•
•
•
关闭数据库
恢复冷备份的文件
重新启动数据库
执行下列脚本,确认所有的REDO LOG文件的各自的流水号和FCN
(first change numbers)
SELECT X.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#
FROM V$LOG X, V$LOGILE Y WHERE X.GROUP# = Y.GROUP#;
确认所有的日志都完备,如果日志缺少,参见后面的处理方法
查找要恢复文件的CHANGE#
SELECT FILE#, CHANGE#FROM V$RECOVER_FILE;
如果CHANGE#大于最小的REDO LOG FIRST_CHANGE# ,那么这个文件是可
以恢复的
用ONLINE REDO LOG恢复数据文件
RECOVER DATAFILE 'fullpath of the datafile'
打开数据库
ALTER DATABASE OPEN ;
数据库文件故障的恢复(3)
•
有REDO LOG文件丢失或毁坏的情况下恢复(此时数据已经丢失,
需要通过移动的方法进行重建)
•
•
•
4.
5.
•
关闭数据库
MOUNT数据库Svrmgrl> Startup mount
Offline drop 数据文件:
Svrmgrl> ALTER DATABASE DATAFILE 'fullpath of datafile'
OFFLINE DROP;
打开数据库
Svrmgrl> ALTER DATABASE OPEN;
删除用户表空间
Svrmgrl> DROP TABLESPACE tablespace_name
INCLUDING
CONTENTS;
重新创建表空间等
数据库文件故障的恢复(4)
•
RBS文件故障(1)数据库正常关闭情况下的恢复
在 INITSID.ORA文件中,封掉和故障文件相关的
ROLLBACK_SEGMENTS ROLLBACK_SEGMENTS
2. 在限制方式下启动数据库
Svrmgrl> STARTUP RESTRICT MOUNT
3. 删除故障文件
Svrmgrl> ALTER DATABASE DATAFILE 'fullpath of datafile' FFLINE DROP;
4. 打开数据库:
Svrmgrl> ALTER DATABASE OPEN
如果正确执行上述语句,跳到第七步,否则继续
5. 如果第四步出错,执行下面的操作
o
在配置文件中添加:
_Corrupted_rollback_segments = (rollback1,rollback2,...,rollbackN) ,重新执行
Svrmgrl> startup restrict mount
6. 删除故障文件所包含的TABLESPACE:
Svrmgrl> drop tablespace tablespace_name including contents;
7. 重新创建TABLESPACE
8. 改变数据库状态
Svrmgrl> alter system disable restricted session;
9. 恢复配置文件
10. 重新启动数据库
1.
数据库文件故障的恢复(5)
•
RBS文件故障(2)数据库非关闭情况下的恢复:由于在RBS中有一些
未完成的交易,因此无法删除表空间和数据文件
1. 恢复数据文件(从备份系统中)
2. Mount 数据库
3. 查看文件是否OFFLINE
Svrmgrl> SELECT FILE#, NAME, STATUS FROM V$DATAFILE;
4. 如果OFFLINE,使之在线
Svrmgrl> ALTER DATABASE DATAFILE 'full path of datafile' ONLINE;
5. 确认能否从日志中恢复
• SELECT X.GROUP#, MEMBER, SEQUENCE#,
FIRST_CHANGE#FROM V$LOG X, V$LOGILE YWHERE
X.GROUP# = Y.GROUP#;
6. 如果无法恢复,有两个选择
• 从一个全备份恢复(这样会丢失数据)
• 启动这个不一致的数据库,然后REBUILD(方法如下)
1.
2.
3.
关闭数据库
备份数据库(以防万一)
修改参数文件
o 添加:
_allow_resetlogs_corruption = true
_corrupted_rollback_segments = list of all rollback segments
封掉原有的ROLLBACK_SEGMENT
4.
5.
Startup Mount
进行一次不完整的数据库恢复
6.
7.
取消恢复
重置日志文件
8.
进行一次EXPORT/IMPORT操作
Svrmgrl> RECOVER DATABASE UNTIL CANCEL;
Svrmgrl> ALTER DATABASE OPEN RESETLOGS;
数据库文件故障的恢复(6)
RBS文件故障(3)数据库还在运行
• Offline 相关的ROLLBACK_SEGMENT
ALTER ROLLBACK SEGMENT rollback_segment OFFLINE;
• 确认所有的相关ROLLBACK_SEGMENT已经离线:
SELECT SEGMENT_NAME, STATUSFROM
DBA_ROLLBACK_SEGSWHERE TABLESPACE_NAME =
'tablespace_name';
3. 删除所有的OFFLINE后的 rollback segments
DROP ROLLBACK SEGMENT rollback_segment;
4. 如果有些ROLLBACK_SEGMENT无法删除,说明还有交易没有完成:
SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS
FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS
WHERE TABLESPACE_NAME = 'I' ANDSEGMENT_ID = USN;
如果没有记录,所有的RBS已经 offline.如果有 PENDING OFFLINE的记
录, 查找ACTIVE_TX 列. 值为 0 说明即将OFFLINE; 非0表示有没有提
交或回退的交易,找出没有退出的SESSION,杀死这个SESSION:
ALTER SYSTEM KILL SESSION ‘XXX’;
数据库文件故障的恢复(7)
SYSTEM 表空间故障
•
•
•
如果有冷备份可以恢复系统,恢复冷备份
如果日志完整,可以恢复(参见前面恢复数据文件)
如果日志不完整,无法恢复,只能重建数据库
数据库文件故障的恢复(8)
CONTROL文件故障(1)从MIRROR文件恢复
1.
2.
3.
4.
5.
6.
关闭数据库
查找故障原因
非硬件故障,从MIRROR拷贝一个文件过来,然后跳到6
如果硬件故障,重新选择一个安全的卷,拷贝一个MIRROR文件
修改参数文件的CONTROL文件部分,修改文件的路径
启动数据库
数据库文件故障的恢复(9)
CONTROL文件故障(1)无镜像文件
1.
2.
3.
4.
5.
6.
7.
8.
如果没有镜像文件,恢复将十分复杂,是否有一个能够反映目前数据库
结构的TRC文件,也可以恢复;如果没有TRC文件,但数据库还可以
MOUNT,可以按照下列步骤恢复:
关闭数据库
Startup Mount
alter database backup controlfile to trace;
修改生成的TRC文件(删除头上的1-21行),另存为CreCtr.sql
关闭数据库(NORMAL)
进行一个完整的冷备份(防止意外发生)
START MOUNT
@CreCtr.sql生成CONTROL FILE
在极端的情况下,有一个可能可以成功的方法(取决于归档日志是否完
整),创建一个CONTROL文件,使用系统缺省的参数,然后进行数据
库恢复
数据库文件故障的恢复(10)
ONLINE Redo Log故障(1) 有MIRROR文件
1.
2.
3.
关闭数据库
查找故障原因
从MIRROR中修复毁坏的文件
数据库文件故障的恢复(11)
ONLINE Redo Log故障(1) 无MIRROR文件
1.
2.
3.
o
o
4.
5.
6.
7.
8.
关闭数据库
进行备份
修改参数文件
添加下面的行
_allow_resetlogs_corruption = true _corrupted_rollback_segments =
of all rollback segments
将ROLLBACK_SEGMENT行注释掉
Startup Mount
RECOVER DATABASE UNTIL CANCEL;
如果提示需要文件,取消
ALTER DATABASE OPEN RESETLOGS;
进行EXPORT/IMPORT重新BUILD数据库
list